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

How to configure a Jenkins 2 Pipeline so that Jenkinsfile uses a predefined variable

我有几个项目使用几乎相同的 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访问。

缺点是提示用户使用默认值开始构建或更改它。我需要它对用户透明。有办法吗?

不是在每个 Git 存储库中都有一个 Jenkinsfile,你可以有一个额外的 git 存储库,从那里你可以获得通用的 Jenkinsfile - 这在使用 管道类型作业时有效 并选择选项 来自 SCM 的管道脚本 。这样 Jenkins 在签出用户 repo 之前签出你拥有公共 Jenkinsfile 的 repo。

如果作业可以自动触发,您可以在每个 git 存储库中创建一个 post-receive 挂钩,以存储库作为参数调用 Jenkins 管道,以便用户不必手动 运行 将作业作为参数输入回购 (GIT_REPO_LOCATION)。

如果作业无法自动触发,我能想到的最不烦人的方法是使用 Choice 参数 和存储库列表而不是 String 参数。

您可以使用Pipeline Shared Groovy Library plugin to have a library that all your projects share in a git repository. In the documentation您可以详细阅读。

If you have a lot of Pipelines that are mostly similar, the global variable mechanism provides a handy tool to build a higher-level DSL that captures the similarity. For example, all Jenkins plugins are built and tested in the same way, so we might write a step named 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: "..."
    }
}

Assuming the script has either been loaded as a Global Shared Library or as a Folder-level Shared Library the resulting Jenkinsfile will be dramatically simpler:

Jenkinsfile (Scripted Pipeline)

buildPlugin {
    name = 'git'
}

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