lib = library(identifier: 'jenkins@1.0.4', retriever: modernSCM([ $class: 'GitSCMSource', remote: 'https://github.com/opensearch-project/opensearch-build-libraries.git', ])) pipeline { options { timeout(time: 1, unit: 'HOURS') } agent none parameters { string(name: 'VERSION', description: 'The version of Data Prepper', trim: true) string(name: 'DATA_PREPPER_BUILD_NUMBER', description: 'The build number of the Data Prepper build from GitHub to release.', trim: true) booleanParam(name: 'RELEASE_MAJOR_TAG', description: 'Whether to create major tag of docker image or not', defaultValue: false) booleanParam(name: 'RELEASE_LATEST_TAG', description: 'Whether to create latest tag of docker image or not', defaultValue: false) } environment { DATA_PREPPER_ARTIFACT_STAGING_SITE = credentials('jenkins-data-prepper-artifact-staging-site') DATA_PREPPER_STAGING_CONTAINER_REPOSITORY = credentials('jenkins-data-prepper-staging-container-repository') ARTIFACT_PROMOTION_ROLE_NAME = credentials('jenkins-artifact-promotion-role') AWS_ACCOUNT_ARTIFACT = credentials('jenkins-aws-production-account') ARTIFACT_PRODUCTION_BUCKET_NAME = credentials('jenkins-artifact-production-bucket-name') } stages { stage('Promote Archives') { agent { docker { label 'Jenkins-Agent-AL2-X64-C54xlarge-Docker-Host' image 'opensearchstaging/ci-runner:ci-runner-centos7-opensearch-build-v3' args '-e JAVA_HOME=/opt/java/openjdk-11' registryUrl 'https://public.ecr.aws/' alwaysPull true } } stages { stage('Download Archives') { steps { script { archivePath = "${DATA_PREPPER_ARTIFACT_STAGING_SITE}/${VERSION}/${DATA_PREPPER_BUILD_NUMBER}/archive" dir('archive') { sh "curl -sSL ${archivePath}/opensearch-data-prepper-${VERSION}-linux-x64.tar.gz -o opensearch-data-prepper-${VERSION}-linux-x64.tar.gz" sh "curl -sSL ${archivePath}/opensearch-data-prepper-jdk-${VERSION}-linux-x64.tar.gz -o opensearch-data-prepper-jdk-${VERSION}-linux-x64.tar.gz" } } } } stage('Sign Archives') { steps { script { signatureType = '.sig' signArtifacts( artifactPath: "${WORKSPACE}/archive", sigtype: signatureType, platform: 'linux' ) } } } stage('Release Archives to Production Distribution Bucket') { steps { script { withAWS(role: "${ARTIFACT_PROMOTION_ROLE_NAME}", roleAccount: "${AWS_ACCOUNT_ARTIFACT}", duration: 900, roleSessionName: 'jenkins-session') { s3Upload(file: 'archive/', bucket: "${ARTIFACT_PRODUCTION_BUCKET_NAME}", path: "data-prepper/${VERSION}/") } } } } } post() { always { script { postCleanup() } } } } stage('Promote Docker') { agent { docker { label 'Jenkins-Agent-AL2-X64-C54xlarge-Docker-Host' image 'docker/library/alpine:3' registryUrl 'https://public.ecr.aws/' alwaysPull true } } stages { stage('Copy Docker Image to DockerHub') { steps { script { def dockerCopyHub = build job: 'docker-copy', parameters: [ string(name: 'SOURCE_IMAGE_REGISTRY', value: "${DATA_PREPPER_STAGING_CONTAINER_REPOSITORY}"), string(name: 'SOURCE_IMAGE', value: "data-prepper:${VERSION}-${DATA_PREPPER_BUILD_NUMBER}"), string(name: 'DESTINATION_IMAGE_REGISTRY', value: 'opensearchproject'), string(name: 'DESTINATION_IMAGE', value: "data-prepper:${VERSION}") ] if (params.RELEASE_MAJOR_TAG) { def majorVersion = VERSION.tokenize(".")[0].trim() def dockerCopyHubMajor = build job: 'docker-copy', parameters: [ string(name: 'SOURCE_IMAGE_REGISTRY', value: "${DATA_PREPPER_STAGING_CONTAINER_REPOSITORY}"), string(name: 'SOURCE_IMAGE', value: "data-prepper:${VERSION}-${DATA_PREPPER_BUILD_NUMBER}"), string(name: 'DESTINATION_IMAGE_REGISTRY', value: 'opensearchproject'), string(name: 'DESTINATION_IMAGE', value: "data-prepper:${majorVersion}") ] } if (params.RELEASE_LATEST_TAG) { def dockerCopyHubLatest = build job: 'docker-copy', parameters: [ string(name: 'SOURCE_IMAGE_REGISTRY', value: "${DATA_PREPPER_STAGING_CONTAINER_REPOSITORY}"), string(name: 'SOURCE_IMAGE', value: "data-prepper:${VERSION}-${DATA_PREPPER_BUILD_NUMBER}"), string(name: 'DESTINATION_IMAGE_REGISTRY', value: 'opensearchproject'), string(name: 'DESTINATION_IMAGE', value: "data-prepper:latest") ] } } } } stage('Copy Docker Image to ECR') { steps { script { def dockerCopyECR = build job: 'docker-copy', parameters: [ string(name: 'SOURCE_IMAGE_REGISTRY', value: "${DATA_PREPPER_STAGING_CONTAINER_REPOSITORY}"), string(name: 'SOURCE_IMAGE', value: "data-prepper:${VERSION}-${DATA_PREPPER_BUILD_NUMBER}"), string(name: 'DESTINATION_IMAGE_REGISTRY', value: 'public.ecr.aws/opensearchproject'), string(name: 'DESTINATION_IMAGE', value: "data-prepper:${VERSION}") ] if (params.RELEASE_MAJOR_TAG) { def majorVersion = VERSION.tokenize(".")[0].trim() def dockerCopyECRMajor = build job: 'docker-copy', parameters: [ string(name: 'SOURCE_IMAGE_REGISTRY', value: "${DATA_PREPPER_STAGING_CONTAINER_REPOSITORY}"), string(name: 'SOURCE_IMAGE', value: "data-prepper:${VERSION}-${DATA_PREPPER_BUILD_NUMBER}"), string(name: 'DESTINATION_IMAGE_REGISTRY', value: 'public.ecr.aws/opensearchproject'), string(name: 'DESTINATION_IMAGE', value: "data-prepper:${majorVersion}") ] } if (params.RELEASE_LATEST_TAG) { def dockerCopyECRLatest = build job: 'docker-copy', parameters: [ string(name: 'SOURCE_IMAGE_REGISTRY', value: "${DATA_PREPPER_STAGING_CONTAINER_REPOSITORY}"), string(name: 'SOURCE_IMAGE', value: "data-prepper:${VERSION}-${DATA_PREPPER_BUILD_NUMBER}"), string(name: 'DESTINATION_IMAGE_REGISTRY', value: 'public.ecr.aws/opensearchproject'), string(name: 'DESTINATION_IMAGE', value: "data-prepper:latest") ] } } } } } post() { always { script { postCleanup() } } } } stage('Promote Maven') { agent { docker { label 'Jenkins-Agent-AL2-X64-C54xlarge-Docker-Host' image 'opensearchstaging/ci-runner:ci-runner-centos7-opensearch-build-v3' args '-e JAVA_HOME=/opt/java/openjdk-11' registryUrl 'https://public.ecr.aws/' alwaysPull true } } stages { stage('Download Maven Artifacts') { steps { script { mavenPath = "${DATA_PREPPER_ARTIFACT_STAGING_SITE}/${VERSION}/${DATA_PREPPER_BUILD_NUMBER}/maven" group = "org/opensearch/dataprepper" artifacts = ["data-prepper-api"] fileTypes = ["-javadoc.jar", ".jar", ".pom", "-sources.jar", ".module"] checksums = ["", ".md5", ".sha1", ".sha256", ".sha512"] downloadArtifacts() } } } stage('Sign Maven Artifacts') { steps { script { signArtifacts( artifactPath: "${WORKSPACE}/maven", type: 'maven', platform: 'linux', sigtype: '.asc' ) } } } stage('Upload Artifacts to Sonatype') { environment { REPO_URL = "https://aws.oss.sonatype.org/" STAGING_PROFILE_ID = "${SONATYPE_STAGING_PROFILE_ID}" BUILD_ID = "${BUILD_ID}" } steps { script { // stage artifacts for release with Sonatype withCredentials([usernamePassword(credentialsId: 'jenkins-sonatype-creds', usernameVariable: 'SONATYPE_USERNAME', passwordVariable: 'SONATYPE_PASSWORD')]) { sh("$WORKSPACE/publish/stage-maven-release.sh $WORKSPACE/maven") } } } } } post() { always { script { postCleanup() } } } } } } def downloadArtifacts() { dir('maven') { for (artifact in artifacts) { sh "mkdir -p ${group}/${artifact}/${VERSION}" for (fileType in fileTypes) { for (checksum in checksums) { sh "curl -sSL ${mavenPath}/${group}/${artifact}/${VERSION}/${artifact}-${VERSION}${fileType}${checksum} -o ${group}/${artifact}/${VERSION}/${artifact}-${VERSION}${fileType}${checksum}" } } } } }