Skip to content

trigger_release

trigger_release #1447

# Trigger Bitrise to make a demo and prod release on `release/*` branch creation
name: trigger_release
on: create
concurrency:
group: demo-release-${{ github.ref }}
cancel-in-progress: true
jobs:
qa_lint:
runs-on: [ ubuntu-latest ]
if: ${{ contains(github.ref, 'refs/heads/release/') }}
steps:
- uses: actions/checkout@v4
- name: set up JDK
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 17
cache: 'gradle'
- name: QA Lint
run: ./gradlew --build-cache --no-daemon lintQaDebug
qa_unit_tests:
runs-on: [ ubuntu-latest ]
if: ${{ contains(github.ref, 'refs/heads/release/') }}
steps:
- uses: actions/checkout@v4
- name: set up JDK
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 17
cache: 'gradle'
- name: QA Unit Tests
run: ./gradlew --build-cache --no-daemon testQaDebugUnitTest
# reactivecircus/android-emulator-runner@v2 requires MacOS to run on
# https://github.com/ReactiveCircus/android-emulator-runner
qa_android_tests:
runs-on: macos-14
if: ${{ contains(github.ref, 'refs/heads/release/') }}
timeout-minutes: 60
env:
AVD_API_LEVEL: 30
AVD_ARCH: x86_64
HEROKU_API_KEY: ${{ secrets.SERVICES_HEROKU_API_KEY }}
steps:
- name: Checkout Android source
uses: actions/checkout@v4
with:
path: android-app
- name: Checkout server app source
uses: actions/checkout@v4
with:
repository: simpledotorg/simple-server
fetch-depth: 0 # Full clone needed for Heroku deploys (https://devcenter.heroku.com/changelog-items/775)
path: server-app
- name: Create node dependency hash
id: create_node_modules_hash
run: android-app/.github/scripts/compute_node_dependency_hash.sh
- name: Cache node modules
id: node-dependency-cache
uses: actions/cache@v4
with:
path: |
node_modules
package-lock.json
key: ${{ runner.os }}-npm-${{ steps.create_node_modules_hash.outputs.node_dep_hash }}
- name: Install Heroku CLI
if: steps.node-dependency-cache.outputs.cache-hit != 'true'
run: npm install heroku
- name: Link Heroku CLI globally
run: npm link heroku
- name: Install Heroku Buildpacks registry
run: heroku plugins:install buildpack-registry
- name: Link Heroku CLI globally
run: heroku plugins:install buildpacks
- name: Cache AVD
uses: actions/cache@v4
id: avd-cache
with:
path: |
~/.android/avd/*
~/.android/adb*
key: ${{ runner.os }}-avd-${{ env.AVD_API_LEVEL }}-${{ env.AVD_ARCH }}
- name: create AVD and generate snapshot for caching
if: steps.avd-cache.outputs.cache-hit != 'true'
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ env.AVD_API_LEVEL }}
arch: ${{ env.AVD_ARCH }}
force-avd-creation: false
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: false
disk-size: 8G
script: echo "Generated AVD snapshot for caching."
- name: set up JDK
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 17
cache: 'gradle'
- name: Generate server app name
id: generate-server-app-name
run: android-app/.github/scripts/generate_heroku_app_name.sh ${{ github.ref }}
- name: Deploy the server on Heroku
id: start-simple-server
run: |
android-app/.github/scripts/setup_heroku_instance.sh \
${{ steps.generate-server-app-name.outputs.heroku_app_name }} \
${{ env.HEROKU_API_KEY }} \
master \
server-app \
android-app \
${{ secrets.HEROKU_SECRET_PROPERTIES }}
- name: QA Android Tests
id: run-instrumented-tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ env.AVD_API_LEVEL }}
arch: ${{ env.AVD_ARCH }}
force-avd-creation: false
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true
disk-size: 8G
script: |
adb root
mkdir -p android-app/app/build/outputs/test-artifacts
android-app/gradlew -p android-app --build-cache --no-daemon -PmanifestEndpoint=${{ steps.start-simple-server.outputs.heroku_app_url }}api/ installQaDebug installQaDebugAndroidTest
adb shell am instrument -w -e filter org.simple.clinic.benchmark.SelectBenchmarkTests -e benchmark_app_performance false org.simple.clinic.qa.debug.test/org.simple.clinic.AndroidTestJUnitRunner >android-app/app/build/outputs/test-artifacts/logs.txt 2>android-app/app/build/outputs/test-artifacts/logs.txt
cat android-app/app/build/outputs/test-artifacts/logs.txt
adb pull /storage/emulated/0/Android/data/org.simple.clinic.qa.debug/ android-app/app/build/outputs/test-artifacts/ || true
adb uninstall org.simple.clinic.qa.debug
adb uninstall org.simple.clinic.qa.debug.test
! grep -q "FAILURES\!\!\!" android-app/app/build/outputs/test-artifacts/logs.txt
- name: Upload failed test artifacts
if: always() && steps.run-instrumented-tests.outcome != 'success'
uses: actions/upload-artifact@v4
with:
name: test-artifacts
path: android-app/app/build/outputs/test-artifacts
- name: Teardown Heroku instance
if: always() && (steps.start-simple-server.outcome != 'success' || contains(github.ref, '/release/'))
run: |
heroku apps:destroy \
--app=${{ steps.generate-server-app-name.outputs.heroku_app_name }} \
--confirm=${{ steps.generate-server-app-name.outputs.heroku_app_name }}
verify_release_bundles:
runs-on: [ ubuntu-latest ]
if: ${{ contains(github.ref, 'refs/heads/release/') }}
strategy:
matrix:
buildType: [ 'Production' ]
steps:
- uses: actions/checkout@v4
- name: set up JDK
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 17
cache: 'gradle'
- name: Build ${{ matrix.buildType }} Release bundle
run: |
./gradlew \
-PrunProguard=true \
-PdefaultProguardFile=proguard-android.txt \
bundle${{ matrix.buildType }}Release
verify_room_schemas:
runs-on: [ ubuntu-latest ]
if: ${{ contains(github.ref, 'refs/heads/release/') }}
steps:
- name: Checkout master
uses: actions/checkout@v4
with:
ref: master
path: master
- name: Checkout current
uses: actions/checkout@v4
with:
path: current
- name: Verify existing Room schemas are not modified
run: current/.github/scripts/compare_directory_contents.sh master/app/schemas/org.simple.clinic.AppDatabase current/app/schemas/org.simple.clinic.AppDatabase
demo_release:
needs: [ qa_lint, qa_unit_tests, qa_android_tests, verify_release_bundles, verify_room_schemas ]
runs-on: [ ubuntu-latest ]
steps:
- uses: actions/checkout@v4
with:
ref: ${{github.ref}}
- name: Trigger Demo Release
run: kotlinc -script ".github/scripts/TriggerBitriseRelease.main.kts" "${{ github.ref }}" "${{ secrets.BITRISE_ACCESS_TOKEN }}" "${{ secrets.BITRISE_APP_SLUG }}" "${{ secrets.BITRISE_DEMO_WORKFLOW }}"
prod_release:
needs: [ qa_lint, qa_unit_tests, qa_android_tests, verify_release_bundles, verify_room_schemas ]
runs-on: [ ubuntu-latest ]
steps:
- uses: actions/checkout@v4
with:
ref: ${{github.ref}}
- name: Trigger Prod Release
run: kotlinc -script ".github/scripts/TriggerBitriseRelease.main.kts" "${{ github.ref }}" "${{ secrets.BITRISE_ACCESS_TOKEN }}" "${{ secrets.BITRISE_APP_SLUG }}" "${{ secrets.BITRISE_PROD_WORKFLOW }}"