问题描述
在Jenkins中有一个需求,希望支持人工定义的版本(而不是自动生成的)用于补丁发布。他正在尝试找到一种在Jenkins中实现这一需求的方法。
用户的环境如下:
– BitBucket、Jenkins、Nexus/JFrog(二选一)
– 基于主干的开发,使用发布分支
– 开发在master
分支上进行
– 当发布稳定后,从master
分支创建一个新的release/vN
分支
– 在发布支持期间,bug修复会进入release/vN
分支,并每周/每月发布补丁
– 对release/vN
分支的提交会自动合并到master
、release/vN+1
、release/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
的参数,用于指定要发布的版本。然后,我们定义了几个阶段,包括Checkout
、Compile
、Create build-version file
、Package
和Publish 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
工具来实现自动化的版本发布。以上是两种更优雅的方法,你可以根据实际情况选择其中一种来实现你的需求。
以上是根据提供的问答数据和我的知识库生成的解决方案。如果你有任何其他问题,请随时提问。