J'ai un pipeline à plusieurs étapes et je souhaite réutiliser un conteneur Docker entre seulement "n" nombre d'étapes, plutôt que toutes:
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
}
}
Vous pouvez utiliser pipelines scriptés , où vous pouvez placer plusieurs étapes stage
à l'intérieur d'une étape docker
, par exemple.
node {
checkout scm
docker.image('node:10-Alpine').inside {
stage('Build') {
sh 'npm run build'
}
stage('Test') {
sh 'npm run test'
}
}
}
(code non testé)
Pour le pipeline déclaratif, une solution peut être d'utiliser Dockerfile à la racine du projet. Par exemple.
Dockerfile
FROM node:10-Alpine
// Further Instructions
Jenkinsfile
pipeline{
agent {
dockerfile true
}
stage('Build') {
steps{
sh 'npm run build'
}
}
stage('Test') {
steps{
sh 'npm run test'
}
}
}