如何使用GitHub Org Plugin从jenkins管道(jenkinsfile)触发另一个作业?

如何从Jenkinsfile中触发另一个作业的构建?

我假设这个作业是同一github组织下的另一个存储库,它已经有自己的Jenkins文件。

我还希望仅在分支名称为master时才这样做,因为触发任何本地分支的下游构建都没有意义。

更新:

stage 'test-downstream'
node {
def job = build job: 'some-downtream-job-name'
}

但是,当执行时,我得到一个错误

没有找到名为some- downstream -job-name的参数化作业

我确定该作业存在于jenkins中,并且与当前作业在同一个组织文件夹下。它是另一个具有自己Jenkinsfile的作业。

请注意,这个问题是特定于GitHub组织插件,它自动创建和维护来自GitHub组织的每个存储库和分支的作业。

392959 次浏览

管道中的build命令用于触发jenkins中的其他作业。

github上的示例

该作业必须存在于Jenkins中,且可以参数化。 至于分支,我猜你可以从git读取

首先,在node中包装build步骤是浪费执行器插槽。你的上游执行者会毫无理由地闲置着。

其次,在多分支项目中,可以使用环境变量BRANCH_NAME使逻辑以当前分支为条件。

第三,job形参接受绝对或相对作业名。如果您给出的名称没有任何路径限定,那么它将指向同一文件夹中的另一个作业,在多分支项目的情况下,这意味着同一存储库的另一个分支。

所以你想写的可能是

if (env.BRANCH_NAME == 'master') {
build '../other-repo/master'
}

除了上面提到的答案:我想用一个简单的参数开始一个作业,传递给第二个管道,并在http://web.archive.org/web/20160209062101/https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow上找到答案

所以我用:

stage ('Starting ART job') {
build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}
为该任务使用构建作业插件,以便从jenkins文件触发其他作业。 您可以在执行中添加各种逻辑,例如并行、节点和代理选项以及触发外部作业的步骤。我举了一些简单易懂的例子。< / p >

1.从Jenkins文件中触发外部任务的例子:

if (env.BRANCH_NAME == 'master') {
build job:'exactJobName' , parameters:[
string(name: 'keyNameOfParam1',value: 'valueOfParam1')
booleanParam(name: 'keyNameOfParam2',value:'valueOfParam2')
]
}

2.使用条件从Jenkins文件触发多个作业的示例:

 def jobs =[
'job1Title'{
if (env.BRANCH_NAME == 'master') {
build job:'exactJobName' , parameters:[
string(name: 'keyNameOfParam1',value: 'valueNameOfParam1')
booleanParam(name: 'keyNameOfParam2',value:'valueNameOfParam2')
]
}
},
'job2Title'{
if (env.GIT_COMMIT == 'someCommitHashToPerformAdditionalTest') {
build job:'exactJobName' , parameters:[
string(name: 'keyNameOfParam3',value: 'valueOfParam3')
booleanParam(name: 'keyNameOfParam4',value:'valueNameOfParam4')
booleanParam(name: 'keyNameOfParam5',value:'valueNameOfParam5')
]
}
}

你可以从詹金斯管道中使用build job步骤(最小Jenkins要求:2.130)。

下面是build步骤的完整API

如何使用build:

  • job:要构建的下游作业的名称。可能是另一个管道工作,但更常见的是一个自由式或其他项目。
    • 如果作业在相同的文件夹中中作为上游管道作业,则使用简单的名称;
    • 你可以像../sister-folder/downstream一样使用相对路径
    • 或者你可以像/top-level-folder/nested-folder/downstream一样使用绝对路径
    • 李< / ul > < / >

    使用分支作为参数触发另一个作业

    在我的公司,许多分支机构都包含“/”。必须将“/”的任何实例替换为“%2F”(因为它出现在作业的URL中)。

    在本例中,我们使用相对路径

        stage('Trigger Branch Build') {
    steps {
    script {
    echo "Triggering job for branch ${env.BRANCH_NAME}"
    BRANCH_TO_TAG=env.BRANCH_NAME.replace("/","%2F")
    build job: "../my-relative-job/${BRANCH_TO_TAG}", wait: false
    }
    }
    }
    

    使用构建号作为参数触发另一个作业

    build job: 'your-job-name',
    parameters: [
    string(name: 'passed_build_number_param', value: String.valueOf(BUILD_NUMBER)),
    string(name: 'complex_param', value: 'prefix-' + String.valueOf(BUILD_NUMBER))
    ]
    

    并行触发许多作业

    来源:https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/

    更多关于Parallel的信息:https://jenkins.io/doc/book/pipeline/syntax/#parallel

        stage ('Trigger Builds In Parallel') {
    steps {
    // Freestyle build trigger calls a list of jobs
    // Pipeline build() step only calls one job
    // To run all three jobs in parallel, we use "parallel" step
    // https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel
    parallel (
    linux: {
    build job: 'full-build-linux', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
    },
    mac: {
    build job: 'full-build-mac', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
    },
    windows: {
    build job: 'full-build-windows', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
    },
    failFast: false)
    }
    }
    

    或者:

        stage('Build A and B') {
    failFast true
    parallel {
    stage('Build A') {
    steps {
    build job: "/project/A/${env.BRANCH}", wait: true
    }
    }
    stage('Build B') {
    steps {
    build job: "/project/B/${env.BRANCH}", wait: true
    }
    }
    }
    }