J'ai le projet BookStore Spring Boot qui doit être déployé via Jenkins. Docker installé sur ma machine locale (macOS) et Jenkinsfile créé comme suit
pipeline
{
agent
{
docker
{
image 'maven:3-Alpine'
//This exposes application through port 8081 to outside world
args '-u root -p 8081:8081 -v /var/run/docker.sock:/var/run/docker.sock '
}
}
stages
{
stage('Build')
{
steps
{
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test')
{
steps {
//sh 'mvn test'
sh 'echo "test"'
}
post {
always {
//junit 'target/surefire-reports/*.xml'
sh 'echo "test"'
}
}
}
stage('Deliver for development')
{
when {
branch 'development'
}
steps {
sh './jenkins/scripts/deliver-for-development.sh'
input message: 'Finished using the web site? (Click "Proceed" to continue)'
}
}
stage('Deploy for production')
{
when {
branch 'production'
}
steps {
sh './jenkins/scripts/deploy-for-production.sh'
input message: 'Finished using the web site? (Click "Proceed" to continue)'
}
}
stage('Deliver') {
when {
branch 'production'
}
steps {
sh 'bash ./jenkins/deliver.sh'
}
}
}
}
J'ai créé un pipeline multi-branches dans Jenkins et lorsque j'essaie de l'exécuter, j'ai l'erreur suivante.
/Users/Shared/Jenkins/Home/workspace/BookStore_master-VPWQ32ZZPV7CVOXNI4XOB3VSGH56MTF3W34KXKZFJKOBMSGLRZQQ@tmp/durable-70dd5a81/script.sh: line 2: docker: command not found
script returned exit code 127
Cela me semble étrange, car le menu fixe est disponible sur la machine locale et la section configurée Global Tool avec les détails appropriés, comme indiqué ci-dessous. J'ai examiné plusieurs messages et aucune des solutions n'a fonctionné jusqu'à présent.
J'ai pu résoudre ce problème en récupérant les valeurs Docker et Maven dans Global Tool Configuration section et en les ajoutant à l'environnement PATH comme indiqué ci-dessous
Mise à jour Jenkinsfile :
node {
stage('Initialize')
{
def dockerHome = tool 'MyDocker'
def mavenHome = tool 'MyMaven'
env.PATH = "${dockerHome}/bin:${mavenHome}/bin:${env.PATH}"
}
stage('Checkout')
{
checkout scm
}
stage('Build')
{
sh 'uname -a'
sh 'mvn -B -DskipTests clean package'
}
stage('Test')
{
//sh 'mvn test'
sh 'ifconfig'
}
stage('Deliver')
{
sh 'bash ./jenkins/deliver.sh'
}
}
J'ai eu le même problème et j'ai pu le résoudre grâce à ce fil https://stackoverflow.com/a/50029962/6943587 .
Vous devez spécifier l’étiquette du menu fixe, c’est-à-dire quel esclave possède un menu fixe. À ma connaissance, il y a deux façons de procéder.
Définissez l'agent en tant qu'image de menu fixe avec une étiquette de menu fixe.
// Jenkinsfile
pipeline {
// Assign to docker slave(s) label, could also be 'any'
agent {
label 'docker'
}
stages {
stage('Docker node test') {
agent {
docker {
// Set both label and image
label 'docker'
image 'node:7-Alpine'
args '--name docker-node' // list any args
}
}
steps {
// Steps run in node:7-Alpine docker container on docker slave
sh 'node --version'
}
}
stage('Docker maven test') {
agent {
docker {
// Set both label and image
label 'docker'
image 'maven:3-Alpine'
}
}
steps {
// Steps run in maven:3-Alpine docker container on docker slave
sh 'mvn --version'
}
}
}
}
Définissez "l'étiquette du menu fixe" dans la configuration Jenkins sous "Définition du modèle de pipeline", conformément à la documentation Jenkins ici . Cela n'exécutera que les constructions de pipeline sur des esclaves portant cette étiquette. Ensuite, vous pouvez créer votre pipeline comme si ...
// Jenkinsfile
pipeline {
// "Top-level" agent is assigned to docker slaves via Jenkins pipeline configuration
agent none
stages {
stage('Docker node test') {
agent {
docker {
image 'node:7-Alpine'
args '--name docker-node' // list any args
}
}
steps {
// Steps run in node:7-Alpine docker container on docker slave
sh 'node --version'
}
}
stage('Docker maven test') {
agent {
docker {
image 'maven:3-Alpine'
}
}
steps {
// Steps run in maven:3-Alpine docker container on docker slave
sh 'mvn --version'
}
}
}
}
J'espère que cela t'aides
L'option 1 est préférable à l'option 2 car Jenkinsfile configure sur quelle machine exécuter les agents de menu fixe sans s’appuyer sur le fichier Configuration du pipeline Jenkins qui pourrait être supprimée ou modifiée dans le fichier futur.
Puisque vous avez choisi l'option install automatiquement dans la section Configuration globale de l'outil, Jenkins ne recherchera pas le menu fixe dans votre système.
Vous pouvez résoudre ce problème en décochant l'option install automatiquement pour le menu fixe dans la section Configuration globale de l'outil.
Exemple d'écran est ci-dessous.
Configurez le chemin d'installation du menu fixe dans Jenkins sous Configuration globale de l'outil
Il semble y avoir un problème avec le programme d'installation automatisé de docker. J'ai rencontré le même problème sur docker sur centos 7.
J'ai téléchargé les exécutables de docker cli à partir de https://download.docker.com/linux/static/stable/x86_64/ et les ai extraits dans le volume de docker Jenkins sur l'hôte (/ var/lib/docker/volumes/jenkins_home/_data/docker). Copiez ensuite de/var/jenkins_home/docker vers/usr/bin en utilisant Shell sur le conteneur de docker.
Après avoir copié les exécutables, la construction a fonctionné comme prévu.