web-dev-qa-db-fra.com

Commande Docker introuvable dans le pipeline multi-branches Jenkins local

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.

 Global Tool Configuration

4
Jadda

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

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.

(Option 1 - préférable) Définir l'étiquette du menu fixe dans Jenkinsfile

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

(Option 2) Définir l’étiquette du menu fixe dans la configuration

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.

1
Nickofthyme

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.

  • télécharger l'installateur de docker,
  • installez-le et 
  • donnez le chemin de l'installateur à Jenkins.

Exemple d'écran est ci-dessous. 

Configurez le chemin d'installation du menu fixe dans Jenkins sous Configuration globale de l'outil

0
Ayush Verma

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.

0
PankajSays