Jenkins Pipeline: Docker innerhalb eines Docker-Containers erstellen

Jenkins Pipeline: Docker innerhalb eines Docker-Containers erstellen

Ich versuche Folgendes zu tun

  1. Code auschecken
  2. Führen Sie einige Vorprüfungen mit anderen Docker-Images durch (Sie möchten diese nicht auf dem Jenkins-Knoten installieren).
  3. Erstellen Sie ein JAR mit einem Docker-Imagemaven:3.6-jdk-8
  4. Führen Sie es dann aus Dockerfile, um das App-Image zu erstellen
  5. Übertragen Sie das Image in das Repository

Nun möchte ich außer Docker nichts auf dem Jenkins-Knoten installieren. Um dies zu erreichen, möchte ich die gesamte Pipeline im Docker-Container ausführen. Was mir schwerfällt, ist, wie ich den 4. Schritt innerhalb des Containers erstellen kann.

Ich habe die Jenkins-Datei wie folgt geschrieben

pipeline {

    agent none
    
    stages {
        stage('Maven build') {
            agent {
                docker {
                    image 'maven:3.6-jdk-8'
                    args '-u root:root'
                }
            }
            steps {
                checkout(
                    [
                        $class: 'GitSCM',
                        branches: [
                            [name: '*/master']
                        ],
                        doGenerateSubmoduleConfigurations: false, 
                        extensions: [], 
                        submoduleCfg: [], 
                        userRemoteConfigs: [
                            [
                                credentialsId: '<cred-id>',
                                url: '<github-url>']
                            ]
                        ])
                        
                sh '''
                    set -eux pipefail

                    mvn -e clean install
                '''
            }
        }
        stage('Build docker image') {
             // Which docker image to use?
        }
    }
}

Aber ich bin mir nicht sicher, wie man ein Docker-Image innerhalb eines Containers erstellt. Die Suche hat nicht viel geholfen. Ich habe versucht, den Jenkins-Knoten zum Erstellen des Docker-Images zu verwenden, aber anscheinend kann ich nichts kombinieren. Ich verstehe vollkommen, dass dies eine ziemlich offene Frage ist, aber ich denke, es wäre hilfreich, die direkte(n) Antwort(en) zu kennen.

Antwort1

Ich würde so etwas versuchen:

pipeline {

    /*
     * Run everything on an existing agent configured with a label 'docker'.
     * This agent will need docker, git and a jdk installed at a minimum.
     */
    agent {
        node {
            label 'docker'
        }
    }

    // using the Timestamper plugin we can add timestamps to the console log
    options {
        timestamps()
    }

    environment {
        //Use Pipeline Utility Steps plugin to read information from pom.xml into env variables
        IMAGE = readMavenPom().getArtifactId()
        VERSION = readMavenPom().getVersion()
    }
    
    stages {

        stage('Clone repository') {
            /* 
             * Let's make sure we have the repository cloned to our workspace 
             */
            checkout(
                    [
                        $class: 'GitSCM',
                        branches: [
                            [name: '*/master']
                        ],
                        doGenerateSubmoduleConfigurations: false, 
                        extensions: [], 
                        submoduleCfg: [], 
                        userRemoteConfigs: [
                            [
                                credentialsId: '<cred-id>',
                                url: '<github-url>']
                            ]
                        ])
        }

        stage('Maven build') {
            agent {
                docker {
                    /*
                     * Reuse the workspace on the agent defined at top-level of
                     * Pipeline but run inside a container.
                     */
                    image 'maven:3.6-jdk-8'
                    reuseNode true
                }
            }
            steps {        
                sh '''
                    set -eux pipefail

                    mvn -e clean install
                '''
            }
            post {
                success {
                /* 
                 * Only worry about archiving the jar file 
                 * if the build steps are successful (this part may be not necessary)
                 */
                archiveArtifacts(artifacts: '**/target/*.jar', allowEmptyArchive: true)
                }
           }
        }
        stage('Build docker image') {
             steps {
                sh '''
                    docker build -t ${IMAGE} .
                    docker tag ${IMAGE} ${IMAGE}:${VERSION}
                    docker push ${IMAGE}:${VERSION}
                '''
            }
        }
    }
}

Mit dieser reuseNodeOption können Sie Maven Build im Container ausführen, auch wenn Checkout und Docker Build auf dem Knoten selbst ausgeführt werden. Siehe DokumentationHier.

verwandte Informationen