Clean up & add packaging scripts

This commit is contained in:
cghislai 2021-11-28 15:42:28 +01:00
parent 53116080e4
commit 027eb0b7d1
9 changed files with 107 additions and 23 deletions

51
Jenkinsfile vendored
View File

@ -7,17 +7,28 @@ pipeline {
buildDiscarder(logRotator(numToKeepStr: '10')) buildDiscarder(logRotator(numToKeepStr: '10'))
} }
parameters { 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_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: 'APP_COLOR', defaultValue: 'red', description: 'Application color (blue, teal, ...)')
string(name: 'BUILD_MODE', defaultValue: 'debug', description: 'Flutter build mode (debug/release)') string(name: 'BUILD_MODE', defaultValue: 'debug', description: 'Flutter build mode (debug/release)')
string(name: 'UPLOAD_TRACK', defaultValue: 'alpha', description: 'Upload track') string(name: 'ANDROID_SIGNING_KEYSTORE_CREDENTIAL', defaultValue: 'jenkins-gestemps-android-service-secret-keystore',
string(name: 'RELEASE_MESSAGE', defaultValue: 'Nouvelle version', description: 'A release message') string(name: 'ANDROID_SIGNING_KEYSTORE_PASSWORD_CREDENTIAL', defaultValue: 'jenkins-gestemps-android-service-secret-keystore-password',
string(name: 'RELEASE_STATUS', defaultValue: 'completed', description: 'draft/completed') 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') 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_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_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: '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') booleanParam(name: 'SKIP_PUSH_TAG', defaultValue: 'true', description: 'Skip push tag')
string(name: 'NODEJS_INSTALLATION', defaultValue: 'node14',description: 'Nodejs installation to use') string(name: 'NODEJS_INSTALLATION', defaultValue: 'node14',description: 'Nodejs installation to use')
} }
@ -25,22 +36,35 @@ pipeline {
stage ('Build') { stage ('Build') {
steps { steps {
script { 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_TITLE= params.APP_TITLE
env.APP_URI= params.APP_URI env.APP_URI= params.APP_URI
env.APP_COLOR= params.APP_COLOR env.APP_COLOR= params.APP_COLOR
env.BUILD_MODE= params.BUILD_MODE 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') { container ('flutter') {
sshagent(["${params.GIT_CREDENTIAL_ID}"]) { sshagent(["${params.GIT_CREDENTIAL_ID}"]) {
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 'flutter doctor'
sh 'GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/var/run/ssh/known_hosts.gitea.fteamdev.valuya.be" flutter pub get' sh 'GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=$SSH_KNOWN_HOSTS_FILE" flutter pub get'
sh 'flutter clean' sh 'flutter clean'
sh 'APP_TITLE="$APP_TITLE" APP_URI="$APP_URI" APP_COLOR="$APP_COLOR" BUILDMODE="$BUILD_MODEs" ./tools/jenkins-build-android.sh' 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/**') stash(name: 'outputs', includes: 'build/app/outputs/**')
} }
} }
} }
} }
}
stage ('Push') { stage ('Push') {
when { anyOf { when { anyOf {
expression {return (params.SKIP_PUBLISH == false)} expression {return (params.SKIP_PUBLISH == false)}
@ -51,24 +75,31 @@ pipeline {
env.SKIP_PUSH_TAG= params.SKIP_PUSH_TAG env.SKIP_PUSH_TAG= params.SKIP_PUSH_TAG
env.GIT_TAG= params.GIT_TAG env.GIT_TAG= params.GIT_TAG
env.GIT_PUSH_BRANCH = params.GIT_PUSH_BRANCH env.GIT_PUSH_BRANCH = params.GIT_PUSH_BRANCH
env.TRACK = params.UPLOAD_TRACK env.ANDROID_UPLOAD_TRACK = params.ANDROID_UPLOAD_TRACK
env.RELEASE_STATUS = params.RELEASE_STATUS env.ANDROID_RELEASE_STATUS = params.ANDROID_RELEASE_STATUS
env.RELEASE_MESSAGE = params.RELEASE_MESSAGE 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') unstash(name: 'outputs')
sshagent(["${params.GIT_CREDENTIAL_ID}"]) { sshagent(["${params.GIT_CREDENTIAL_ID}"]) {
nodejs(nodeJSInstallationName: "${params.NODEJS_INSTALLATION}") { nodejs(nodeJSInstallationName: "${params.NODEJS_INSTALLATION}") {
withCredentials([
file(credentialsId: params.ANDROID_API_KEY_CREDENTIAL, variable: 'GOOGLE_APPLICATION_CREDENTIALS')
]) {
sh './tools/jenkins-publish-android.sh' sh './tools/jenkins-publish-android.sh'
} }
}
sh ''' sh '''
VERSION_CODE=$(./tools/jenkins-increment-buildnumber.sh || echo $?) VERSION_CODE=$(./tools/jenkins-increment-buildnumber.sh || echo $?)
[ "$VERSION_CODE" == "0" ] && exit 1 [ "$VERSION_CODE" == "0" ] && exit 1
git config user.email "jenkins@valuya.com" git config user.email "jenkins@valuya.com"
git config user.name "Jenkins release" git config user.name "Jenkins release"
git add pubspec.yaml 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" 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 git push ssh HEAD:$GIT_PUSH_BRANCH
if [ "$SKIP_PUSH_TAG" != "true" ] ; then if [ "$SKIP_PUSH_TAG" != "true" ] ; then
git tag "$GIT_TAG" git tag "$GIT_TAG"

View File

@ -41,6 +41,10 @@ android {
main.java.srcDirs += 'src/main/kotlin' main.java.srcDirs += 'src/main/kotlin'
} }
dependencies {
implementation 'com.google.android.material:material:1.4.0'
}
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.charlyghislain.embedded_webview" applicationId "com.charlyghislain.embedded_webview"

View File

@ -1,5 +1,11 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.charlyghislain.embedded_webview"> package="com.charlyghislain.embedded_webview">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA"/>
<application <application
android:label="embedded_webview" android:label="embedded_webview"
android:icon="@mipmap/ic_launcher"> android:icon="@mipmap/ic_launcher">

View File

@ -13,7 +13,7 @@ import 'package:embedded_webview/main.dart';
void main() { void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async { testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame. // Build our app and trigger a frame.
await tester.pumpWidget(const MyApp()); await tester.pumpWidget(const MyApp('test', 'test', 'blue'));
// Verify that our counter starts at 0. // Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget); expect(find.text('0'), findsOneWidget);

View File

@ -1,26 +1,30 @@
#!/bin/bash #!/bin/bash
# debug/release # debug/release
BUILDMODE=${BUILDMODE:-debug} BUILD_MODE=${BUILD_MODE:-debug}
# LOCAL/DEV/PROD # LOCAL/DEV/PROD
APP_TITLE=${APP_TITLE:-} APP_TITLE=${APP_TITLE:-}
APP_URI=${APP_URI:-} APP_URI=${APP_URI:-}
APP_COLOR=${APP_COLOR:-} APP_COLOR=${APP_COLOR:-}
ANDROID_KEYSTORE_FILE=${ANDROID_KEYSTORE_FILE:-}
ANDROID_KEY_ALIAS=${ANDROID_KEY_ALIAS:-}
ANDROID_KEYSTORE_PASSWORD=${ANDROID_KEYSTORE_PASSWORD:-}
ANDROID_KEY_PASSWORD=${ANDROID_KEY_PASSWORD:-}
cat << EOF > android/local.properties cat << EOF > android/local.properties
flutter.sdk=/home/developer/flutter flutter.sdk=/home/developer/flutter
sdk.dir=/home/developer/android sdk.dir=/home/developer/android
flutter.buildMode=${BUILDMODE} flutter.buildMode=${BUILD_MODE}
flutter.versionName= flutter.versionName=
flutter.versionCode= flutter.versionCode=
EOF EOF
cat << EOF > android/key.properties cat << EOF > android/key.properties
storePassword=jenkins.fteamdev storePassword=${ANDROID_KEYSTORE_PASSWORD}
keyPassword=jenkins.fteamdev keyPassword=${ANDROID_KEY_PASSWORD}
keyAlias=jenkins.fteamdev keyAlias=${ANDROID_SIGNING_KEY_ALIAS}
storeFile=/var/run/secrets/signing_keystore.jks storeFile=${ANDROID_KEYSTORE_FILE}
EOF EOF
pwd pwd

View File

@ -4,6 +4,7 @@
TRACK=${TRACK:-alpha} TRACK=${TRACK:-alpha}
RELEASE_STATUS=${RELEASE_STATUS:-completed} RELEASE_STATUS=${RELEASE_STATUS:-completed}
RELEASE_MESSAGE="${RELEASE_MESSAGE:-New version}" RELEASE_MESSAGE="${RELEASE_MESSAGE:-New version}"
GOOGLE_APPLICATION_CREDENTIALS="${GOOGLE_APPLICATION_CREDENTIALS:-}"
VERSION_AND_CODE="$(cat pubspec.yaml | grep 'version:' | sed 's/version: //')" VERSION_AND_CODE="$(cat pubspec.yaml | grep 'version:' | sed 's/version: //')"
@ -19,7 +20,6 @@ npm install
./node_modules/.bin/tsc ./node_modules/.bin/tsc
npm install -g --save googleapis npm install -g --save googleapis
GOOGLE_APPLICATION_CREDENTIALS=/var/run/secrets/google_api.key.json \
node ${WD}/publish-android-js/publish-app-store.js \ 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 \ "$TRACK" "$VERSION_CODE" "$RELEASE_STATUS" "$VERSION_CODE $VERISON_NAME" "$RELEASE_MESSAGE" ${WD}/../build/app/outputs/bundle/release/app-release.aab \
|| exit 1 || exit 1

View File

@ -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

14
tools/set-package.sh Normal file
View File

@ -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

18
tools/set-title.sh Normal file
View File

@ -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/\t<key>CFBundleName</key>\n[^\n]+/\t<key>CFBundleName</key>\n\t<string>$BUNDLE_NAME</string>/igs"
if [ "$LONG_NAME" = "1" ] ; then
# todo : set bundleDisplayName
fi