diff --git a/Jenkinsfile b/Jenkinsfile index 1745793..ed8b94f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -77,6 +77,75 @@ } } +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])/ + if (m) returnGroup ? m[0] : m[0][2] + else return null +} + +def withGitPassword(id, body = { sh 'git version' }) { + withCredentials([usernamePassword([credentialsId: id, passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USER'])]) { + // TODO: Move git_askpass.sh as a library resource + withEnv(["GIT_ASKPASS=/opt/jenkins-scripts/git_askpass.sh"]) { + sh("git fetch --all --quiet") + body() + } + } +} + +def gitLog(bottom = null, top = 'HEAD') { +// Not working without git credentials: + 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) +// def date = sh(script: "git --no-pager log --grep=Provide\\ changelogs -n 1 --pretty=format:%cd", returnStdout: true) +// sh(script: "git log --since='${date}' --perl-regexp --author='^(?!.*?bot-ci).*\$' --pretty=format:'- %s' --reverse", returnStdout: true) +} + + +def prepareChangelogs(versionCode) { + lDir = 'fastlane/metadata/android' + // TODO: Test if latest changelogs have changed since last tag and use gitLog if not + sh(""" +for LOCALE in \$(ls -1d ${lDir}/??-??); do + cp -vf \${LOCALE}/changelogs/latest.txt \${LOCALE}/changelogs/${versionCode}.txt +done +""") +} + +def gitUpdateChangelogs(versionCode, remote = 'origin', branch = 'master') { + def lDir = 'fastlane/metadata/android' + sh(""" +git status --porcelain ${lDir} | grep -q 'changelogs/${versionCode}\\.txt\$' \ +|| { echo 'Nothing to update'; exit 0; } +git checkout --quiet ${branch} +git add ${lDir}/*/changelogs/${versionCode}.txt +git commit --quiet -s -m 'Provide changelogs for this version' ${lDir} +git push --dry-run ${remote} ${branch} +""") +} + +def gitTag(version, remote = 'origin' ) { + sh("git tag -a '${version}' -m 'Create new tag for version ${version}' && git push --dry-run ${remote} ${version}") +} + +def gitUpdateVersion(versionName, versionCode, remote = 'origin', branch = 'master') { + def gradleFilePath = 'app/build.gradle' + def gradleFile = readFile(encoding: 'UTF-8', file: gradleFilePath) + gName = getVersion('versionName', true) + gCode = getVersion('versionCode', true) + 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) + sh(""" +git status --porcelain ${gradleFilePath} | grep -q '${gradleFilePath}\$' \ +|| { echo 'Nothing to update'; exit 0; } +git checkout --quiet ${branch} +git commit --quiet -s -m 'Update version from ${gName[2]}-${gCode[2]} to ${versionName}-${versionCode}' app/build.gradle +git push --dry-run ${remote} ${branch} +""") +} + // Define lazyStages lazyStage { name = 'validate' @@ -89,7 +158,7 @@ } lazyStage { - name = 'build' + name = 'package' tasks = [ run: { fastlane('android', 'build') @@ -101,11 +170,31 @@ ] } -//lazyStage { -// name = 'release' -// tasks = [ [ run: [ 'fastlane_alpha.sh' ], on: 'android' ] ] -//} -// +lazyStage { + name = 'release' + tasks = [ +// if: { (env.BRANCH_NAME == 'master') }, +// pre: { +// unarchive(mapping:['app/build/outputs/apk/' : './app/build/outputs/apk']) +// }, + 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()}") + echo("nextVersion = ${nextVersion.toString()}") + withGitPassword('bot-ci-dgm', { + echo("Git logs since last tag:\n" + gitLog()) + prepareChangelogs(currentVersion.code) + //fastlane('android', 'release') + gitUpdateChangelogs(currentVersion.code) + gitTag("${currentVersion.name}-${currentVersion.code}") + gitUpdateVersion(nextVersion.name, nextVersion.code) + }) + }, + on: 'android', + ] +} + //lazyStage { // name = 'publish' // tasks = [ [ run: [ 'fastlane_beta.sh' ], on: 'android' ] ] diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 7826030..1122c02 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -111,9 +111,16 @@ end desc "Deploy a new version to the Google Play" - lane :deploy do - #gradle(task: "assembleRelease") - #supply + lane :release do + supply( + apk: 'app/build/outputs/apk/release/app-release.apk', + mapping: 'app/build/outputs/apk/release/mapping.txt', + track: 'alpha', + skip_upload_apk: false, + skip_upload_metadata: false, + skip_upload_images: true, + skip_upload_screenshots: true, + ) end # You can define as many lanes as you want