在多个阶段之间重用 Jenkins 中的代理(docker 容器)



我有一个包含多个阶段的管道,我想在"n"个阶段之间重用一个 docker 容器,而不是所有阶段:

pipeline {
agent none
stages {
stage('Install deps') {
agent {
docker { image 'node:10-alpine' }
}
steps {
sh 'npm install'
}
}
stage('Build, test, lint, etc') {
agent {
docker { image 'node:10-alpine' }
}
parallel {
stage('Build') {
agent {
docker { image 'node:10-alpine' }
}
// This fails because it runs in a new container, and the node_modules created during the first installation are gone at this point
// How do I reuse the same container created in the install dep step?
steps {
sh 'npm run build'
}
}
stage('Test') {
agent {
docker { image 'node:10-alpine' }
}
steps {
sh 'npm run test'
}
}
}
}

// Later on, there is a deployment stage which MUST deploy using a specific node,
// which is why "agent: none" is used in the first place
}
}

请参阅 Jenkins Pipeline docker agent
:https://jenkins.io/doc/book/pipeline/syntax/#agent 的reuseNode选项

pipeline {
agent any
stages {
stage('NPM install') {
agent {
docker {
/*
* Reuse the workspace on the agent defined at top-level of
* Pipeline, but run inside a container.
*/
reuseNode true
image 'node:12.16.1'
}
}
environment {
/*
* Change HOME, because default is usually root dir, and
* Jenkins user may not have write permissions in that dir.
*/
HOME = "${WORKSPACE}"
}
steps {
sh 'env | sort'
sh 'npm install'
}
}
} 
}

您可以使用脚本化管道,您可以在docker步骤中放置多个stage步骤,例如

node {
checkout scm
docker.image('node:10-alpine').inside {
stage('Build') {
sh 'npm run build'
}
stage('Test') {
sh 'npm run test'
}
}
}

(代码未经测试(

对于声明式管道,一种解决方案是在项目的根目录中使用 Dockerfile。例如

Dockerfile

FROM node:10-alpine
// Further Instructions

詹金斯文件

pipeline{
agent {
dockerfile true
}
stage('Build') {
steps{
sh 'npm run build'
}
}
stage('Test') {
steps{
sh 'npm run test'
}
}
}

对于声明性管道,可以使用此处所述的嵌套阶段

上面的链接中有一个比这更好的例子,我只是不想逐字复制粘贴。

pipeline {
agent none
stages {
stage("Reuse Docker Image Across Sub-stages") {
agent { docker "image1" }
stages {
stage("sub stage 1") {
steps { sh "./one.sh" }
}
stage("sub stage 2") {
steps { sh "./two.sh" }
}
}
}
stage("Use new docker image for something else") 
agent { docker "image2" }
steps { sh "./three.sh" }
}
}
}

最新更新