diff --git a/Jenkinsfile b/Jenkinsfile index 8360d0f..1e544c2 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -19,13 +19,10 @@ * limitations under the License. */ -// Define the remote and the branch used to release -def release = [ remote: 'origin', branch: 'devel_bear' ] - // Load Jenkins shared libraries common to all projects def libCmn = [ remote: 'https://code.in.digital-me.nl/git/DEVops/JenkinsLibLazy.git', - branch: env.BRANCH_NAME, + branch: 'master', credentialsId: null, ] @@ -41,7 +38,7 @@ // Load Jenkins shared libraries to customize this project def libCst = [ remote: 'ssh://git@code.in.digital-me.nl:2222/DEVops/JenkinsLibCustom.git', - branch: env.BRANCH_NAME, + branch: 'master', credentialsId: 'bot-ci-dgm-rsa', ] @@ -54,12 +51,6 @@ ]) ) -// Initialize lazyConfig for this pipeline -lazyConfig( - name: 'DummyAnd', - nopoll: release['branch'], -) - def getVersion(part, returnGroup = false) { def gradleFile = readFile(encoding: 'UTF-8', file: 'app/build.gradle') def m = gradleFile =~ /([^\n]*(?:${part})(?:[^:]*:?\s+|\s*=\s*)"?)([.0-9]+)("?\s*(?:(?:\/\/|#)[^\n]*)?[\n])/ @@ -77,6 +68,11 @@ } } +def gitPush(gitRemote = 'origin', gitCommit) { + def dryRun = ( env.DRYRUN == 'true' ) ? '--dry-run' : '' + sh("git push ${dryRun} ${gitRemote} ${gitCommit}") +} + def gitLog(bottom = null, top = 'HEAD') { def from = bottom ?: 'tags/' + sh(script: "git tag -l | tail -1", returnStdout: true).trim() sh(script: "git --no-pager log ${from}...${top} --pretty=format:'- %s' --reverse", returnStdout: true) @@ -93,31 +89,31 @@ """) } -def gitUpdateChangelogs(versionCode, remote = 'origin', branch = 'master') { - def dryRun = ( env.DRYRUN == 'true' ) ? '--dry-run' : '' +def gitUpdateChangelogs(versionCode, gitBranch = null, gitRemote = 'origin') { + prepareChangelogs(versionCode) def lDir = 'fastlane/metadata/android' sh(""" git status --porcelain ${lDir} | grep -q 'changelogs/${versionCode}\\.txt\$' \ || { echo 'Nothing to update'; exit 0; } + """) + if (gitBranch) sh(""" git stash save --quiet --include-untracked changelogs -git checkout --quiet ${branch} +git checkout --quiet ${gitRemote}/${gitBranch} git stash pop -git add ${lDir}/*/changelogs/${versionCode}.txt -git commit --quiet -s -m 'Provide changelogs for this version' ${lDir} -git push ${dryRun} ${remote} ${branch} """) -} - -def gitTag(version, remote = 'origin' ) { - def dryRun = ( env.DRYRUN == 'true' ) ? '--dry-run' : '' sh(""" -git tag -a '${version}' -m 'Create new tag for version ${version}' -git push ${dryRun} ${remote} ${version} +git add ${lDir}/*/changelogs/${versionCode}.txt +git commit --quiet -s -m 'Provide changelogs for version ${versionCode}' ${lDir} """) + if (gitBranch) gitPush(gitRemote, gitBranch) } -def gitUpdateVersion(versionName, versionCode, remote = 'origin', branch = 'master') { - def dryRun = ( env.DRYRUN == 'true' ) ? '--dry-run' : '' +def gitTag(version, gitRemote = 'origin' ) { + sh("git tag -a '${version}' -m 'Create new tag for version ${version}'") + gitPush(gitRemote, version) +} + +def setVersion(versionName, versionCode) { def gradleFilePath = 'app/build.gradle' def gradleFile = readFile(encoding: 'UTF-8', file: gradleFilePath) gName = getVersion('versionName', true) @@ -125,52 +121,37 @@ gradleFile = gradleFile.replace(gName[0], gName[1] + versionName + gName[3]) gradleFile = gradleFile.replace(gCode[0], gCode[1] + versionCode + gCode[3]) writeFile(encoding: 'UTF-8', file: gradleFilePath, text: gradleFile) +} + +def gitUpdateVersion(versionName, versionCode, gitBranch = null, gitRemote = 'origin') { + def gradleFilePath = 'app/build.gradle' + def dryRun = ( env.DRYRUN == 'true' ) ? '--dry-run' : '' + setVersion(versionName, versionCode) sh(""" git status --porcelain ${gradleFilePath} | grep -q '${gradleFilePath}\$' \ || { echo 'Nothing to update'; exit 0; } + """) + if (gitBranch) sh(""" git stash save --quiet versions -git checkout --quiet ${branch} +git checkout --quiet ${gitRemote}/${gitBranch} git stash pop -git commit --quiet -s -m 'Update version from ${gName[2]}-${gCode[2]} to ${versionName}-${versionCode}' app/build.gradle -git push ${dryRun} ${remote} ${branch} -""") + """) + sh("git commit --quiet -s -m 'Update version from ${gName[2]}-${gCode[2]} to ${versionName}-${versionCode}' app/build.gradle") + if (gitBranch) gitPush(gitRemote, gitBranch) } +// Define the remotes and the branches used to release from and to +def releaseFrom = [ remote: 'origin', branch: 'devel_bear' ] +def releaseTo = [ remote: 'origin', branch: 'master' ] + +// Initialize lazyConfig for this pipeline +lazyConfig( + name: 'DummyAnd', + nopoll: '.+_.+', +) + // Define lazyStages lazyStage { - name = 'prepare' - input = (owner.env.BRANCH_NAME == release['branch']) ? [ - message: 'Version name ?', - parameters: [string(defaultValue: '', description: 'Version name?', name: 'VERSION')] - ] : null - tasks = [ - run: { - echo("Lazy input = ${env.LAZY_INPUT}") - if (!env.LAZY_INPUT) error 'Not lazy input!' - def currentVersion = [ name: getVersion('versionName') as String, code: getVersion('versionCode') as Integer ] - echo("currentVersion = ${currentVersion.toString()}") - withGitPassword('bot-ci-dgm', { - if (env.BRANCH_NAME == release['branch']) { - echo("Git logs since last tag:\n" + gitLog()) - prepareChangelogs(currentVersion.code) - gitUpdateChangelogs(currentVersion.code, release['remote'], release['branch']) - if (env.LAZY_INPUT != '') { - gitUpdateVersion(env.LAZY_INPUT, currentVersion.code, release['remote'], release['branch']) - echo("newVersion = [name: ${env.LAZY_INPUT}, code: ${currentVersion.code}]" ) - } - } else { - sh(""" -git pull --quiet --rebase ${release['remote']} ${release['branch']} -git push --quiet ${release['remote']} ${env.BRANCH_NAME} - """) - } - }) - }, -on: 'android', - ] -} - -lazyStage { name = 'validate' tasks = [ run: { @@ -193,9 +174,39 @@ ] } -if (env.BRANCH_NAME == release['branch']) { +// Release stage only only if criteria are met +if (env.BRANCH_NAME == releaseFrom['branch'] && env.env ==~ /RELEASE=true/) { lazyStage { name = 'release' + // Ask version if release flag and set and we are in the branch to fork release from + input = [ + message: 'Version name ?', + parameters: [string(defaultValue: '', description: 'Version name?', name: 'VERSION')] + ] + tasks = [ + run: { + def currentVersion = [ name: getVersion('versionName') as String, code: getVersion('versionCode') as Integer ] + echo("currentVersion = ${currentVersion.toString()}") + withGitPassword('bot-ci-dgm', { + // Fork a release branch as requested + echo("Git logs since last tag:\n" + gitLog()) + sh("git checkout -b release-${env.LAZY_INPUT}") + gitUpdateChangelogs(currentVersion.code) + gitUpdateVersion(env.LAZY_INPUT, currentVersion.code) + def nextVersion = [ name: getVersion('versionName') as String, code: getVersion('versionCode') as Integer ] + echo("nextVersion = ${nextVersion.toString()}" ) + gitPush(releaseFrom['remote'], "release-${env.LAZY_INPUT}") + }) + }, + on: 'android', + ] + } +} + +// From systemtest to production, only for release branches +if (env.BRANCH_NAME ==~ /^release-.*/) { + lazyStage { + name = 'systemtest' tasks = [ pre: { unarchive(mapping:['app/build/outputs/apk/' : '.']) @@ -203,13 +214,17 @@ }, run: { withGitPassword('bot-ci-dgm', { - sh("git pull ${release['remote']} ${release['branch']}") + def dryRun = ( env.DRYRUN == 'true' ) ? '--dry-run' : '' def currentVersion = [ name: getVersion('versionName') as String, code: getVersion('versionCode') as Integer ] def nextVersion = [ name: currentVersion.name, code: currentVersion.code + 1] echo("currentVersion = ${currentVersion.toString()} / nextVersion = ${nextVersion.toString()}") if ( env.DRYRUN != 'true' ) fastlane('android', 'alpha') - gitTag("${currentVersion.name}-${currentVersion.code}") - gitUpdateVersion(nextVersion.name, nextVersion.code, release['remote'], release['branch']) + sh(""" +git checkout ${releaseFrom['remote']}/${releaseFrom['branch']} +git merge ${env.BRANCH_NAME} -m 'Merge changes from ${versionName}-${versionCode} back into ${releaseFrom['branch']}' + """) + gitUpdateVersion(nextVersion.name, nextVersion.code) + gitPush(releaseFrom['remote'], releaseFrom['branch']) }) }, on: 'android', @@ -232,6 +247,15 @@ tasks = [ run: { if ( env.DRYRUN != 'true' ) fastlane('android', 'production') + withGitPassword('bot-ci-dgm', { + def currentVersion = [ name: getVersion('versionName') as String, code: getVersion('versionCode') as Integer ] + sh(""" +git checkout ${releaseTo['remote']}/${releaseTo['branch']} +git merge ${env.BRANCH_NAME} -m 'Merge changes from ${versionName}-${versionCode} into ${releaseTo['branch']}' + """) + gitPush(releaseTo['remote'], releaseTo['branch']) + gitTag("${currentVersion.name}", releaseTo['remote']) + }) } ] }