From 027eb0b7d12b758d356bf2dbe504f950718b8530 Mon Sep 17 00:00:00 2001 From: cghislai Date: Sun, 28 Nov 2021 15:42:28 +0100 Subject: [PATCH] Clean up & add packaging scripts --- Jenkinsfile | 59 ++++++++++++++++++------ android/app/build.gradle | 4 ++ android/app/src/main/AndroidManifest.xml | 8 +++- test/widget_test.dart | 2 +- tools/jenkins-build-android.sh | 16 ++++--- tools/jenkins-publish-android.sh | 2 +- tools/set-bundle-identifier.sh | 7 +++ tools/set-package.sh | 14 ++++++ tools/set-title.sh | 18 ++++++++ 9 files changed, 107 insertions(+), 23 deletions(-) create mode 100644 tools/set-bundle-identifier.sh create mode 100644 tools/set-package.sh create mode 100644 tools/set-title.sh diff --git a/Jenkinsfile b/Jenkinsfile index 932ef65..1cc51bc 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,17 +7,28 @@ pipeline { buildDiscarder(logRotator(numToKeepStr: '10')) } parameters { + string(name: 'APP_PACKAGE_ID', defaultValue: 'com.charlyghislain.embedded_webview', description: 'Application package id used as android identifier') + string(name: 'APP_BUNDLE_ID', defaultValue: 'com.charlyghislain.embedded_webview', description: 'Application bundle id used as ios identifier') string(name: 'APP_TITLE', defaultValue: 'Embedded Webview', description: 'Application title') - string(name: 'APP_URI', defaultValue: 'https://www.charlyghislain.com', description: 'Application uri') + string(name: 'APP_URI', defaultValue: 'https://www.charlyghislain.com', description: 'Application initial uri') string(name: 'APP_COLOR', defaultValue: 'red', description: 'Application color (blue, teal, ...)') string(name: 'BUILD_MODE', defaultValue: 'debug', description: 'Flutter build mode (debug/release)') - string(name: 'UPLOAD_TRACK', defaultValue: 'alpha', description: 'Upload track') - string(name: 'RELEASE_MESSAGE', defaultValue: 'Nouvelle version', description: 'A release message') - string(name: 'RELEASE_STATUS', defaultValue: 'completed', description: 'draft/completed') + string(name: 'ANDROID_SIGNING_KEYSTORE_CREDENTIAL', defaultValue: 'jenkins-gestemps-android-service-secret-keystore', + string(name: 'ANDROID_SIGNING_KEYSTORE_PASSWORD_CREDENTIAL', defaultValue: 'jenkins-gestemps-android-service-secret-keystore-password', + string(name: 'ANDROID_SIGNING_KEY_PASSWORD_CREDENTIAL', defaultValue: 'jenkins-gestemps-android-service-secret-key-password', + string(name: 'ANDROID_SIGNING_KEY_ALIAS', defaultValue: 'comptaplan', + description: 'The key alias to use within the keystore') booleanParam(name: 'SKIP_PUBLISH', defaultValue: 'true', description: 'Skip publishing apk') + string(name: 'RELEASE_MESSAGE', defaultValue: 'Nouvelle version', description: 'A release message') + string(name: 'ANDROID_UPLOAD_TRACK', defaultValue: 'alpha', description: 'Upload track') + string(name: 'ANDROID_RELEASE_STATUS', defaultValue: 'completed', description: 'draft/completed') + string(name: 'ANDROID_API_KEY_CREDENTIAL', defaultValue: 'jenkins-gestemps-android-service-secret-api-key', description: 'Api key to for the play store api') + string(name: 'GIT_SSH_REMOTE_NAME', defaultValue: 'ssh://git@gitea.valuya.com:2022/Valuya/embedded_webview.git', + description: 'We use ssh authentication, but gitea may use an http remotes by default. This is the remote to push the build number increment.') string(name: 'GIT_CREDENTIAL_ID', defaultValue: 'jenkins-jenkins-ssh-key', description: '') string(name: 'GIT_PUSH_BRANCH', defaultValue: 'android-releases', description: 'A branch to push the commit') string(name: 'GIT_TAG', defaultValue: '', description: 'An additional tag to push') + string(name: 'SSH_KNOWN_HOSTS_FILE', defaultValue: '/var/run/ssh/known_hosts.gitea.valuya.com', description: 'Known hosts for ssh client (might be used to get flutter git dependencies and push commits)') booleanParam(name: 'SKIP_PUSH_TAG', defaultValue: 'true', description: 'Skip push tag') string(name: 'NODEJS_INSTALLATION', defaultValue: 'node14',description: 'Nodejs installation to use') } @@ -25,18 +36,31 @@ pipeline { stage ('Build') { steps { script { + env.APP_PACKAGE_ID= params.APP_PACKAGE_ID + env.APP_BUNDLE_ID= params.APP_BUNDLE_ID env.APP_TITLE= params.APP_TITLE env.APP_URI= params.APP_URI env.APP_COLOR= params.APP_COLOR env.BUILD_MODE= params.BUILD_MODE + env.SSH_KNOWN_HOSTS_FILE= params.SSH_KNOWN_HOSTS_FILE + env.ANDROID_KEY_ALIAS= params.ANDROID_SIGNING_KEY_ALIAS } container ('flutter') { sshagent(["${params.GIT_CREDENTIAL_ID}"]) { - sh 'flutter doctor' - sh 'GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/var/run/ssh/known_hosts.gitea.fteamdev.valuya.be" flutter pub get' - sh 'flutter clean' - sh 'APP_TITLE="$APP_TITLE" APP_URI="$APP_URI" APP_COLOR="$APP_COLOR" BUILDMODE="$BUILD_MODEs" ./tools/jenkins-build-android.sh' - stash(name: 'outputs', includes: 'build/app/outputs/**') + withCredentials([ + file(credentialsId: params.ANDROID_SIGNING_KEYSTORE_CREDENTIAL, variable: 'ANDROID_KEYSTORE_FILE'), + string(credentialsId: params.ANDROID_SIGNING_KEYSTORE_PASSWORD_CREDENTIAL, variable: 'ANDROID_KEYSTORE_PASSWORD') + string(credentialsId: params.ANDROID_SIGNING_KEY_PASSWORD_CREDENTIAL, variable: 'ANDROID_KEY_PASSWORD') + ]) { + sh 'flutter doctor' + sh 'GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=$SSH_KNOWN_HOSTS_FILE" flutter pub get' + sh 'flutter clean' + sh './tools/set-bundle-identifier.sh "$APP_BUNDLE_ID"' + sh './tools/set-package.sh "$APP_PACKAGE_ID"' + sh './tools/set-title.sh "$APP_TITLE"' + sh './tools/jenkins-build-android.sh' + stash(name: 'outputs', includes: 'build/app/outputs/**') + } } } } @@ -51,14 +75,21 @@ pipeline { env.SKIP_PUSH_TAG= params.SKIP_PUSH_TAG env.GIT_TAG= params.GIT_TAG env.GIT_PUSH_BRANCH = params.GIT_PUSH_BRANCH - env.TRACK = params.UPLOAD_TRACK - env.RELEASE_STATUS = params.RELEASE_STATUS + env.ANDROID_UPLOAD_TRACK = params.ANDROID_UPLOAD_TRACK + env.ANDROID_RELEASE_STATUS = params.ANDROID_RELEASE_STATUS env.RELEASE_MESSAGE = params.RELEASE_MESSAGE + env.GIT_SSH_REMOTE_NAME = params.GIT_SSH_REMOTE_NAME + env.SSH_KNOWN_HOSTS_FILE = params.SSH_KNOWN_HOSTS_FILE } unstash(name: 'outputs') sshagent(["${params.GIT_CREDENTIAL_ID}"]) { nodejs(nodeJSInstallationName: "${params.NODEJS_INSTALLATION}") { - sh './tools/jenkins-publish-android.sh' + withCredentials([ + file(credentialsId: params.ANDROID_API_KEY_CREDENTIAL, variable: 'GOOGLE_APPLICATION_CREDENTIALS') + ]) { + sh './tools/jenkins-publish-android.sh' + } + } sh ''' VERSION_CODE=$(./tools/jenkins-increment-buildnumber.sh || echo $?) @@ -66,9 +97,9 @@ pipeline { git config user.email "jenkins@valuya.com" git config user.name "Jenkins release" git add pubspec.yaml - git remote add ssh "ssh://git@gitea.valuya.com:2022/Valuya/embedded_webview.git" + git remote add ssh "$GIT_SSH_REMOTE_NAME" git commit -m "Bump to build $VERSION_CODE" - export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/var/run/ssh/known_hosts.gitea.valuya.com" + export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=$SSH_KNOWN_HOSTS_FILE" git push ssh HEAD:$GIT_PUSH_BRANCH if [ "$SKIP_PUSH_TAG" != "true" ] ; then git tag "$GIT_TAG" diff --git a/android/app/build.gradle b/android/app/build.gradle index 9ca1728..8d4de25 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -41,6 +41,10 @@ android { main.java.srcDirs += 'src/main/kotlin' } + dependencies { + implementation 'com.google.android.material:material:1.4.0' + } + defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.charlyghislain.embedded_webview" diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 90d9128..e547e96 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,12 @@ - + + + + + android/local.properties flutter.sdk=/home/developer/flutter sdk.dir=/home/developer/android -flutter.buildMode=${BUILDMODE} +flutter.buildMode=${BUILD_MODE} flutter.versionName= flutter.versionCode= EOF cat << EOF > android/key.properties -storePassword=jenkins.fteamdev -keyPassword=jenkins.fteamdev -keyAlias=jenkins.fteamdev -storeFile=/var/run/secrets/signing_keystore.jks +storePassword=${ANDROID_KEYSTORE_PASSWORD} +keyPassword=${ANDROID_KEY_PASSWORD} +keyAlias=${ANDROID_SIGNING_KEY_ALIAS} +storeFile=${ANDROID_KEYSTORE_FILE} EOF pwd diff --git a/tools/jenkins-publish-android.sh b/tools/jenkins-publish-android.sh index f23e6dc..c66fcb7 100755 --- a/tools/jenkins-publish-android.sh +++ b/tools/jenkins-publish-android.sh @@ -4,6 +4,7 @@ TRACK=${TRACK:-alpha} RELEASE_STATUS=${RELEASE_STATUS:-completed} RELEASE_MESSAGE="${RELEASE_MESSAGE:-New version}" +GOOGLE_APPLICATION_CREDENTIALS="${GOOGLE_APPLICATION_CREDENTIALS:-}" VERSION_AND_CODE="$(cat pubspec.yaml | grep 'version:' | sed 's/version: //')" @@ -19,7 +20,6 @@ npm install ./node_modules/.bin/tsc npm install -g --save googleapis -GOOGLE_APPLICATION_CREDENTIALS=/var/run/secrets/google_api.key.json \ node ${WD}/publish-android-js/publish-app-store.js \ "$TRACK" "$VERSION_CODE" "$RELEASE_STATUS" "$VERSION_CODE $VERISON_NAME" "$RELEASE_MESSAGE" ${WD}/../build/app/outputs/bundle/release/app-release.aab \ || exit 1 diff --git a/tools/set-bundle-identifier.sh b/tools/set-bundle-identifier.sh new file mode 100644 index 0000000..d05e5bd --- /dev/null +++ b/tools/set-bundle-identifier.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +BUNDLE_NAME="$1" + +echo "Setting the ios bundle name to $BUNDLE_NAME" + +sed -i "s/PRODUCT_BUNDLE_IDENTIFIER = .*;/PRODUCT_BUNDLE_IDENTIFIER = $BUNDLE_NAME;" ios/Runner.xcodeproj/project.pbxproj diff --git a/tools/set-package.sh b/tools/set-package.sh new file mode 100644 index 0000000..54a87df --- /dev/null +++ b/tools/set-package.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +PACKAGE="$1" + +echo "Setting the application android package to $PACKAGE" + +sed -i "s/package=\"[^\"]\+\"/package=\"$PACKAGE\"/" android/app/src/debug/AndroidManfest.xml +sed -i "s/package=\"[^\"]\+\"/package=\"$PACKAGE\"/" android/app/src/main/AndroidManfest.xml +sed -i "s/package=\"[^\"]\+\"/package=\"$PACKAGE\"/" android/app/src/profile/AndroidManfest.xml + +sed -i "s/applicationId \"[^\"]\+\"/applicationId \"$PACKAGE\"/" android/app/build.gradle + +sed -i "s/package .*/package $PACKAGE/" android/app/src/main/kotlin/com/charlyghislain/embedded_webview/MainActivity.kt + diff --git a/tools/set-title.sh b/tools/set-title.sh new file mode 100644 index 0000000..e25eb0b --- /dev/null +++ b/tools/set-title.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +TITLE="$1" + +echo "Setting the application title to $TITLE" + +sed -i "s/android:label=\"[^\"]\+\"/android:label=\"$TITLE\"/" android/app/src/main/AndroidManfest.xml + +NAME_LENGTH="${#TITLE}" +LONG_NAME="$(( $NAME_LENGTH > 15))" # 1 if long name +BUNDLE_NAME="$(cut -c -15 $TITLE)" + +perl -0777 -i -pe "s/\tCFBundleName\n[^\n]+/\tCFBundleName\n\t$BUNDLE_NAME/igs" + +if [ "$LONG_NAME" = "1" ] ; then +# todo : set bundleDisplayName +fi +