一尘不染

如何配置Jenkins 2管道,以便Jenkinsfile使用预定义变量

jenkins

我有几个使用Jenkinsfile的项目,它们实际上是相同的。唯一的区别是它必须签出的git项目。这迫使我每个项目只有一个Jenkinsfile,尽管它们可以共享相同的一个:

node{
    def mvnHome = tool 'M3'
    def artifactId
    def pomVersion

    stage('Commit Stage'){
        echo 'Downloading from Git...'
        git branch: 'develop', credentialsId: 'xxx', url: 'https://bitbucket.org/xxx/yyy.git'
        echo 'Building project and generating Docker image...'
        sh "${mvnHome}/bin/mvn clean install docker:build -DskipTests"
    ...

有没有办法在作业创建期间将git位置预先配置为变量,以便我可以重用相同的Jenkinsfile?

...
    stage('Commit Stage'){
        echo 'Downloading from Git...'
        git branch: 'develop', credentialsId: 'xxx', url: env.GIT_REPO_LOCATION
    ...

我知道我可以这样设置:

该项目已参数化->字符串参数-> GIT_REPO_LOCATION,默认= http://
xxxx
,并使用env.GIT_REPO_LOCATION进行访问。

不利之处在于,提示用户使用默认值启动构建或更改构建。我需要它对他的用户是透明的。有办法吗?


阅读 278

收藏
2020-07-25

共1个答案

一尘不染

您可以使用Pipeline Shared Groovy Library插件来拥有一个库,供您所有项目在git存储库中共享。在文档中,您可以详细了解它。

如果您有许多非常相似的管道,则全局变量机制提供了一种方便的工具来构建可捕获相似性的高级DSL。例如,所有Jenkins插件都是以相同的方式构建和测试的,因此我们可以编写一个名为buildPlugin的步骤:

// vars/buildPlugin.groovy
def call(body) {
    // evaluate the body block, and collect configuration into the object
    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config
    body()

    // now build, based on the configuration provided
    node {
        git url: "https://github.com/jenkinsci/${config.name}-plugin.git"
        sh "mvn install"
        mail to: "...", subject: "${config.name} plugin build", body: "..."
    }
}

假设脚本已作为全局共享库或文件夹级共享库加载,则生成的Jenkinsfile将大大简化:

Jenkinsfile(脚本管道)

buildPlugin {
    name = 'git'
}

该示例显示jenkinsfile如何将name = git传递给库。我目前使用类似的设置,对此非常满意。

2020-07-25