Jenkins Multibranch Pipeline:如何只结帐一次?
Jenkins Multibranch Pipeline: How to checkout only once?
我通过 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'
}
}
}
}
}
管道本身和构建步骤工作正常,但问题是 Jenkins 在每个阶段之前添加了 "Check out from version control" 步骤。该步骤查找新分支,获取引用,但也检查当前分支。以下是完整构建日志的相关输出:
// 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
。
有什么方法可以禁用此默认结帐行为吗?
或者任何可行的选择如何实现这种可选的合并到 master 分支?
谢谢!
默认情况下,git scm
将在 Jenkins 管道中执行。您可以通过以下方式禁用它:
pipeline {
agent none
options {
skipDefaultCheckout true
}
...
此外,我建议您查看其他有用的管道选项 https://jenkins.io/doc/book/pipeline/syntax/#options
我通过 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'
}
}
}
}
}
管道本身和构建步骤工作正常,但问题是 Jenkins 在每个阶段之前添加了 "Check out from version control" 步骤。该步骤查找新分支,获取引用,但也检查当前分支。以下是完整构建日志的相关输出:
// 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
。
有什么方法可以禁用此默认结帐行为吗? 或者任何可行的选择如何实现这种可选的合并到 master 分支?
谢谢!
默认情况下,git scm
将在 Jenkins 管道中执行。您可以通过以下方式禁用它:
pipeline {
agent none
options {
skipDefaultCheckout true
}
...
此外,我建议您查看其他有用的管道选项 https://jenkins.io/doc/book/pipeline/syntax/#options