Ответ 1
Благодаря комментарию @Daniel Omoto, я узнал, что Jenkins предоставляет опцию для опроса GIT. Один из них именно то, что мне нужно (и предоставленный пример для maven-release-плагина!):
Я использую Jenkins Pipeline для автоматической сборки и развертывания своих приложений Java. Я также использую maven-release-плагин для развертывания Maven в Artifactory.
Проблема заключается в моем файле Jenkins (или в конфигурации Jenkins Pipeline):
Вы поняли, что последний шаг создает бесконечный цикл, даже если нет полезной фиксации.
Вот интересная часть моего файла Jenkins:
sshagent([git_credential]) {
sh "${maven_bin} --settings ${maven_settings} -DreleaseVersion=${release_version} -DdevelopmentVersion=${development_version} release:prepare release:perform -B"
}
Как я могу сломать цикл (избегайте Jenkins запускать новую сборку, когда Maven фиксируется на GIT)?
Спасибо
Благодаря комментарию @Daniel Omoto, я узнал, что Jenkins предоставляет опцию для опроса GIT. Один из них именно то, что мне нужно (и предоставленный пример для maven-release-плагина!):
ИМХО с появлением запросов git и pull я не думаю, что использование maven-release-plugin или maven-version-plugin с конвейером Jenkins является хорошей идеей.
Использование многоотраслевого конвейера с упомянутой здесь техникой управления версиями больше соответствует непрерывной доставке: 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>
Теперь вы можете легко выпускать выпуски на своем сервере Jenkins, настроив многоотраслевой конвейер с Jenkinsfile для построения на всех ветвях и развертывания только из главной ветки:
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 о том, как настроить многоотраслевой конвейер.
С этой техникой вы развиваете только на неосновных ветвях. Затем создайте запрос на извлечение, чтобы объединить ваши изменения с главной веткой. После этого ваш артефакт должен автоматически развернуться в вашем хранилище артефактов.
добавление
При публикации в репозиторий 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]" в комментарии.
Код в файле jenkins:
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...>
}
Решением может быть изменение крюка post-receive, вызывающего URL-адрес уведомления jenkins:
#!/bin/bash
git_log=$(git log --branches -1)
if ! [[ $git_log =~ .*maven-release-plugin.* ]] ;
then
curl http://buildserver:8080/git/notifyCommit?url=ssh://[email protected]:22/projects/Name.git;
fi
Это то, что мы ставим в качестве первого этапа в нашем конвейере:
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, или просто добавить фиксированное описание для пропущенной сборки. Сборка после релиза будет иметь серый цвет.