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

sor*_*rin 118 groovy jenkins jenkins-workflow jenkins-pipeline

如何从内部触发另一个作业的构建Jenkinsfile

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

我也想在分支名称为master时执行此操作,因为触发任何本地分支的下游构建没有意义.

更新:

stage 'test-downstream'
node {
     def job = build job: 'some-downtream-job-name'
}
Run Code Online (Sandbox Code Playgroud)

仍然,执行时我得到一个错误

找不到名为some-downtream-job-name的参数化作业

我确信这个工作存在于jenkins中,并且与当前工作文件夹在同一组织文件夹下.这是另一项有自己的工作Jenkinsfile.

请注意,此问题特定于GitHub组织插件,该插件可从GitHub组织自动创建和维护每个存储库和分支的作业.

Jes*_*ick 121

首先,将build步骤包含在内是浪费执行程序槽node.您的上游执行者将无缘无故地闲置.

其次,从multibranch项目中,您可以使用环境变量BRANCH_NAME使逻辑以当前分支为条件.

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

因此,你打算写的可能是

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}
Run Code Online (Sandbox Code Playgroud)

  • 检查_Snippet Generator_:`build job:'../other-repo/master',wait:false` (45认同)
  • 如果 `${BRANCH_NAME}` 可以作为环境变量使用,简单的字符串替换就可以了。只要确保从`'`切换到`"`来引用你的字符串。例如`build job: "../other-repo/${BRANCH_NAME}"` (3认同)
  • 谢谢!如果通过任何更改,您还知道如何在不等待它完成的情况下触发此构建,那将是双重的:) (2认同)
  • 有什么方法可以使用动态分支名称来调用构建步骤?类似于`build job:'../other-repo/$BRANCH_NAME'其中$ BRANCH_NAME是与运行Multibranch项目的分支有关的Jenkins环境变量吗? (2认同)
  • 用于“构建作业”的API链接:https://jenkins.io/doc/pipeline/steps/pipeline-build-step/ (2认同)

小智 105

除了上面提到的答案之外:我想通过传递给第二个管道的简单参数开始工作,并在https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow上找到答案.

所以我用过:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}
Run Code Online (Sandbox Code Playgroud)

  • 必须将构建作业嵌入到步骤中(从版本0.5开始) (10认同)
  • 现在是 `build job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")]` 现在,来自 https ://jenkins.io/doc/pipeline/examples/#jobs-in-parallel (7认同)
  • 是否返回了`build`命令调用的Jenkins作业的BUILD_NUMBER?如何在以下某个阶段访问BUILD_NUMBER?任何人都知道该命令的记录在哪里? (4认同)
  • 有趣的是,“构建作业:'RunArtInTest',参数:[[$class:'StringParameterValue',名称:'systemname',值:systemname]]`对我不起作用,但:'构建作业:'RunArtInTest',参数: [string(name: 'systemname', value: "${VALUE}")]` 有效 (3认同)

小智 22

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

github上的示例

该工作必须存在于Jenkins中并且可以进行参数化.至于分支,我想你可以从git中读取它

  • 工作名称格式为:`build job:"$ {ORGANISATION_NAME}/$ {REPO_NAME}/master"` (6认同)
  • 我尝试添加`build job:'jobname`但是我得到了这个错误`没有名为jobname found的参数化作业`我可以向你保证在组织文件夹中有一个同名的作业. (3认同)
  • @SahilAhuja这完全是任意的,并且基于您的Jenkins布局,如果要使用绝对路径,则需要以`/`开头。相对路径很好;索林的问题可能是,名为build的工作是一个多分支工作,这意味着像jobname这样的路径将尝试建立同一工作的分支jobname。它必须是`../ jobname / branchname` (2认同)

Kat*_*tie 6

您可以使用Jenkins Pipeline中build job步骤(最低Jenkins要求:2.130)。

这是该build步骤的完整API :https : //jenkins.io/doc/pipeline/steps/pipeline-build-step/

使用方法build

  • job:要构建的下游作业的名称。可能是另一项Pipeline工作,但更常见的是自由泳或其他项目。
    • 如果作业与此上游Pipeline作业位于同一文件夹中,则使用简单名称
    • 您可以改用相对路径,例如../sister-folder/downstream
    • 或者您可以使用绝对路径,例如/top-level-folder/nested-folder/downstream

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

在我公司,我们的许多分支都包含“ /”。您必须将“ /”的任何实例替换为“%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
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

使用内部版本号作为参数触发另一个作业

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))
    ]
Run Code Online (Sandbox Code Playgroud)

并行触发许多作业

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

有关并行的更多信息,请参见: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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

或者:

    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
                    }
                }
            }
    }
Run Code Online (Sandbox Code Playgroud)


avi*_*amg 5

为该任务使用构建作业插件,以便从 jenkins 文件触发其他作业。您可以向执行添加各种逻辑,例如并行、节点和代理选项以及用于触发外部作业的步骤。我为此提供了一些易于阅读的食谱示例。

1. 使用条件示例从 jenkins 文件触发外部作业的示例:

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

2.example 使用条件从 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')
     ]
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @温和的。您可以通过 params.systemname 访问传递的参数 (2认同)