Конвейер Jenkins для создания артефактов Maven и изображения Docker - PullRequest
0 голосов
/ 05 августа 2020

Мне нужен мой конвейер для создания SNAPSHOT или артефакта выпуска, а затем также создания изображения Docker с тегом latest или номером версии выпуска. Я использую плагин fabric8 и пользуюсь преимуществом функции, которая будет создавать тег на основе поля версии файла POM.

Из-за порядка этапов тег всегда будет последним, независимо от того, это снимок или релиз. Мне нужна помощь, чтобы определить правильный способ сделать это, так как я не вижу способа разместить их в другом порядке.

Используемые инструменты: Maven + fabric8, Jenkins, Artifactory и SVN.

После выпуска Maven и шагов подготовки POM будет иметь версию SNAPSHOT, поэтому на этапе «Create Docker Image» всегда будет создаваться тег «latest».

Я мог бы сделать что-то вроде рисунка узнать, что такое URL-адрес тега SVN для выпущенной версии, проверить его, а затем выполнить мою сборку. Хотя это кажется неправильным, но, возможно, и нет. Должен быть более «официальный» способ сделать это.

pipeline{
    agent any
    
    tools{
        maven 'M3'
    }
    
    parameters {
        booleanParam(
            name: 'RELEASE',
            description: 'Build a release from current commit.',
            defaultValue: false
        )
        booleanParam(
            name: 'SCAN_CODE',
            description: 'Scan your code to see how awesome it is.',
            defaultValue: true
        )        
    }
    
    environment {
        ARTIFACT_ID = readMavenPom().getArtifactId()
    }
    
    stages{
        stage("Unit tests"){
            steps{
                configFileProvider([configFile(fileId: '1a4e39cc-eacf-4bd0-af47-337f536fd2bd', variable: 'MVN_SETTINGS')]) {
                    sh 'mvn -gs $MVN_SETTINGS test '
                }
            }
        }
        stage("SonarQube Scan"){
            when {
                expression { params.SCAN_CODE == true}
            }         
            steps{
                withSonarQubeEnv('codequality') {
                    configFileProvider([configFile(fileId: '1a4e39cc-eacf-4bd0-af47-337f536fd2bd', variable: 'MVN_SETTINGS')]) {
                        sh 'mvn clean install -gs $MVN_SETTINGS ' + 
                                'org.sonarsource.scanner.maven:sonar-maven-plugin:3.3.0.603:sonar -f pom.xml ' +
                                '-DskipTests' +
                                '-Dsonar.projectKey=com.etisoftware:$ARTIFACT_ID ' +
                                '-Dsonar.login=$DOCKER_REPO_USER ' +
                                '-Dsonar.password=$DOCKER_REPO_PASSWORD ' +
                                '-Dsonar.language=java ' +
                                '-Dsonar.sources=. ' +
                                '-Dsonar.tests=. ' +
                                '-Dsonar.test.inclusions=**/*Test*/** ' +
                                '-Dsonar.exclusions=**/*Test*/**'
                    }
                }
            }
        }
        stage("Quality Gate") {
            when {
                expression { params.SCAN_CODE == true}
            }          
            steps {
                timeout(time: 5, unit: 'MINUTES') {
                    // Parameter indicates whether to set pipeline to UNSTABLE if Quality Gate fails
                    // true = set pipeline to UNSTABLE, false = don't
                    waitForQualityGate abortPipeline: true
                }
            }
        }        
        stage("Build Snapshot"){
            when {
                expression { params.RELEASE == false}
            } 
            steps{
                configFileProvider([configFile(fileId: '1a4e39cc-eacf-4bd0-af47-337f536fd2bd', variable: 'MVN_SETTINGS')]) {
                    sh 'mvn -gs $MVN_SETTINGS -DskipTests clean deploy'
                }
            }
        }
        stage("Release") {
            when {
                expression { params.RELEASE == true}
            }
            steps {
                configFileProvider([configFile(fileId: '1a4e39cc-eacf-4bd0-af47-337f536fd2bd', variable: 'MVN_SETTINGS')]) {
                    sh 'mvn -gs $MVN_SETTINGS clean; ' + 
                       'mvn -gs $MVN_SETTINGS -B release:prepare; ' +
                       'mvn -gs $MVN_SETTINGS -B release:perform'
                }
            }
        }
        stage("Create Docker Image"){
            steps{
                configFileProvider([configFile(fileId: '1a4e39cc-eacf-4bd0-af47-337f536fd2bd', variable: 'MVN_SETTINGS')]) {
                    sh 'mvn -gs $MVN_SETTINGS ' +
                        '-Ddocker.username=${DOCKER_REPO_USER} -Ddocker.password=${DOCKER_REPO_PASSWORD} ' +
                        '-DskipTests ' +
                        'clean package spring-boot:repackage ' +
                        'docker:build docker:push'
                }
            }
        }
    }
    
    post{
        always{
            cleanWs()
        }

    }
}

