Jenkins 管道确定分支是否用于 Bitbucket 拉取请求

Jenkins pipeline determine if a branch is for Bitbucket pull request

我将 Jenkins 与 Bitbucket branch source plugin 一起使用。

一切正常,但我希望能够 run/exclude 我管道中的某些阶段,具体取决于分支是否与拉取请求相关联,例如:

pipeline {
  stages {
    stage('build') {
      //compile
    }    
    stage('package') {
      when {
        environment name: 'IS_PULL_REQUEST', value: 'true'
      }      
      //create deployable package
    }
  }
}

Jenkins 知道分支何时用于 PR,因为它将源与目标合并,并且还在多分支管道页面上的拉取请求文件夹中显示该分支。

我可以在 exclude/include 个阶段的管道中使用环境变量吗?

您可以使用 BRANCH_NAMECHANGE_ID 环境变量来检测拉取请求。当您 运行 从分支构建多分支管道时(在创建拉取请求之前),将设置以下环境变量:

  • env.BRANCH_NAME 设置为存储库分支名称(例如 develop),
  • env.CHANGE_BRANCHnull,
  • env.CHANGE_IDnull.

但是一旦您创建了拉取请求,那么:

  • env.BRANCH_NAME 设置为 PR-\d+ 名称(例如 PR-11),
  • env.CHANGE_BRANCH设置为真正的分支名称(例如develop),
  • env.CHANGE_ID 设置为拉取请求 ID(例如 11)。

我在管道中使用以下 when 条件来检测拉取请求:

when {
    expression {
        // True for pull requests, false otherwise.
        env.CHANGE_ID && env.BRANCH_NAME.startsWith("PR-")
    }
}

在声明式管道中,您还可以在 when 指令中使用内置条件 changeRequest 来确定分支是否与拉取请求相关联。

stage('package') {
  when {
    changeRequest()
  }      
  //create deployable package
}

您还可以检查拉取请求是否针对特定分支:

stage('package') {
  when {
    changeRequest target: 'master'
  }      
  //create deployable package
}

https://jenkins.io/doc/book/pipeline/syntax/#when