Jenkins Pipelineを使用して、Javaアプリを自動的にビルドおよびデプロイします。ArtifactoryへのMavenデプロイを実行するためにmaven-release-pluginも使用します。
問題は私のJenkinsfile(またはJenkins Pipeline Configuration)です:
有用なコミットがない場合でも、最後のステップで無限ループが作成されることを理解しました。
これが私のJenkinsfileの興味深い部分です。
sshagent([git_credential]) {
sh "${maven_bin} --settings ${maven_settings} -DreleaseVersion=${release_version} -DdevelopmentVersion=${development_version} release:prepare release:perform -B"
}
ループを解除するにはどうすればよいですか(MavenがGITでコミットするときにJenkinsが新しいビルドをトリガーしないようにします)?
ありがとう
@ Daniel Omoto comment のおかげで、ジェンキンスがGITポーリングのオプションを提供していることがわかりました。 1つはまさに私が必要としたものです(そして提供された例はmaven-release-pluginのためです!):
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
誰かがループで同じ問題を抱えている場合、または後続のビルドがトリガーされる場合に、リポジトリへのすべてのプッシュで(ポーリングの代わりに)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...>
}
これが、パイプラインの第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を読み取るか、スキップされたビルドの説明を修正する必要があります。リリース後のビルドの色はグレーになります。
解決策は、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