2013-02-12 3 views
36

Ich verwende Travis-CI, um Continuous Integration Builds für einige Java-Open-Source-Projekte, an denen ich arbeite, bereitzustellen.Unterdrücken von GPG-Signaturen für Maven-basierte Continuous Integration-Builds (Travis CI)

Normalerweise funktioniert das reibungslos, aber ich habe ein Problem, wenn das POM GPG-Signierung angibt, z.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-gpg-plugin</artifactId> 
    <version>1.4</version> 
    <executions> 
    <execution> 
     <id>sign-artifacts</id> 
     <phase>verify</phase> 
     <goals> 
     <goal>sign</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 

Dies bewirkt, dass die Travis scheitern bauen - offenbar, weil es kein Passwort zur Verfügung hat, während mvn install läuft. Ein Beispiel finden Sie in this build.

Was ist der beste Weg, Maven und/oder Travis zu konfigurieren, GPG-Signaturen für CI-Test-Builds zu überspringen, aber trotzdem GPG-Signaturen durchzuführen, wenn ich einen korrekten Release-Build mache?

Antwort

20

Sie müssen ein Profil erstellen & stellen Sie sicher, dass Sie nur ausführen, wenn Sie den Release-Build erstellen.

die aktuelle Plugin entfernen, und es in einem Profil wie folgt hinzu:

<profiles> 
    <profile> 
     <id>release-sign-artifacts</id> 
     <activation> 
      <property> 
       <name>performRelease</name> 
       <value>true</value> 
      </property> 
     </activation> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-gpg-plugin</artifactId> 
        <version>1.4</version> 
        <executions> 
         <execution> 
          <id>sign-artifacts</id> 
          <phase>verify</phase> 
          <goals> 
           <goal>sign</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

Und dann, wenn Sie tatsächlich Release tun müssen, eine Immobilie zu Ihrem mvn Befehl hinzufügen:

mvn -DperformRelease=true ... 
+1

Angenommen, Sie verwenden das Release-Plugin: Anstatt eine Aktivierung über das Flag zu verwenden, können Sie dieses Profil einfach der 'ReleaseProfiles'-Plugin-Einstellung hinzufügen. – ankon

+0

Alternativ können Sie den Namen der Aktivierungseigenschaft '$ {env.TRAVIS}' mit dem Wert 'true' angeben. Dies liegt daran, dass Travis-CI-Container mit verschiedenen eingebauten Umgebungsvariablen (einschließlich zum Beispiel "TRAVIS = true" und "CI = true") hochgefahren werden und Maven sie über die Maven-Syntax für Umgebungsvariablen $ {env . } '. Dieser Ansatz hat den Vorteil, dass Sie nicht zu jedem Maven-Befehl eine Systemeigenschaft hinzufügen müssen, aber dennoch die Aktivierung des Profils vortäuschen und die automatische Aktivierung des Profils während der CI-Erstellung aktivieren können. –

73

Disable GPG Unterzeichnung durch die folgende Zeile in der .travis.yml Datei hinzufügen:

install: mvn install -DskipTests -Dgpg.skip 

E Beispiel: https://github.com/stefanbirkner/system-rules/blob/master/.travis.yml

+0

Ich bekam seltsame gpg-Fehler mit Maven und msysgit. Deine Antwort hat mir geholfen. Danke – friederbluemle

+4

Beachten Sie, dass das Hinzufügen von 'skipTests' für einen CI-Build möglicherweise nicht die beste Idee ist. – chrylis

+5

Im Allgemeinen hast du recht, aber nicht hier ;-) Siehe: http://docs.travis-ci.com/user/languages/java/ –

10

Ich fand einen etwas einfacheren Weg, es mit dem Profil zu tun, wie beschrieben above. Anstatt einen neuen Eigenschaftswert zu verwenden, können Sie die Eigenschaft gpg.passphrase verwenden, die beim Signieren trotzdem bereitgestellt werden muss. Der modifizierte Eigenschaft Abschnitt ist wie folgt:

<activation> 
    <property> 
     <name>gpg.passphrase</name> 
    </property> 
</activation> 

Hinweis, dass kein Wert ist erforderlich, da Sie dieses Profil aktiviert werden sollen, wenn ein beliebiger Wert für diese Eigenschaft festgelegt ist.

Die entsprechende Befehlszeile sieht dann wie folgt aus:

mvn <command> -Dgpg.passphrase=myverysupersecretpassphrase 

Sie können dies, indem Sie es die folgenden zwei Möglichkeiten testen:

mvn install 

Keine unterzeichnet Artefakte erzeugt werden, und:

mvn install -Dgpg.passphrase=myverysupersecretpassphrase 

Signierte Artefakte werden erstellt.

das tatsächliche zeichnetes Release des Artefakte zu tun wie folgt vor:

mvn release:perform -Darguments=-Dgpg.passphrase=myverysupersecretpassphrase 

Der Indirektionsoperator für die Trennwirkung benötigt wird, weil es nicht die Befehlszeilenargumente direkt an den erzeugten Prozess (siehe http://maven.apache.org/plugins/maven-gpg-plugin/usage.html ausbreitet).

+0

Ich empfehle dringend diesen Ansatz, wenn Sie eine Shell verwenden, die Befehlsverlauf speichert, da Sie wahrscheinlich nicht möchten, dass Ihr GPG-Passwort in Ihrer Datei "~/.bash_history" oder was auch immer schwebt. (FYI: Die einzige Shell, die ich in diesen Tagen kenne, die _noes_ nicht speichert, ist eine normale DOS-Eingabeaufforderung.) –