如何根据作业参数为分支和标签设置分支说明符?

问题描述 投票:0回答:1

我的 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”之外,这两个配置都是相同的。好像有点多了。

git jenkins
1个回答
0
投票

我的问题是通过这个 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
参数的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.