#! /usr/bin/groovy /* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or . */ /* * See https://github.com/hibernate/hibernate-jenkins-pipeline-helpers */ @Library('hibernate-jenkins-pipeline-helpers@1.17') _ // Avoid running the pipeline on branch indexing if (currentBuild.getBuildCauses().toString().contains('BranchIndexingCause')) { print "INFO: Build skipped due to trigger being Branch Indexing" currentBuild.result = 'NOT_BUILT' return } env.PROJECT = "orm" env.JIRA_KEY = "HHH" pipeline { agent { label 'Worker&&Containers' } tools { jdk 'OpenJDK 11 Latest' } options { buildDiscarder logRotator(daysToKeepStr: '30', numToKeepStr: '10') rateLimitBuilds(throttle: [count: 1, durationName: 'day', userBoost: true]) disableConcurrentBuilds(abortPrevious: false) preserveStashes() } parameters { string( name: 'RELEASE_VERSION', defaultValue: '', description: 'The version to be released, e.g. 6.2.1.Final.', trim: true ) string( name: 'DEVELOPMENT_VERSION', defaultValue: '', description: 'The next version to be used after the release, e.g. 6.2.2-SNAPSHOT.', trim: true ) booleanParam( name: 'RELEASE_DRY_RUN', defaultValue: false, description: 'If true, just simulate the release, without pushing any commits or tags, and without uploading any artifacts or documentation.' ) } stages { stage('Release check') { steps { script { // Avoid doing a release for commits from a release def lastCommitter = sh(script: 'git show -s --format=\'%an\'', returnStdout: true).trim() def secondLastCommitter = sh(script: 'git show -s --format=\'%an\' HEAD~1', returnStdout: true).trim() if (lastCommitter == 'Hibernate-CI' && secondLastCommitter == 'Hibernate-CI') { print "INFO: Release skipped because last commits were for the previous release" currentBuild.getRawBuild().getExecutor().interrupt(Result.NOT_BUILT) sleep(1) // Interrupt is not blocking and does not take effect immediately. return } dir('.release/scripts') { checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate-release-scripts.git']]) } // Determine version information for release process env.CURRENT_VERSION = sh( script: ".release/scripts/determine-current-version.sh ${env.PROJECT}", returnStdout: true ).trim() if ( params.RELEASE_VERSION == null || params.RELEASE_VERSION.isEmpty() ) { env.RELEASE_VERSION = sh( script: ".release/scripts/determine-release-version.sh ${env.CURRENT_VERSION}", returnStdout: true ).trim() } else { env.RELEASE_VERSION = params.RELEASE_VERSION } if ( params.DEVELOPMENT_VERSION == null || params.DEVELOPMENT_VERSION.isEmpty() ) { env.DEVELOPMENT_VERSION = sh( script: ".release/scripts/determine-development-version.sh ${env.RELEASE_VERSION}", returnStdout: true ).trim() } else { env.DEVELOPMENT_VERSION = params.DEVELOPMENT_VERSION } env.VERSION_BASIS = sh( script: ".release/scripts/determine-version-basis.sh ${env.RELEASE_VERSION}", returnStdout: true ).trim() env.VERSION_FAMILY = sh( script: ".release/scripts/determine-version-family.sh ${env.RELEASE_VERSION}", returnStdout: true ).trim() env.NEXT_VERSION_BASIS = sh( script: ".release/scripts/determine-version-basis.sh ${env.DEVELOPMENT_VERSION}", returnStdout: true ).trim() env.SCRIPT_OPTIONS = params.RELEASE_DRY_RUN ? "-d" : "" echo "Workspace version: ${env.CURRENT_VERSION}" echo "Release version: ${env.RELEASE_VERSION}" echo "Development version: ${env.DEVELOPMENT_VERSION}" echo "Version family: ${env.VERSION_FAMILY}" // Determine version id to check if Jira version exists sh(script: ".release/scripts/determine-jira-version-id.sh ${env.JIRA_KEY} ${env.VERSION_BASIS}", returnStdout: true) } } } stage('Release prepare') { steps { script { dir('.release/scripts') { checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate-release-scripts.git']]) } configFileProvider([configFile(fileId: 'release.config.ssh', targetLocation: "${env.HOME}/.ssh/config"), configFile(fileId: 'release.config.ssh.knownhosts', targetLocation: "${env.HOME}/.ssh/known_hosts")]) { withCredentials([ usernamePassword(credentialsId: 'ossrh.sonatype.org', passwordVariable: 'OSSRH_PASSWORD', usernameVariable: 'OSSRH_USER'), usernamePassword(credentialsId: 'gradle-plugin-portal-api-key', passwordVariable: 'PLUGIN_PORTAL_PASSWORD', usernameVariable: 'PLUGIN_PORTAL_USERNAME'), file(credentialsId: 'release.gpg.private-key', variable: 'RELEASE_GPG_PRIVATE_KEY_PATH'), string(credentialsId: 'release.gpg.passphrase', variable: 'RELEASE_GPG_PASSPHRASE') ]) { sshagent(['ed25519.Hibernate-CI.github.com', 'hibernate.filemgmt.jboss.org', 'hibernate-ci.frs.sourceforge.net']) { // set release version // update changelog from JIRA // tags the version // changes the version to the provided development version withEnv(["BRANCH=${env.GIT_BRANCH}"]) { sh ".release/scripts/prepare-release.sh ${env.PROJECT} ${env.RELEASE_VERSION} ${env.DEVELOPMENT_VERSION}" } } } } } } } stage('Publish release') { steps { script { dir('.release/scripts') { checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate-release-scripts.git']]) } configFileProvider([configFile(fileId: 'release.config.ssh', targetLocation: "${env.HOME}/.ssh/config"), configFile(fileId: 'release.config.ssh.knownhosts', targetLocation: "${env.HOME}/.ssh/known_hosts")]) { withCredentials([ usernamePassword(credentialsId: 'ossrh.sonatype.org', passwordVariable: 'OSSRH_PASSWORD', usernameVariable: 'OSSRH_USER'), usernamePassword(credentialsId: 'gradle-plugin-portal-api-key', passwordVariable: 'PLUGIN_PORTAL_PASSWORD', usernameVariable: 'PLUGIN_PORTAL_USERNAME'), file(credentialsId: 'release.gpg.private-key', variable: 'RELEASE_GPG_PRIVATE_KEY_PATH'), string(credentialsId: 'release.gpg.passphrase', variable: 'RELEASE_GPG_PASSPHRASE'), gitUsernamePassword(credentialsId: 'username-and-token.Hibernate-CI.github.com', gitToolName: 'Default') ]) { sshagent(['ed25519.Hibernate-CI.github.com', 'hibernate.filemgmt.jboss.org', 'hibernate-ci.frs.sourceforge.net']) { // performs documentation upload and Sonatype release // push to github sh ".release/scripts/publish.sh ${env.SCRIPT_OPTIONS} ${env.PROJECT} ${env.RELEASE_VERSION} ${env.DEVELOPMENT_VERSION} ${env.GIT_BRANCH}" } } } } } } stage('Website release') { steps { script { dir('.release/scripts') { checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate-release-scripts.git']]) } configFileProvider([configFile(fileId: 'release.config.ssh', targetLocation: "${env.HOME}/.ssh/config"), configFile(fileId: 'release.config.ssh.knownhosts', targetLocation: "${env.HOME}/.ssh/known_hosts")]) { withCredentials([ gitUsernamePassword(credentialsId: 'username-and-token.Hibernate-CI.github.com', gitToolName: 'Default') ]) { sshagent( ['ed25519.Hibernate-CI.github.com', 'hibernate.filemgmt.jboss.org', 'hibernate-ci.frs.sourceforge.net'] ) { dir( '.release/hibernate.org' ) { checkout scmGit( branches: [[name: '*/production']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate.org.git']] ) sh "../scripts/website-release.sh ${env.SCRIPT_OPTIONS} ${env.PROJECT} ${env.RELEASE_VERSION}" } } } } } } } stage('GitHub release') { steps { script { dir('.release/scripts') { checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'ed25519.Hibernate-CI.github.com', url: 'https://github.com/hibernate/hibernate-release-scripts.git']]) } withCredentials([string(credentialsId: 'Hibernate-CI.github.com', variable: 'GITHUB_API_TOKEN')]) { sh ".release/scripts/github-release.sh ${env.SCRIPT_OPTIONS} ${env.PROJECT} ${env.RELEASE_VERSION}" } } } } } post { always { configFileProvider([configFile(fileId: 'job-configuration.yaml', variable: 'JOB_CONFIGURATION_FILE')]) { notifyBuildResult maintainers: (String) readYaml(file: env.JOB_CONFIGURATION_FILE).notification?.email?.recipients } } } }