Jenkins Pipeline: сборка Docker внутри Docker-контейнера

Jenkins Pipeline: сборка Docker внутри Docker-контейнера

Я пытаюсь сделать следующее

  1. Проверьте код
  2. Выполните некоторые предварительные проверки, используя другие образы Docker (не хочу устанавливать их на узел Jenkins)
  3. Сборка jar с использованием образа dockermaven:3.6-jdk-8
  4. Затем запустите Dockerfileсборку образа приложения
  5. Переместить изображение в репозиторий

Теперь я не хочу устанавливать ничего, кроме Docker на узле Jenkins. Я хочу запустить полный конвейер в контейнере Docker, чтобы добиться этого. Я борюсь с тем, как построить 4-й шаг изнутри контейнера.

Я написал Jenkinsfile следующим образом:

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

Но я не уверен, как создать образ docker в контейнере. Поиск не очень помог. Я пробовал использовать узел Jenkins для создания образа docker, но, похоже, я не могу смешивать и сопоставлять. Я полностью понимаю, что это довольно открытый вопрос, но я думаю, было бы полезно узнать прямой ответ(ы).

решение1

Я бы попробовал что-то вроде:

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

Эта reuseNodeопция должна позволить вам запустить сборку maven в контейнере, даже если проверка и сборка Docker выполняются на самом узле. См. документациюздесь.

Связанный контент