Jenkins声明性流水线中使用mvn、发布和版本化的Artifactory

120次阅读
没有评论

问题描述

在Jenkins中有一个需求,希望支持人工定义的版本(而不是自动生成的)用于补丁发布。他正在尝试找到一种在Jenkins中实现这一需求的方法。
用户的环境如下:
– BitBucket、Jenkins、Nexus/JFrog(二选一)
– 基于主干的开发,使用发布分支
– 开发在master分支上进行
– 当发布稳定后,从master分支创建一个新的release/vN分支
– 在发布支持期间,bug修复会进入release/vN分支,并每周/每月发布补丁
– 对release/vN分支的提交会自动合并到masterrelease/vN+1release/vN+2等分支上
– 版本格式为v<major>.<patch>
用户希望实现以下功能:
– 通过命名来计划即将发布的补丁,例如,当前在生产环境中的版本是v2.1,用户希望向利益相关者传达下周将发布v2.2
– 构建并创建一个名为artifact-v2.2.tar的构件(jar/war/…),并将其推送到类似Nexus/JFrog的仓库中
– 在构件中包含一个名为build-version的文本文件,其中包含版本号v2.2,这样代码就能知道它所属的发布版本,例如,用于日志/指标等
用户遇到的问题是:
– 如果将build-version纳入版本控制,将会破坏bug修复等自动合并的功能
– 无法在构建过程中自动生成版本,因为版本号应该由人工定义
用户提出的解决方案是:
– 将要发布的更改合并到release/v2分支中,作为一个带有sha-22提交的commit
– 使用v2.2标记该提交(即git tag -a 'v2.2' sha-22
– 在Jenkins中触发一个带有参数的作业,参数值为v2.2
– 流水线将检出CHECKOUT_REF_SPEC(即git checkout v2.2
– 编译(即mvn clean compile
– 创建一个带有标记值的新文件(即echo $CHECKOUT_REF_SPEC > target/build-version
– 打包:将CHECKOUT_REF_SPEC传递给maven(即mvn -P"artifact.version=v2.2" package),生成artifact-v2.2.tar
– 推送到Artifactory
用户想知道是否有更好/更优雅的方法来实现这个需求。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

用户提出的解决方案是可行的,但也可以考虑使用Jenkins的插件来简化流程。下面是一种更优雅的方法:
1. 在Jenkins中安装并配置JFrog Artifactory插件,以便能够与Artifactory进行集成。
2. 在Jenkins中创建一个声明性流水线(Declarative Pipeline)作业,并在Jenkinsfile中定义以下步骤:

pipeline {
    agent any
    parameters {
        string(name: 'RELEASE_VERSION', defaultValue: 'v2.2', description: 'The version to be released')
    }
    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }
        stage('Compile') {
            steps {
                sh 'mvn clean compile'
            }
        }
        stage('Create build-version file') {
            steps {
                sh 'echo ${params.RELEASE_VERSION} > target/build-version'
            }
        }
        stage('Package') {
            steps {
                sh 'mvn -P"artifact.version=${params.RELEASE_VERSION}" package'
            }
        }
        stage('Publish to Artifactory') {
            steps {
                rtUpload (
                    serverId: 'artifactory-server',
                    spec: '''{
                        "files": [
                            {
                                "pattern": "target/artifact-${params.RELEASE_VERSION}.tar",
                                "target": "repo-name/"
                            }
                        ]
                    }'''
                )
            }
        }
    }
}

在上面的Jenkinsfile中,我们首先定义了一个名为RELEASE_VERSION的参数,用于指定要发布的版本。然后,我们定义了几个阶段,包括CheckoutCompileCreate build-version filePackagePublish to Artifactory。在每个阶段中,我们执行了相应的操作,如检出代码、编译、创建build-version文件、打包和推送到Artifactory。
请注意,上述Jenkinsfile中的rtUpload步骤使用了JFrog Artifactory插件提供的rtUpload方法,用于将构件上传到Artifactory。你需要根据实际情况配置Artifactory服务器,并将serverId参数设置为你在Jenkins中配置的Artifactory服务器ID。

方案2

另一种方法是使用semantic-release工具,它可以自动化版本发布过程,并与maven插件maven-semantic-release集成。这个工具可以根据提交消息和代码状态自动确定版本号,并自动发布构件到Artifactory。你可以根据实际需求选择使用这个工具。

以上是两种更优雅的方法来实现你的需求。你可以根据实际情况选择其中一种方法来实现你的流程。

总结

在Jenkins中实现人工定义版本的补丁发布可以使用Jenkins的声明性流水线和JFrog Artifactory插件来简化流程。你可以根据实际需求选择使用Jenkinsfile或semantic-release工具来实现自动化的版本发布。以上是两种更优雅的方法,你可以根据实际情况选择其中一种来实现你的需求。

以上是根据提供的问答数据和我的知识库生成的解决方案。如果你有任何其他问题,请随时提问。

正文完