Использование плагина Maven для использования в трубопроводе Jenkins

Я использую Jenkins Pipeline для автоматической сборки и развертывания своих приложений Java. Я также использую maven-release-плагин для развертывания Maven в Artifactory.

Проблема заключается в моем файле Jenkins (или в конфигурации Jenkins Pipeline):

  • Мы передаем версию 0.1.00-SNAPSHOT в ветке release
  • Jenkins Pipeline получит код и выполнит выпуск maven
  • Maven Release изменяет версию на 0.1.00
  • Maven Отметить теги GIT ветвь, зафиксировать и развернуть артефакт
  • Maven Release изменяет версию на 0.2.00-SNAPSHOT и фиксирует
  • Труба Jenkins обнаруживает изменение в GIT, поэтому запускает новую сборку

Вы поняли, что последний шаг создает бесконечный цикл, даже если нет полезной фиксации.

Вот интересная часть моего файла Jenkins:

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

Как я могу сломать цикл (избегайте Jenkins запускать новую сборку, когда Maven фиксируется на GIT)?

Спасибо

Ответ 1

Благодаря комментарию @Daniel Omoto, я узнал, что Jenkins предоставляет опцию для опроса GIT. Один из них именно то, что мне нужно (и предоставленный пример для maven-release-плагина!):

GIT скриншот опроса

Ответ 2

ИМХО с появлением запросов 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

Ответ 3

В случае, если кто-то имеет ту же проблему с циклом или что последующие сборки запускаются, НО имеет триггер, который запускает конвейер 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...>
        }

Ответ 4

Решением может быть изменение крюка 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

Ответ 5

Это то, что мы ставим в качестве первого этапа в нашем конвейере:

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, или просто добавить фиксированное описание для пропущенной сборки. Сборка после релиза будет иметь серый цвет.