Jenkins Multibranch Pipeline:如何只结帐一次?

Vit*_*jok 3 jenkins multibranch-pipeline jenkins-blueocean

我通过 BlueOcean UI 在本地 Jenkins 上创建了非常基本的多分支管道。从默认配置中,我删除了几乎所有行为,除了发现分支的行为。配置看起来如下:

配置

Jenkinsfile我尝试设置以下场景中:

  • 结账分行
  • (可选)将其合并到master分支
  • 构建后端
  • 构建前端

摘自我的Jenkinsfile

pipeline {
  agent none   
  stages {    
    stage('Setup') {
      agent {
        label "master"
      }    
      steps {
        sh "git checkout -f ${env.BRANCH_NAME}"
      }
    }

    stage('Merge with master') {
      when {
        not {
          branch 'master'
        }
      }    
      agent {
        label "master"
      }    
      steps {
        sh 'git checkout -f origin/master'
        sh "git merge --ff-only ${env.BRANCH_NAME}"
      }
    }

    stage('Build Back-end') {
      agent {
        docker {
          image 'openjdk:8'
        }
      }

      steps {
          sh './gradlew build'              
      }
    }

    stage ('Build Front-end') {
      agent {
        docker {
          image 'saddeveloper/node-chromium'
        }
      }

      steps {
        dir ('./front-end') {
          sh 'npm install'              
          sh 'npm run buildProd'
          sh 'npm run testHeadless'
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

管道本身和构建步骤工作正常,但问题是 Jenkins 在每个阶段之前添加了“从版本控制检出”步骤。该步骤查找新分支,获取引用,但也检查当前分支。以下是完整构建日志的相关输出:

// stage Setup
 > git checkout -f f067047bbdd3a5d5f9d1f2efae274bc175829595
sh git checkout -f my-branch
// stage Merge with master
 > git checkout -f f067047bbdd3a5d5f9d1f2efae274bc175829595
sh git checkout -f origin/master
sh git merge --ff-only my-branch
// stage Build Back-end
 > git checkout -f f067047bbdd3a5d5f9d1f2efae274bc175829595
sh ./gradlew build
// stage Build Front-end
 > git checkout -f f067047bbdd3a5d5f9d1f2efae274bc175829595
sh npm install
sh npm run buildProd
sh npm run testHeadless
Run Code Online (Sandbox Code Playgroud)

因此,正如您所看到的,它在每个阶段之前有效地将工作目录重置为特定的提交git checkout -f f067...595

有什么方法可以禁用此默认结帐行为吗?或者任何可行的选择如何实现这种可选的合并到主分支?

谢谢!

Car*_*cho 9

默认情况下,git scm将在 Jenkins 管道中执行。您可以通过执行以下操作禁用它:

pipeline {
    agent none
    options {
        skipDefaultCheckout true
    }
    ...
Run Code Online (Sandbox Code Playgroud)

另外,我建议看看其他有用的管道选项https://jenkins.io/doc/book/pipeline/syntax/#options

  • 谢谢,现在我看到了问题的根本原因。**skipDefaultCheckout** _在`agent` 指令中默认跳过从源代码管理中检出代码。_我在每个阶段都定义了代理,默认情况下它会为每个代理进行检出。然而,我不太清楚为什么它有这样的默认行为。如果工作区是共享的,那么执行结帐的原因是什么? (2认同)