ci-cd: Setup fastlane #50
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
on: | |
push: | |
branches: | |
- "*" | |
- "!gh-pages" | |
tags: | |
- "*" | |
pull_request: | |
branches: | |
- "*" | |
- "!gh-pages" | |
jobs: | |
test-xamarin: | |
runs-on: macos-12 | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-dotnet@v3 | |
with: | |
global-json-file: ./global.json | |
- working-directory: ./XamarinFormSample | |
run: dotnet format --verify-no-changes | |
test-flutter: | |
runs-on: macos-12 | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: subosito/flutter-action@v2 | |
with: | |
flutter-version: '3.10.0' | |
channel: 'stable' | |
- working-directory: flutter-example | |
run: | | |
flutter pub get | |
flutter test | |
flutter analyze --no-fatal-infos | |
dart format --set-exit-if-changed lib | |
flutter-android: | |
runs-on: macos-13 | |
needs: ["xamarin-android"] # Depends on xamarin so that its version code is always bigger to allow updating | |
if: ${{ github.ref == 'refs/heads/main' }} | |
defaults: | |
run: | |
working-directory: "./flutter-example" | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: 16 | |
# https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md#java | |
- name: Set java version | |
run: | | |
echo "JAVA_HOME=$JAVA_HOME_17_X64" >> $GITHUB_ENV | |
- run: npm install -g appcenter-cli | |
- uses: subosito/flutter-action@v2 | |
with: | |
# Do _NOT_ use the latest stable as those contain breaking changes | |
flutter-version: '3.10.0' | |
channel: 'stable' | |
- run: flutter pub get | |
- run: flutter test | |
- run: flutter analyze --no-fatal-infos | |
- run: dart format --set-exit-if-changed lib | |
- name: Build .apk | |
run: | | |
BUILD_NUMBER=$(date +%s) | |
flutter build apk --build-number $BUILD_NUMBER | |
- name: Distribute to App Center | |
env: | |
APPCENTER_ACCESS_TOKEN: ${{ secrets.ANDROID_APPCENTER_ACCESS_TOKEN }} | |
run: appcenter distribute release --debug --silent --file "./build/app/outputs/flutter-apk/app-release.apk" --group "Collaborators" --app "Oursky/Authgear-Migrate-Tool-Xamarin-To-Flutter-Sample" --release-notes "flutter android" | |
xamarin-android: | |
runs-on: macos-12 | |
needs: ["test-xamarin", "test-flutter"] | |
if: ${{ github.ref == 'refs/heads/main' }} | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-dotnet@v3 | |
with: | |
global-json-file: ./global.json | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: "18.x" | |
- name: Set Xamarin SDK versions | |
run: | | |
# https://github.com/actions/runner-images/blob/main/images/macos/macos-12-Readme.md | |
$VM_ASSETS/select-xamarin-sdk-v2.sh --mono=6.12 --ios=16.2 --android=13.2 | |
- name: nuget restore | |
run: | | |
nuget restore ./XamarinFormSample/XamarinFormSample/XamarinFormSample.csproj | |
nuget restore ./XamarinFormSample/XamarinFormSample.Android/XamarinFormSample.Android.csproj | |
- name: Set versionCode | |
run: | | |
VERSION_CODE=$(date +%s) | |
sed -I "" -E 's/android:versionCode="[[:digit:]]+"/android:versionCode="'"$VERSION_CODE"'"/' XamarinFormSample/XamarinFormSample.Android/Properties/AndroidManifest.xml | |
- name: msbuild | |
run: msbuild ./XamarinFormSample/XamarinFormSample.Android/XamarinFormSample.Android.csproj /p:Configuration=Release /t:PackageForAndroid | |
- name: Run zipalign | |
run: | | |
BUILD_TOOLS_VERSION="35.0.0" | |
ls "$ANDROID_HOME/build-tools/$BUILD_TOOLS_VERSION" | |
"$ANDROID_HOME/build-tools/$BUILD_TOOLS_VERSION/zipalign" -p -f -v 4 ./XamarinFormSample/XamarinFormSample.Android/bin/Release/com.authgear.sdk.migratepluginexampleapp.xamarinflutter.apk "$RUNNER_TEMP/app-aligned.apk" | |
- name: Run apksigner | |
env: | |
ANDROID_KEYSTORE_PASSWORD: Abcd1234! | |
ANDROID_KEY_ALIAS: main | |
ANDROID_KEY_PASSWORD: Abcd1234! | |
run: | | |
BUILD_TOOLS_VERSION="35.0.0" | |
"$ANDROID_HOME/build-tools/$BUILD_TOOLS_VERSION/apksigner" sign \ | |
--ks keystore-main.jks \ | |
--ks-key-alias "$ANDROID_KEY_ALIAS" \ | |
--ks-pass "pass:$ANDROID_KEYSTORE_PASSWORD" \ | |
--key-pass "pass:$ANDROID_KEY_PASSWORD" \ | |
--out "$RUNNER_TEMP/app-signed.apk" \ | |
"$RUNNER_TEMP/app-aligned.apk" | |
- name: Distribute to App Center | |
env: | |
APPCENTER_ACCESS_TOKEN: ${{ secrets.ANDROID_APPCENTER_ACCESS_TOKEN }} | |
run: appcenter distribute release --debug --silent --file "$RUNNER_TEMP/app-signed.apk" --group "Collaborators" --app "Oursky/Authgear-Migrate-Tool-Xamarin-To-Flutter-Sample" --release-notes "xamarin android" | |
flutter-ios: | |
runs-on: macos-13 | |
needs: ["xamarin-ios"] # Depends on xamarin so that its version code is always bigger to allow updating | |
if: ${{ github.ref == 'refs/heads/main' }} | |
defaults: | |
run: | |
working-directory: "./flutter-example" | |
steps: | |
- uses: actions/checkout@v4 | |
- run: sudo xcode-select -s /Applications/Xcode_15.2.app/Contents/Developer | |
- run: gem install bundler | |
- working-directory: flutter-example | |
run: bundler install | |
- uses: subosito/flutter-action@v2 | |
with: | |
# Do _NOT_ use the latest stable as those contain breaking changes | |
flutter-version: '3.10.0' | |
channel: 'stable' | |
# This action takes 1m30s to finish. Enable cache to make it shorter. | |
cache: true | |
- run: flutter pub get | |
- run: flutter test | |
- run: flutter analyze --no-fatal-infos | |
- run: dart format --set-exit-if-changed lib | |
- name: Prepare certificate and provisioning profile | |
env: | |
IOS_CERTIFICATE_BASE64: ${{ secrets.IOS_CERTIFICATE_BASE64 }} | |
IOS_PROVISIONING_PROFILE_BASE64: ${{ secrets.IOS_PROVISIONING_PROFILE_BASE64 }} | |
run: | | |
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12 | |
PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision | |
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db | |
echo -n "$IOS_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH | |
echo -n "$IOS_PROVISIONING_PROFILE_BASE64" | base64 --decode -o $PP_PATH | |
security create-keychain -p "" $KEYCHAIN_PATH | |
security set-keychain-settings $KEYCHAIN_PATH | |
security unlock-keychain -p "" $KEYCHAIN_PATH | |
security import $CERTIFICATE_PATH -P "" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH | |
security list-keychain -d user -s $KEYCHAIN_PATH | |
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles | |
cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles | |
- name: Build .ipa | |
run: | | |
BUILD_NUMBER=$(date +%s) | |
flutter build ipa --export-options-plist ./exportOptions.plist --build-number $BUILD_NUMBER | |
- name: Distribute to App Store Connect | |
run: bundle exec fastlane app_testflight | |
xamarin-ios: | |
runs-on: macos-12 | |
# needs: ["test-xamarin", "test-flutter"] | |
if: ${{ github.ref == 'refs/heads/main' }} | |
steps: | |
- uses: actions/checkout@v3 | |
- run: gem install bundler | |
- working-directory: flutter-example | |
run: bundler install | |
- uses: actions/setup-dotnet@v3 | |
with: | |
global-json-file: ./global.json | |
# `select-xamarin-sdk-v2.sh --mono` set /Library/Frameworks/Mono.framework/Versions/Current | |
# Tools like `msbuild`, `nuget` comes from /Library/Frameworks/Mono.framework/Versions/Current/Commands/ | |
- run: npm install -g appcenter-cli | |
- name: Set Xamarin SDK versions | |
run: | | |
# https://github.com/actions/runner-images/blob/main/images/macos/macos-12-Readme.md | |
$VM_ASSETS/select-xamarin-sdk-v2.sh --mono=6.12 --ios=16.2 --android=13.2 | |
- run: sudo xcode-select -s /Applications/Xcode_14.2.app/Contents/Developer | |
- name: nuget restore | |
run: | | |
nuget restore ./XamarinFormSample/XamarinFormSample/XamarinFormSample.csproj | |
nuget restore ./XamarinFormSample/XamarinFormSample.iOS/XamarinFormSample.iOS.csproj | |
- name: Install the Apple certificate and provisioning profile | |
env: | |
IOS_CERTIFICATE_BASE64: ${{ secrets.IOS_CERTIFICATE_BASE64 }} | |
IOS_PROVISIONING_PROFILE_BASE64: ${{ secrets.IOS_PROVISIONING_PROFILE_BASE64 }} | |
run: | | |
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12 | |
PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision | |
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db | |
echo -n "$IOS_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH | |
echo -n "$IOS_PROVISIONING_PROFILE_BASE64" | base64 --decode -o $PP_PATH | |
security create-keychain -p "" $KEYCHAIN_PATH | |
security set-keychain-settings $KEYCHAIN_PATH | |
security unlock-keychain -p "" $KEYCHAIN_PATH | |
security import $CERTIFICATE_PATH -P "" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH | |
security list-keychain -d user -s $KEYCHAIN_PATH | |
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles | |
cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles | |
- name: Set CFBundleVersion | |
run: | | |
BUILD_NUMBER=$(date +%s) | |
/usr/libexec/Plistbuddy -c "Set CFBundleVersion $BUILD_NUMBER" ./XamarinFormSample/XamarinFormSample.iOS/Info.plist | |
- name: msbuild | |
run: msbuild ./XamarinFormSample/XamarinFormSample.iOS/XamarinFormSample.iOS.csproj /p:Configuration=Release /p:Platform=iPhone /p:BuildIpa=true /t:Rebuild /p:IpaPackageDir="$RUNNER_TEMP" | |
- name: Distribute to App Store Connect | |
working-directory: XamarinFormSample | |
env: | |
IOS_FASTLANE_APP_STORE_CONNECT_API_KEY_JSON_BASE64: ${{ secrets.IOS_FASTLANE_APP_STORE_CONNECT_API_KEY_JSON_BASE64 }} | |
run: | | |
APP_STORE_CONNECT_API_KEY_FILE=$RUNNER_TEMP/app_store_connect_key.json | |
# echo -n "$IOS_FASTLANE_APP_STORE_CONNECT_API_KEY_JSON_BASE64" | base64 --decode -o $APP_STORE_CONNECT_API_KEY_FILE | |
echo "{}" >> $APP_STORE_CONNECT_API_KEY_FILE | |
APP_IPA_FILE_PATH=$RUNNER_TEMP/XamarinFormSample.iOS.ipa | |
echo $APP_STORE_CONNECT_API_KEY_FILE | |
echo $APP_IPA_FILE_PATH | |
bundle exec fastlane app_testflight | |
- name: Clean up keychain and provisioning profile | |
if: ${{ always() }} | |
run: | | |
security delete-keychain $RUNNER_TEMP/app-signing.keychain-db | |
rm ~/Library/MobileDevice/Provisioning\ Profiles/build_pp.mobileprovision |