Files
SCM-Manager/Jenkinsfile

313 lines
9.9 KiB
Plaintext
Raw Normal View History

2018-05-31 12:34:34 +02:00
#!groovy
2021-01-13 13:30:44 +01:00
pipeline {
2021-01-13 13:30:44 +01:00
options {
buildDiscarder(logRotator(numToKeepStr: '10'))
2020-03-11 11:05:54 +01:00
disableConcurrentBuilds()
2021-01-13 13:30:44 +01:00
}
2018-05-31 12:34:34 +02:00
2021-01-13 13:30:44 +01:00
agent {
docker {
image 'scmmanager/java-build:11.0.15_10-2'
2021-01-14 20:17:18 +01:00
args '-v /var/run/docker.sock:/var/run/docker.sock --group-add 998'
2021-01-13 13:30:44 +01:00
label 'docker'
}
}
2018-05-31 12:34:34 +02:00
2021-01-13 13:30:44 +01:00
environment {
HOME = "${env.WORKSPACE}"
SONAR_USER_HOME = "${env.WORKSPACE}/.sonar"
}
2018-05-31 12:34:34 +02:00
2021-01-13 13:30:44 +01:00
stages {
2018-05-31 12:34:34 +02:00
2021-01-13 13:30:44 +01:00
stage('Set Version') {
when {
2022-01-18 09:24:26 +01:00
anyOf {
branch pattern: 'release/*', comparator: 'GLOB'
branch pattern: 'hotfix/*', comparator: 'GLOB'
}
}
2021-01-13 13:30:44 +01:00
steps {
// read version from branch, set it and commit it
2021-01-29 12:06:17 +01:00
gradle "setVersion -PnewVersion=${releaseVersion}"
sh "git add gradle.properties '**.json'"
2022-12-07 10:37:45 +01:00
sh "git checkout ${env.BRANCH_NAME}"
2021-01-13 13:30:44 +01:00
commit "Release version ${releaseVersion}"
// fetch all remotes from origin
sh 'git config --replace-all "remote.origin.fetch" "+refs/heads/*:refs/remotes/origin/*"'
sh 'git fetch --all'
2022-01-18 09:24:26 +01:00
script {
if (isReleaseBuild()) {
// checkout, reset and merge
sh 'git checkout main'
sh 'git reset --hard origin/main'
2022-01-18 09:24:26 +01:00
sh "git merge --ff-only ${env.BRANCH_NAME}"
}
}
2021-01-13 13:30:44 +01:00
// set tag
tag releaseVersion
2020-03-11 11:05:54 +01:00
}
2021-01-13 13:30:44 +01:00
}
2020-03-11 11:05:54 +01:00
2021-01-13 13:30:44 +01:00
stage('Build') {
steps {
// build without tests
2021-01-14 08:29:36 +01:00
gradle "-xtest build"
}
2021-01-13 13:30:44 +01:00
}
2018-05-31 12:34:34 +02:00
2021-01-13 13:30:44 +01:00
stage('Check') {
steps {
catchError(buildResult: 'UNSTABLE', stageResult: 'UNSTABLE') {
withCheckEnvironment {
gradle 'check'
}
}
2021-01-13 13:30:44 +01:00
junit allowEmptyResults: true, testResults: '**/build/test-results/test/TEST-*.xml,**/build/test-results/tests/test/TEST-*.xml,**/build/jest-reports/TEST-*.xml'
}
2021-01-13 13:30:44 +01:00
}
2018-09-24 13:03:02 +02:00
2021-01-13 13:30:44 +01:00
// in parallel with check?
stage('Integration Tests') {
steps {
2021-01-20 11:26:40 +01:00
// TODO remove obligatory rerun flag when flappy tests have been fixed
gradle '-PrerunIntegrationTests integrationTest'
2021-01-13 13:30:44 +01:00
junit allowEmptyResults: true, testResults: 'scm-it/build/test-results/javaIntegrationTests/*.xml,scm-ui/build/reports/e2e/*.xml'
archiveArtifacts allowEmptyArchive: true, artifacts: 'scm-ui/e2e-tests/cypress/videos/*.mp4'
archiveArtifacts allowEmptyArchive: true, artifacts: 'scm-ui/e2e-tests/cypress/screenshots/**/*.png'
}
}
stage('SonarQube') {
2021-01-13 13:30:44 +01:00
steps {
sh 'git config --replace-all "remote.origin.fetch" "+refs/heads/*:refs/remotes/origin/*"'
sh 'git fetch origin develop'
2021-01-13 13:30:44 +01:00
script {
withSonarQubeEnv('sonarcloud.io-scm') {
String parameters = ' -Dsonar.organization=scm-manager'
if (env.CHANGE_ID) {
parameters += ' -Dsonar.pullrequest.provider=GitHub'
parameters += ' -Dsonar.pullrequest.github.repository=scm-manager/scm-manager'
parameters += " -Dsonar.pullrequest.key=${env.CHANGE_ID}"
parameters += " -Dsonar.pullrequest.branch=${env.CHANGE_BRANCH}"
parameters += " -Dsonar.pullrequest.base=${env.CHANGE_TARGET}"
} else {
parameters += " -Dsonar.branch.name=${env.BRANCH_NAME}"
if (env.BRANCH_NAME != "develop") {
parameters += " -Dsonar.branch.target=develop"
}
2020-03-11 11:05:54 +01:00
}
2021-01-14 08:29:36 +01:00
gradle "sonarqube ${parameters}"
2020-05-26 09:47:38 +02:00
}
2020-05-10 21:47:35 +02:00
}
2021-01-13 13:30:44 +01:00
}
}
2020-03-11 11:05:54 +01:00
2021-01-13 13:30:44 +01:00
stage('Deployment') {
when {
anyOf {
branch pattern: 'release/*', comparator: 'GLOB'
2022-01-18 09:24:26 +01:00
branch pattern: 'hotfix/*', comparator: 'GLOB'
branch 'develop'
}
2021-01-13 13:30:44 +01:00
expression { return isBuildSuccess() }
}
steps {
withPublishEnvironment {
gradle "-PenablePackaging publish"
}
}
}
stage('Update tap') {
when {
anyOf {
branch pattern: 'release/*', comparator: 'GLOB'
branch pattern: 'hotfix/*', comparator: 'GLOB'
}
expression { return isBuildSuccess() }
}
steps {
build wait: false, propagate: false, job: 'scm-manager-github/homebrew-tap/master', parameters: [
string(name: 'Version', value: getReleaseVersion())
]
2021-01-13 13:30:44 +01:00
}
}
2020-03-11 11:05:54 +01:00
stage('Presentation Environment') {
when {
branch 'develop'
expression { return isBuildSuccess() }
}
steps {
script {
def imageVersion = readFile 'scm-packaging/docker/build/docker.tag'
build job: 'scm-manager/scm-manager/next-scm.cloudogu.com/master', propagate: false, wait: false, parameters: [
string(name: 'imageTag', value: imageVersion)
]
}
}
}
2021-01-13 13:30:44 +01:00
stage('Push Tag') {
when {
2022-01-26 10:18:04 +01:00
anyOf {
branch pattern: 'release/*', comparator: 'GLOB'
branch pattern: 'hotfix/*', comparator: 'GLOB'
}
2021-01-13 13:30:44 +01:00
expression { return isBuildSuccess() }
}
steps {
2022-01-18 09:24:26 +01:00
script {
// push changes back to remote repository
if (isReleaseBuild()) {
authGit 'cesmarvin', 'push origin main--tags'
} else {
authGit 'cesmarvin', "push origin ${env.BRANCH_NAME} --tags"
2022-01-18 09:24:26 +01:00
}
authGit 'cesmarvin', 'push origin --tags'
2022-01-18 09:24:26 +01:00
}
2021-01-13 13:30:44 +01:00
}
}
2020-05-10 21:47:35 +02:00
2021-01-13 13:30:44 +01:00
stage('Set Next Version') {
when {
branch pattern: 'release/*', comparator: 'GLOB'
expression { return isBuildSuccess() }
}
steps {
sh returnStatus: true, script: "git branch -D develop"
sh "git checkout develop"
sh "git -c user.name='CES Marvin' -c user.email='cesmarvin@cloudogu.com' merge main"
2020-05-10 21:47:35 +02:00
2021-01-14 08:29:36 +01:00
gradle "setVersionToNextSnapshot"
2020-05-10 21:47:35 +02:00
sh "git add gradle.properties '**.json'"
2021-01-13 13:30:44 +01:00
commit 'Prepare for next development iteration'
authGit 'cesmarvin', 'push origin develop'
2021-01-13 13:30:44 +01:00
}
}
2020-05-10 21:47:35 +02:00
2021-01-13 13:30:44 +01:00
stage('Delete Release Branch') {
when {
branch pattern: 'release/*', comparator: 'GLOB'
expression { return isBuildSuccess() }
}
steps {
authGit 'cesmarvin', "push origin :${env.BRANCH_NAME}"
}
}
stage('Push to GitHub') {
when {
anyOf {
branch pattern: 'develop', comparator: 'GLOB'
branch pattern: 'main', comparator: 'GLOB'
branch pattern: 'support/*', comparator: 'GLOB'
}
expression { return isBuildSuccess() }
}
steps {
authGit 'cesmarvin', "push https://github.com/scm-manager/scm-manager HEAD:${env.BRANCH_NAME}"
authGit 'cesmarvin', "push --tags https://github.com/scm-manager/scm-manager"
}
2018-05-31 12:34:34 +02:00
}
2022-01-18 09:24:26 +01:00
stage('Send Merge Notification') {
when {
branch pattern: 'hotfix/*', comparator: 'GLOB'
expression { return isBuildSuccess() }
}
steps {
mail to: "scm-team@cloudogu.com",
subject: "Jenkins Job ${JOB_NAME} - Merge Hotfix Release #${env.BRANCH_NAME}!",
body: """Please,
- merge the hotfix release branch ${env.BRANCH_NAME} into main (keep versions of main, merge changelog to keep both versions),
- merge main into develop (the changelog should have no conflicts),
2022-01-18 09:24:26 +01:00
- if needed, increase version."""
}
}
2021-01-13 13:30:44 +01:00
}
2021-01-13 13:30:44 +01:00
post {
failure {
mail to: "scm-team@cloudogu.com",
subject: "Jenkins Job ${JOB_NAME} - Build #${BUILD_NUMBER} - ${currentBuild.currentResult}!",
body: "Check console output at ${BUILD_URL} to view the results."
}
unstable {
mail to: "scm-team@cloudogu.com",
subject: "Jenkins Job ${JOB_NAME} - Build #${BUILD_NUMBER} - ${currentBuild.currentResult}!",
body: "Check console output at ${BUILD_URL} to view the results."
}
fixed {
mail to: "scm-team@cloudogu.com",
subject: "Jenkins Job ${JOB_NAME} - Is back to normal with Build #${BUILD_NUMBER}",
body: "Check console output at ${BUILD_URL} to view the results."
}
}
2018-05-31 12:34:34 +02:00
}
2021-01-14 08:29:36 +01:00
void gradle(String command) {
// setting user home system property, should fix user prefs (?/.java/.prefs ...)
sh "./gradlew -Duser.home=${env.WORKSPACE} ${command}"
}
2022-01-18 09:24:26 +01:00
boolean isReleaseBuild() {
return env.BRANCH_NAME.startsWith('release/')
}
2021-01-13 13:30:44 +01:00
String getReleaseVersion() {
2022-01-18 09:24:26 +01:00
if (isReleaseBuild()) {
return env.BRANCH_NAME.substring("release/".length());
} else {
return env.BRANCH_NAME.substring("hotfix/".length());
}
}
2021-01-13 13:30:44 +01:00
void commit(String message) {
sh "git -c user.name='CES Marvin' -c user.email='cesmarvin@cloudogu.com' commit -m '${message}'"
2020-03-11 11:05:54 +01:00
}
2021-01-13 13:30:44 +01:00
void tag(String version) {
String message = "Release version ${version}"
sh "git -c user.name='CES Marvin' -c user.email='cesmarvin@cloudogu.com' tag -m '${message}' ${version}"
2020-03-11 11:05:54 +01:00
}
2022-01-18 09:24:26 +01:00
boolean isBuildSuccess() {
2021-01-13 13:30:44 +01:00
return currentBuild.result == null || currentBuild.result == 'SUCCESS'
}
void withCheckEnvironment(Closure<Void> closure) {
2021-09-08 09:59:51 +02:00
closure.call()
}
void withPublishEnvironment(Closure<Void> closure) {
2020-05-26 09:47:38 +02:00
withCredentials([
usernamePassword(credentialsId: 'packages-scm-manager-org', usernameVariable: 'ORG_GRADLE_PROJECT_packagesScmManagerUsername', passwordVariable: 'ORG_GRADLE_PROJECT_packagesScmManagerPassword'),
string(credentialsId: 'SCM-Manager_ApiKey', variable: 'ORG_GRADLE_PROJECT_ecosystemApiToken'),
string(credentialsId: 'npm-token-scm-manager', variable: 'ORG_GRADLE_PROJECT_npmToken'),
file(credentialsId: 'gpg_packages-scm-manager-org', variable: 'GPG_KEY_RING'),
usernamePassword(credentialsId: 'gpg_packages-scm-manager-org-credentials', usernameVariable: 'GPG_KEY_ID', passwordVariable: 'GPG_KEY_PASSWORD')
2020-05-26 09:47:38 +02:00
]) {
withEnv(["ORG_GRADLE_PROJECT_npmEmail=cesmarvin@cloudogu.com"]) {
docker.withRegistry('', 'cesmarvin-dockerhub-access-token') {
closure.call()
}
2021-01-13 13:30:44 +01:00
}
}
}
void authGit(String credentials, String command) {
withCredentials([
usernamePassword(credentialsId: credentials, usernameVariable: 'AUTH_USR', passwordVariable: 'AUTH_PSW')
]) {
sh "git -c credential.helper=\"!f() { echo username='\$AUTH_USR'; echo password='\$AUTH_PSW'; }; f\" ${command}"
2020-05-26 09:47:38 +02:00
}
}