Jenkins 多分支管道 : How to checkout only once?

标签 jenkins multibranch-pipeline jenkins-blueocean

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

config

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'
            }
          }
        }
      }
    }
    

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

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

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

    谢谢!

    最佳答案

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

    pipeline {
        agent none
        options {
            skipDefaultCheckout true
        }
        ...
    

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

    关于 Jenkins 多分支管道 : How to checkout only once?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53812690/

    相关文章:

    jenkins-pipeline - 多分支 Jenkins Pipeline - 将分支限制为 1

    jenkins - 如何获取触发我的多分支 Jenkins 构建的 Github PR 的标签列表

    jenkins - Jenkins - BlueOcean 上的后期构建操作在哪里?

    html - 如何通过groovy脚本将HTML内容解析为Jenkins参数?

    jenkins - 根据 JIRA 对 Jenkins 用户进行身份验证

    jenkins - Bitbucket和Jenkins远程构建触发器

    jenkins - BlueOcean 使用 SSH key 连接

    Jenkins 管道(并行&&动态)?

    github - 当 GitHub 中创建拉取请求时触发 Jenkins 多分支管道

    jenkins - 如何构建如蓝海测试版项目页面所示的管道