diff --git a/.ci/jenkins/Jenkinsfile.deploy b/.ci/jenkins/Jenkinsfile.deploy index d38318ce20..8720e139a5 100644 --- a/.ci/jenkins/Jenkinsfile.deploy +++ b/.ci/jenkins/Jenkinsfile.deploy @@ -34,6 +34,8 @@ pipeline { PR_BRANCH_HASH = "${util.generateHash(10)}" + // Maven configuration + MAVEN_DEPLOY_LOCAL_DIR = "/tmp/maven_deploy_dir" } stages { @@ -113,21 +115,13 @@ pipeline { stage('Build OptaPlanner') { steps { script { - withCredentials([usernamePassword(credentialsId: env.MAVEN_REPO_CREDS_ID, usernameVariable: 'REPOSITORY_USER', passwordVariable: 'REPOSITORY_TOKEN')]) { - def installOrDeploy - if (shouldDeployToRepository()) { - installOrDeploy = "deploy -DdeployAtEnd -Dapache.repository.username=${REPOSITORY_USER} -Dapache.repository.password=${REPOSITORY_TOKEN} -DretryFailedDeploymentCount=5" - } else { - installOrDeploy = 'install' - } - configFileProvider([configFile(fileId: env.MAVEN_SETTINGS_CONFIG_FILE_ID, variable: 'MAVEN_SETTINGS_FILE')]){ - getOptaplannerMavenCommand() - .withProperty('maven.test.failure.ignore', true) - .withProperty('operator.image.build') - .skipTests(params.SKIP_TESTS) - .withSettingsXmlFile(MAVEN_SETTINGS_FILE) - .run("clean $installOrDeploy") - } + configFileProvider([configFile(fileId: env.MAVEN_SETTINGS_CONFIG_FILE_ID, variable: 'MAVEN_SETTINGS_FILE')]){ + getOptaplannerMavenCommand() + .withProperty('maven.test.failure.ignore', true) + .withProperty('operator.image.build') + .skipTests(params.SKIP_TESTS) + .withSettingsXmlFile(MAVEN_SETTINGS_FILE) + .run('clean install') } if (isRelease()) { updateAntoraYaml(optaplannerFolder) @@ -165,6 +159,46 @@ pipeline { } } } + stage('Deploy locally') { + steps { + script { + runMavenDeploy(getOptaplannerMavenCommand(), optaplannerRepository) + } + } + } + stage('Deploy to repository') { + when { + expression { return shouldDeployToRepository() } + } + steps { + script { + withCredentials([usernamePassword(credentialsId: env.MAVEN_REPO_CREDS_ID, usernameVariable: 'REPOSITORY_USER', passwordVariable: 'REPOSITORY_TOKEN')]) { + configFileProvider([configFile(fileId: env.MAVEN_SETTINGS_CONFIG_FILE_ID, variable: 'MAVEN_SETTINGS_FILE')]) { + new MavenCommand(this) + .withSettingsXmlFile(MAVEN_SETTINGS_FILE) + .withProperty('wagon.source', "file://${getLocalDeploymentFolder(optaplannerRepository)}") + .withProperty('wagon.target', MAVEN_DEPLOY_REPOSITORY) + .withProperty('wagon.targetId', 'apache-snapshots-repository') + .withProperty('apache.snapshot.repository.username', REPOSITORY_USER) + .withProperty('apache.snapshot.repository.password', REPOSITORY_TOKEN) + .run("org.codehaus.mojo:wagon-maven-plugin:2.0.2:merge-maven-repos") + } + } + } + } + } + +// stage('Upload artifacts to given repository') { +// when { +// expression { return isSpecificArtifactsUpload() } +// } +// steps { +// script { +// // Deploy to specific repository with credentials +// maven.uploadLocalArtifacts(env.MAVEN_REPO_CREDS_ID, getLocalDeploymentFolder(optaplannerRepository), getMavenRepoZipUrl()) +// } +// } +// } stage('Stage artifacts') { when { expression { return shouldStageArtifacts() } @@ -397,8 +431,32 @@ String getMavenRepoZipUrl() { return "${params.MAVEN_DEPLOY_REPOSITORY.replaceAll('/content/', '/service/local/').replaceFirst('/*$', '')}/content-compressed" } +void runMavenStage(MavenCommand mvnCmd, String localDeployId) { + MavenStagingHelper stagingHelper = getStagingHelper(mvnCmd) + deployProperties.putAll(stagingHelper.stageLocalArtifacts(env.NEXUS_STAGING_PROFILE_ID, getLocalDeploymentFolder(localDeployId))) + stagingHelper.promoteStagingRepository(env.NEXUS_BUILD_PROMOTION_PROFILE_ID) +} + +MavenStagingHelper getStagingHelper(MavenCommand mvnCmd) { + return new MavenStagingHelper(this, mvnCmd) + .withNexusReleaseUrl(env.NEXUS_RELEASE_URL) + .withNexusReleaseRepositoryId(env.NEXUS_RELEASE_REPOSITORY_ID) +} + +String getLocalDeploymentFolder(String localDeployId) { + return "${env.MAVEN_DEPLOY_LOCAL_DIR}/${localDeployId}" +} + // Getters and Setters of params/properties +boolean isSpecificArtifactsUpload() { + return env.MAVEN_DEPLOY_REPOSITORY && env.MAVEN_REPO_CREDS_ID && !isDeployDisabled() +} + +boolean shouldStageArtifacts() { + return !isSpecificArtifactsUpload() && isRelease() && !env.MAVEN_DEPLOY_REPOSITORY && !isDeployDisabled() +} + boolean shouldDeployToRepository() { return (env.MAVEN_DEPLOY_REPOSITORY || isNotTestingBuild()) && !isDeployDisabled() } diff --git a/.ci/jenkins/dsl/jobs.groovy b/.ci/jenkins/dsl/jobs.groovy index 37622bfc1a..c4f1385a9f 100644 --- a/.ci/jenkins/dsl/jobs.groovy +++ b/.ci/jenkins/dsl/jobs.groovy @@ -313,6 +313,14 @@ void setupDeployJob(JobType jobType, String envName = '') { OPERATOR_IMAGE_NAME: 'optaplanner-operator', MAX_REGISTRY_RETRIES: 3, ]) + if (jobType == JobType.RELEASE) { + jobParams.env.putAll([ + NEXUS_RELEASE_URL: "${MAVEN_NEXUS_RELEASE_URL}", + NEXUS_RELEASE_REPOSITORY_ID: "${MAVEN_NEXUS_RELEASE_REPOSITORY}", + NEXUS_STAGING_PROFILE_ID: "${MAVEN_NEXUS_STAGING_PROFILE_ID}", + NEXUS_BUILD_PROMOTION_PROFILE_ID: "${MAVEN_NEXUS_BUILD_PROMOTION_PROFILE_ID}", + ]) + } } KogitoJobTemplate.createPipelineJob(this, jobParams)?.with { parameters {