我的 git 存储库有一个声明性 Jenkinsfile,用于在存储库中构建软件。我想构建
main
分支或 release/<version>
形式的标签。我的目标是为 Jenkins 作业设置一个字符串参数 refname
,将其设置为 main
或 <version>
。
根据 Jenkins 文档,我可以使用此参数(作为环境变量)在配置的“要构建的分支”部分中设置“分支说明符”。如果我将分支说明符设置为
/refs/heads/${refname}
这适用于构建主分支。要构建发布标签,我必须将分支说明符设置为 /refs/tags/${refname}
。我无法同时进行这两种设置。
如何根据
/refs/heads/...
参数的值将分支说明符设置为 refs/tags/...
或 $refname
?
在将作业参数用作作业配置中的分支说明符之前,有什么方法可以对其进行处理吗?我尝试向 Jenkinsfile 添加 Groovy 函数来后处理
$refname
参数,但没有成功。可能是因为在作业执行期间解释 Jenkinsfile 之前不会评估环境块 - 然后就太晚了。
这是我的 Jenkinsfile(尽管已缩短):
pipeline {
parameters {
string(
name: 'refname',
defaultValue: 'main',
description: 'main or name of release/ tag.')
}
environment {
buildref = GET_BUILDREF(refname)
}
stages {
stage('build software') {
steps {
// deleted steps here
}
}
stage('Process Result HEAD (Intranet)') {
when {
expression { params.refname == 'main' }
}
steps {
// deleted steps here
}
}
}
stage('Process Result Release (NAS)') {
when {
expression { params.refname != 'main' }
}
steps {
// deleted steps here
}
}
} //stages
String GET_BUILDREF(refname) {
if ("main" == refname)
return "refs/heads/"+refname
else
return "refs/tags/"+refname
}
}
我尝试了 git 参数插件,但无法让它正常工作。不过,我认为它不能解决分支说明符的问题。
我当前的解决方法是做两项工作:一项用于构建“主”,一项用于构建版本。除了分支说明符中的单个单词“heads”或“refs”之外,这两个配置都是相同的。好像有点多了。
我的问题是通过这个 Dynamic Git Branch 解决的,在某些情况下,如果它不能帮助你,可以添加
refname
参数。
结账步骤根据
refname
动态确定正确的参考。
stages {
stage('Checkout') {
steps {
script {
def buildRef = params.refname == 'main' ? "refs/heads/${params.refname}" : "refs/tags/${params.refname}"
checkout([$class: 'GitSCM', branches: [[name: buildRef]], userRemoteConfigs: [[url: 'YOUR_REPO_URL']]])
}
}
}
stage('Build Software') {
steps {
// Your build steps here
}
}
stage('Process Result') {
steps {
script {
if (params.refname == 'main') {
// Handle main branch processing
} else {
// Handle release tag processing
}
}
}
}
}
}
使用
script
块来实现基于refname
参数的逻辑。