Мне нужен мой конвейер для создания 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()
}
}
}