当前位置: 首页 > 知识库问答 >
问题:

Maven发布插件在Jenkins管道中的使用

罗寒
2023-03-14

我正在使用Jenkins管道自动构建和部署我的Java应用程序。我还使用maven发布插件来执行maven部署到Artifactory。

问题是我的Jenkinsfile(或Jenkins管道配置):

  1. 我们在发布分支上提交版本0.1.00-SNAPSHOT
  2. Jenkins管道获取代码,并执行maven发布
  3. Maven版本将版本更改为0.1.00
  4. Maven发布标签GIT分支、提交和部署工件
  5. Maven版本将版本更改为0.2.00-SNAPSHOT and commit
  6. Jenkins管道检测到GIT中的更改,因此触发新的构建

您知道最后一步会创建一个无限循环,即使没有有用的提交。

以下是我的詹金斯档案中有趣的部分:

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

如何打破循环(避免Jenkins在Maven提交GIT时触发新构建)?

谢谢

共有3个答案

湛钊
2023-03-14

如果有人在循环中有同样的问题,或者后续构建被触发,但有一个触发器在每次推送到存储库时启动jenkins管道(而不是轮询)。

这是我做的人:我检查了最后一次提交是否在评论中包含“[maven-frease-plugin]”。

文件中的代码:

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...>
        }
阙辰龙
2023-03-14

感谢@Daniel Omoto的评论,我发现Jenkins为GIT轮询提供了选项。其中一个正是我所需要的(提供的示例是针对maven release插件的!):

巫马嘉祯
2023-03-14

随着git和pull请求的出现,我认为使用maven发布插件或maven版本插件和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发布正确的版本,请使用Flatte Maven插件:http://www.mojohaus.org/flatten-maven-plugin/usage.html.

另外,看看:https://maven.apache.org/maven-ci-friendly.html

 类似资料:
  • 问题内容: 我还没有找到任何有关此的信息,所以我希望你们能在这一方面帮助我 我在bitbucket中托管了一个maven项目,该项目的BitBucket WebHook指向someurl / bitbucket-hook /,此钩子触发由具有以下结构的管道定义的我的项目的构建: 问题是maven版本插件将更改推送到BitBucket,这又触发了jenkins脚本,使构建无限循环,是否有办法防止这种

  • 我想执行一个maven版本,在运行于jdk 1.7的Jenkins安装上编译java 1.8代码 我有一个使用JDK参数插件用Java1.8编译的项目。它在进行常规构建时有效。 当我使用maven发布插件进行maven发布时,它会将JVM与java 1.7相结合,而不是插件上指定的版本。我猜它需要环境中的java版本。 如果我将JAVA_HOME for the job设置为1.8,它就会工作。

  • 我最近尝试使用,因为它显然是Maven宇宙中构建和包发布的推荐方式。 但是我想在Eclipse中使用它,因为我的开发工作流程的其余部分是基于Eclipse的。我通常通过作为Eclipse Juno(4.2)的一部分提供的m2eclipse插件运行Maven命令 当我尝试在 Eclipse 中运行 “release:prepare” 时,我注意到了一些奇怪的事情: 在根项目目录中创建了一些额外的文件

  • 我试图在Jenkins管道中使用JenkinsArtiFactory Plugin-Release Management功能,但我在文档中没有看到任何管道步骤(https://www.jfrog.com/confluence/display/RTF/Declarative管道语法)。 我正在寻找管道步骤,无论是脚本化/声明性步骤"阶段Maven发布构建"。PFA的截图,可以通过正常的maven工作

  • 我有一个Maven SpringBoot项目。我想把它推到云工厂。为此,我为Jenkins编写了一个groovy管道脚本。我要补充什么?在脚本和/或pom中。xml将其发布到Artifactory中,这样Jenkins将从Git中提取代码并将其发布到Artifactory。在另一个环境中,我将拉出artifactory版本化的JAR,并将其推送到Cloud Foundry。 假设我的项目的grou

  • 我以一个新的gradle用户的身份创建gradle版本,但我过去曾与maven合作过。 我试图重现maven发布插件的动作: 将分支版本更改为发行号(在svn提交) 如您所见,我正在使用: Nexus OSS作为版本控制库 SVN作为scm Gradle(2.8) 我正试图通过这两个插件实现我的目标: > 将分支版本更改为发行号(在svn提交) 创建标签(位于svn) 将分支版本更改为新快照编号(