web-dev-qa-db-fra.com

Comment monter l'espace de travail Jenkins dans un conteneur Docker à l'aide du pipeline Jenkins

J'utilise Jenkins dans Docker. Le /var/jenkins_home est monté sur /var/jenkins-data sur mon hôte. Mon Jenkins peut exécuter des commandes docker (montage de sockets) et j'ai installé le plugin git et le plugin pipeline.

J'ai maintenant un travail de pipeline nommé test et le pipeline suivant:

pipeline {
    agent any
    stages {
        stage('Clone') {
            steps {
                git branch: 'master', url: 'https://github.com/lvthillo/maven-hello-world.git'
            }
        }

        stage('Build in Docker') {
            agent {
                docker {
                    image 'maven:3.5.2'
                    args '-v /var/jenkins_home/workspace/test:/opt/maven -w /opt/maven'
                }
            }

            steps {
                sh 'pwd'
                sh 'mvn -v'
                sh 'mvn clean install'
            }
        }
    }
}

Ce que je veux réaliser, c'est cloner mon dépôt public à partir de github. Cela marche. Dans l'étape suivante, je veux démarrer un conteneur Docker (maven) et imprimer le répertoire actuel, la version maven et effectuer une nouvelle installation.

La sortie des 3 commandes est:

[test@2] Running Shell script
+ pwd
/var/jenkins_home/workspace/test@2
[Pipeline] sh
[test@2] Running Shell script
+ mvn -v
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T07:58:13Z)
Maven home: /usr/share/maven
Java version: 1.8.0_151, vendor: Oracle Corporation
Java home: /usr/lib/jvm/Java-8-openjdk-AMD64/jre
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "4.4.86-boot2docker", Arch: "AMD64", family: "unix"
[Pipeline] sh
[test@2] Running Shell script
+ mvn clean install

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.179 s
[INFO] Finished at: 2018-01-12T12:12:00Z
[INFO] Final Memory: 5M/31M
[INFO] ------------------------------------------------------------------------
[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (/var/jenkins_home/workspace/test@2). Please verify you invoked Maven from the correct directory. -> [Help 1]

Cela semble fonctionner car maven n'est pas installé sur mon hôte, il est donc exécuté depuis l'intérieur du conteneur, mais il crée soudainement un nouvel espace de travail (@2) au lieu d'utiliser l'existant d'où j'ai cloné le dépôt. Je ne veux pas cloner le dépôt dans mon conteneur immédiatement parce que je veux plusieurs étapes, toutes avec des conteneurs différents, mais toutes exécutées sur mon dépôt git dans mon espace de travail.

Qu'est-ce que je fais mal ou comment puis-je résoudre ce problème? Je pensais que c'était peut-être à cause de l'étape d'agent. ma première étape peut s'exécuter sur n'importe quel agent (n'importe quel esclave), l'étape docker s'exécutera dans le conteneur docker, mais doit bien sûr s'exécuter sur le même esclave que le git clone a été exécuté.

14
lvthillo
pipeline {
agent any
stages {
    stage('Clone') {
        steps {
            git branch: 'master', url: 'https://github.com/lvthillo/maven-hello-world.git'
            stash name:'scm', includes:'*'
        }
    }

    stage('Build in Docker') {
        steps {
            unstash 'scm'
            script{
                docker.image('maven:3.5.2').inside{ 
                    sh 'pwd'
                    sh 'mvn -v'
                    sh 'mvn clean install'
                }
            }
        }
    }
}
}

Vous pouvez utiliser ce pipeline même avec une configuration à plusieurs nœuds. Le plugin Docker de cloudbees monte également votre espace de travail en tant qu'espace de travail Docker, il n'est donc pas nécessaire de monter un volume à moins qu'il ne soit en dehors de l'espace de travail.

12
Ram Kamath

Merci, la solution précédente fonctionne pour moi. Ma version pour le conteneur de nœuds et $ {PWD} en param

stage('Build Solution') { 
        agent {
            docker {
                image 'node:6-Alpine'
                args '-v ${PWD}:/usr/src/app -w /usr/src/app'
                reuseNode true
            }
        }
        steps {
            sh 'npm install'
        }
    }
9
Yuriy Shpool

Ma dernière explication m'a aidé à résoudre le problème: Cela texte m'a aidé à le résoudre. Je devais m'assurer que toutes les étapes de mon pipeline utilisaient le même agent que celui initial où j'ai effectué mon clone git:

Addit reuseNode true l'a résolu:

stage('Build in Docker') {
            agent {
                docker {
                    image 'maven:3.5.2'
                    args '-v /var/jenkins_home/workspace/test:/opt/maven -w /opt/maven'
                    reuseNode true
                }
            }
2
lvthillo

Le message d'erreur renvoyé par maven indique qu'il n'a pas pu trouver le fichier pom.xml dans le répertoire où l'exécution a été lancée.

J'ai eu le même problème, et résolu par cd dans le répertoire contenant mon projet pom.xml.

0
Francesco Bucciol