1

我有几个项目使用几乎相同的 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, default= http://xxxx,并通过 env.GIT_REPO_LOCATION 访问它。

缺点是提示用户使用默认值开始构建或更改它。我需要它对他的用户是透明的。有没有办法做到这一点?

4

2 回答 2

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 传递给库。我目前使用类似的设置并且对此非常满意。

于 2017-04-07T14:13:01.433 回答
0

除了在每个 Git 存储库中都有一个 Jenkinsfile 之外,您还可以拥有一个额外的 git 存储库,从中获取通用 Jenkinsfile - 这在使用Pipeline 类型 Job并从 SCM选择Pipeline script 选项时有效。通过这种方式,Jenkins 在签出用户存储库之前检查您拥有公共 Jenkinsfile 的存储库。

如果作业可以自动触发,您可以在每个 git repo 中创建一个 post-receive 钩子,以 repo 作为参数调用 Jenkins Pipeline,这样用户就不必手动运行进入 repo 的作业作为参数(GIT_REPO_LOCATION)。

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

于 2017-04-07T14:02:58.443 回答