1 Ответ

0 голосов
/ 11 августа 2020

Решение - использовать файл POM из target / checkout. См. Этап «Создание Docker изображения для выпуска».

pipeline{
agent any

tools{
    maven 'M3'
}

parameters {
    booleanParam(
        name: 'RELEASE',
        description: 'Build a release from current commit.',
        defaultValue: false
    )
    booleanParam(
        name: 'SCAN_CODE', 
        description: 'Scan your code to see how awesome it is.',
        defaultValue: true
    )        
}

environment {
    ARTIFACT_ID = readMavenPom().getArtifactId()
}

stages{
    stage("Unit tests"){
        steps{
            configFileProvider([configFile(fileId: '1a4e39cc-eacf-4bd0-af47-337f536fd2bd', variable: 'MVN_SETTINGS')]) {
                sh 'mvn -gs $MVN_SETTINGS test '
            }
        }
    }
    stage("SonarQube Scan"){
        when {
            expression { params.SCAN_CODE == true}
        }         
        steps{
            withSonarQubeEnv('codequality') {
                configFileProvider([configFile(fileId: '1a4e39cc-eacf-4bd0-af47-337f536fd2bd', variable: 'MVN_SETTINGS')]) {
                    sh 'mvn clean install -gs $MVN_SETTINGS ' + 
                            'org.sonarsource.scanner.maven:sonar-maven-plugin:3.3.0.603:sonar -f pom.xml ' +
                            '-DskipTests' +
                            '-Dsonar.projectKey=com.etisoftware:$ARTIFACT_ID ' +
                            '-Dsonar.login=$DOCKER_REPO_USER ' +
                            '-Dsonar.password=$DOCKER_REPO_PASSWORD ' +
                            '-Dsonar.language=java ' +
                            '-Dsonar.sources=. ' +
                            '-Dsonar.tests=. ' +
                            '-Dsonar.test.inclusions=**/*Test*/** ' +
                            '-Dsonar.exclusions=**/*Test*/**'
                }
            }
        }
    }
    stage("Quality Gate") {
        when {
            expression { params.SCAN_CODE == true}
        }          
        steps {
            timeout(time: 5, unit: 'MINUTES') {
                // Parameter indicates whether to set pipeline to UNSTABLE if Quality Gate fails
                // true = set pipeline to UNSTABLE, false = don't
                waitForQualityGate abortPipeline: true
            }
        }
    }        
    stage("Build Snapshot"){
        when {
            expression { params.RELEASE == false}
        } 
        steps{
            configFileProvider([configFile(fileId: '1a4e39cc-eacf-4bd0-af47-337f536fd2bd', variable: 'MVN_SETTINGS')]) {
                sh 'mvn -gs $MVN_SETTINGS -DskipTests clean deploy'
            }
        }
    }
    // SNAPSHOTS
    stage("Create Docker Image For SNAPSHOT"){
        when {
            expression { params.RELEASE == false}
        }        
        steps{
            configFileProvider([configFile(fileId: '1a4e39cc-eacf-4bd0-af47-337f536fd2bd', variable: 'MVN_SETTINGS')]) {
                sh 'mvn -gs $MVN_SETTINGS ' +
                    '-Ddocker.username=${DOCKER_REPO_USER} -Ddocker.password=${DOCKER_REPO_PASSWORD} ' +
                    '-DskipTests ' +
                    'clean package spring-boot:repackage ' +
                    'docker:build docker:push'
            }
        }
    }        
    // RELEASES
    stage("Release") {
        when {
            expression { params.RELEASE == true}
        }
        steps {
            configFileProvider([configFile(fileId: '1a4e39cc-eacf-4bd0-af47-337f536fd2bd', variable: 'MVN_SETTINGS')]) {
                sh 'mvn -gs $MVN_SETTINGS clean'
                sh 'mvn -gs $MVN_SETTINGS -B release:prepare'
                sh 'mvn -gs $MVN_SETTINGS -B release:perform'
            }
        }
    }
    stage("Create Docker Image For Release"){
        when {
            expression { params.RELEASE == true}
        }        
        steps{
            configFileProvider([configFile(fileId: '1a4e39cc-eacf-4bd0-af47-337f536fd2bd', variable: 'MVN_SETTINGS')]) {
                sh 'mvn -gs $MVN_SETTINGS ' +
                    '-f target/checkout/pom.xml ' +
                    '-Ddocker.username=${DOCKER_REPO_USER} -Ddocker.password=${DOCKER_REPO_PASSWORD} ' +
                    '-DskipTests ' +
                    'clean package spring-boot:repackage ' +
                    'docker:build docker:push'
            }
        }
    }
}

post{
    always{
        cleanWs()
    }
}

}

...