【问题标题】:Jenkins: Trigger another job with branch name詹金斯:用分支名称触发另一个工作
【发布时间】:2020-06-29 14:01:05
【问题描述】:

我正在通过声明方式使用 Jenkins Pipeline,我想触发另一个具有分支名称的作业。

例如,我有两个不同的管道 (PipelineA -PipelineB),其阶段为 JobAJobB

JobA 的一个阶段应该通过使用env.GIT_BRANCH 的参数触发JobB。我的意思是,如果我们通过 origin/develop 触发 JobA,那么它应该触发 'JobB' 并运行它具有 origin/develop 条件的阶段。

同时,我们还对JobB 进行了一些单独的更改,它也有自己的 GIT_BRANCH 表达式。因此我无法找到一种方法来单独管理它而不影响JobA。需要澄清的是,当 JobA 使用 origin/stage 参数触发 JobB 时,由于 JobB 的最新更改是 origin/development 而 GIT_BRANCH 是 origin/development,我无法运行具有阶段条件的阶段。

这是我的脚本。

    stage ('Job A') {
        steps {
            script {
                echo "Triggering job for branch ${env.GIT_BRANCH}"
                ret = build(job: "selenium_tests", 
                                parameters: [
                                    string(name: "projectName", value: "Project1"),
                                    string(name: "branchName", value: "env.GIT_BRANCH")
                                ],
                                propagate: true,
                                wait: true)

                echo ret.result
                currentBuild.result = ret.result
            }           
        }
    }

parameters {    
    string(defaultValue: "project1", description: 'Which project do you want to test?', name: 'projectName')
    string(defaultValue: "origin/development", description: 'Environment for selenium tests', name:'branchName')
}


    stage ('Job B') {
        when {
            beforeAgent true
            expression { params.projectName == 'Project1' }
            expression { params.branchName == "origin/stage"}
            expression{ return env.GIT_BRANCH == "origin/stage"}
        }
        steps {
            script {
                  //Do something
            }           
        }
    }

【问题讨论】:

  • 如果你想让 Job B 对来自期望分支的代码运行,只需添加一个阶段来切换到期望的分支,并且 Job B 的每个阶段都不需要条件。

标签: jenkins jenkins-pipeline jenkins-groovy


【解决方案1】:

触发 Job B 时再传递一个分支参数

stage('Trigger Job A') {}

stage('Trigger Job B') {
    when {
       allOf {
         beforeAgent true
         expression { params.projectName == 'Project1' }
         expression{ return env.GIT_BRANCH == "origin/stage"}
       }
    }
    steps {
    build(job: "selenium_tests/Job B", 
      parameters: [
          string(name: "projectName", value: "Project1")
          strint(name: "branchName", value: "${env.GIT_BRANCH}")
      ],
      propagate: true,
      wait: true)       
    }
}


在 Job B' Jenkinsfile 中添加一个阶段作为第一阶段以切换到所需的分支

pipeline {
    
    parameters {
        string(name: 'branchName', defaultValue: 'develop')
    }

    stages {

        stage('Switch branch') {
            steps {
                sh "git checkout ${params.branchName}"
            }
        }
        // other stages

    }
}

【讨论】:

  • 我更新了我的问题,为舞台添加了我当前的 when 表达式。问题是,我们还对 JobB 进行了一些更改,因为它是单独的管道。因此,假设我们从 JobA 触发的分支名称是 stage,但由于最新的 GIT_BRANCH 是 JobB 的开发,因此 Job B 没有一个 stage 正在运行
  • 你更新的描述让我更加困惑。请简化您的要求。据我了解,两个作业,作业 A 和作业 B,如果有代码提交推送到作业 A 的任何 repo 分支,作业 A 将调用作业 B,我希望作业 B 针对来自所需分支的代码运行。这是你的要求吗?
  • 例如,我有一个 repo A 来保存我的应用程序源代码,另一个 repo B 来保存我的测试代码,一旦我将应用程序代码更改提交到开发分支,我希望在开发上运行测试代码回购 B 的分支。
  • 是的,你是对的.. 但是 repo B 也保存了我们的测试代码,它有三个分支,例如开发、stage 和 master.. 同时我们也对运行 Job B 的 repo B 进行了一些更改.所以JoB的最后一个变化是发展。但是 Job A 在 stage 分支上发生了变化。因此,如我的问题所示,我有两个表达式,首先检查 GIT_BRANCH,另一个检查 params.branchName 来自作业 A。这就是为什么由于这些不同,没有任何阶段正在运行
  • 如果你需要满足所有条件,你应该使用allOfjenkins.io/doc/book/pipeline/syntax/#when-example
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
相关资源
最近更新 更多