web-dev-qa-db-ja.com

Jenkins PipelineでのMavenリリースプラグインの使用

Jenkins Pipelineを使用して、Javaアプリを自動的にビルドおよびデプロイします。ArtifactoryへのMavenデプロイを実行するためにmaven-release-pluginも使用します。

問題は私のJenkinsfile(またはJenkins Pipeline Configuration)です:

  1. リリースブランチでバージョン0.1.00-SNAPSHOTをコミットします
  2. Jenkins Pipelineがコードを取得し、Mavenリリースを実行します
  3. Mavenリリースはバージョンを0.1.00に変更します
  4. MavenリリースはGITブランチにタグを付け、アーティファクトをコミットおよびデプロイします
  5. Mavenリリースはバージョンを0.2.00-SNAPSHOTに変更してコミットします
  6. Jenkins PipelineはGITの変更を検出し、新しいビルドをトリガーします

有用なコミットがない場合でも、最後のステップで無限ループが作成されることを理解しました。

これが私のJenkinsfileの興味深い部分です。

sshagent([git_credential]) {
    sh "${maven_bin} --settings ${maven_settings} -DreleaseVersion=${release_version} -DdevelopmentVersion=${development_version} release:prepare release:perform -B"
}

ループを解除するにはどうすればよいですか(MavenがGITでコミットするときにJenkinsが新しいビルドをトリガーしないようにします)?

ありがとう

18
frinux

@ Daniel Omoto comment のおかげで、ジェンキンスがGITポーリングのオプションを提供していることがわかりました。 1つはまさに私が必要としたものです(そして提供された例はmaven-release-pluginのためです!):

GIT poll screenshot

8
frinux

Gitおよびpullリクエストの出現により、私はmaven-release-pluginまたはmaven-version-pluginをJenkinsパイプラインと共に使用することは良い考えではないと思います。

ここで説明したバージョン管理手法でMultibranch Pipelineを使用することは、継続的な配信に沿ったものです。 https://axelfontaine.com/blog/dead-burried.html

上記のバージョン管理手法を使用すると、pom.xmlは次のようになります。

<project>
    ...
    <version>${revision}</version>

    <properties>
        <!-- Sane default when no revision property is passed in from the commandline -->
        <revision>0-SNAPSHOT</revision>
    </properties>

    <scm>
        <connection>scm:git:your-git-repo-url</connection>
    </scm>

    <distributionManagement>
        <repository>
            <id>artifact-repository</id>
            <url>your-artifact-repo-url</url>
        </repository>
    </distributionManagement>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-scm-plugin</artifactId>
                <version>1.9.5</version>
                <configuration>
                   <tag>${project.artifactId}-${project.version}</tag>
                </configuration>
            </plugin>
        </plugins>
    </build>
    ...
</project>

Jenkinsfileを使用してMultibranch Pipelineを設定し、すべてのブランチ上でビルドしてマスターブランチからのみデプロイすることにより、Jenkinsサーバーでリリースを非常に簡単に作成できるようになりました。

pipeline {
  agent any
  environment {
    REVISION = "0.0.${env.BUILD_ID}"
  }
  triggers {
    pollSCM('')
  }
  options {
    disableConcurrentBuilds()
    buildDiscarder(logRotator(numToKeepStr: '30'))
  }
  tools {
    maven '3.5.2'
    jdk 'jdk8'
  }
  stages {
    stage ('Initialize') {
      steps {
        sh '''
          echo "PATH = ${PATH}"
          echo "M2_HOME = ${M2_HOME}"
        '''
      }
    }
    stage ('Build') {
      steps {
        sh 'mvn clean package'
      }
    }
    stage ('Deploy') {
      when {
        branch 'master'
      }
      steps {
        script {
          currentBuild.displayName = "${REVISION}"
        }
        sh 'mvn deploy scm:tag -Drevision=${REVISION}'
      }
    }
  }
} 

マルチブランチパイプラインの構成方法については、 https://jenkins.io/blog/2017/02/07/declarative-maven-project/#set-up を参照してください。

この手法を使用すると、非マスターブランチでのみ開発できます。次に、プルリクエストを作成して、変更をmasterブランチにマージします。これにより、成果物が自動的に成果物リポジトリーにデプロイされます。


補遺

上記の方法を使用してMavenリポジトリーに公開する場合、pom.xmlには適切なバージョンがありません。 Mavenに適切なバージョンを公開させるには、flatten-maven-pluginを使用します: http://www.mojohaus.org/flatten-maven-plugin/usage.html

また、チェックアウト: https://maven.Apache.org/maven-ci-friendly.html

15
Dennis Hoer

誰かがループで同じ問題を抱えている場合、または後続のビルドがトリガーされる場合に、リポジトリへのすべてのプッシュで(ポーリングの代わりに)jenkinsパイプラインを開始するトリガーがあります。

私がやったのは次のとおりです。最後のコミットのコメントに「[maven-release-plugin]」が含まれているかどうかを確認しました。

Jenkinsfileのコード:

def lastCommit = sh returnStdout: true, script: 'git log -1 --pretty=%B'

if (lastCommit.contains("[maven-release-plugin]")){
            sh "echo  Maven release detected"  //dont trigger build

        } else {
            sh "echo Last commit is not from maven release plugin" //do build steps 
            <..build Job...>
        }
7
Daniel Föhr

これが、パイプラインの第1段階として設定したものです。

stage('Check commit message') {
     when { changelog '.*\\[maven-release-plugin\\].*' }
     steps {
       script {
          pom = readMavenPom file: 'pom.xml'
          currentBuild.displayName = pom.version
          currentBuild.result = 'NOT_BUILT'
       }
       error('Skipping release build')
     }
}

https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/ プラグインをインストールして、maven pomを読み取るか、スキップされたビルドの説明を修正する必要があります。リリース後のビルドの色はグレーになります。

2
anydoby

解決策は、jenkinsの通知URLを呼び出している受信後フックを変更することです。

#!/bin/bash
git_log=$(git log --branches -1)
if ! [[ $git_log =~ .*maven-release-plugin.* ]] ;
then
curl http://buildserver:8080/git/notifyCommit?url=ssh://git@server:22/projects/Name.git;
fi
0
user2131878