Build and Submit Android #249
This file contains hidden or 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: Build and Submit Android | |
on: | |
workflow_dispatch: | |
inputs: | |
profile: | |
type: choice | |
description: Build profile to use | |
options: | |
- testflight-android | |
- production | |
jobs: | |
build: | |
if: github.repository == 'bluesky-social/social-app' | |
name: Build and Submit Android | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check for EXPO_TOKEN | |
run: > | |
if [ -z "${{ secrets.EXPO_TOKEN }}" ]; then | |
echo "You must provide an EXPO_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" | |
exit 1 | |
fi | |
- name: ⬇️ Checkout | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 5 | |
- name: 🔧 Setup Node | |
uses: actions/setup-node@v4 | |
with: | |
node-version-file: .nvmrc | |
cache: yarn | |
- name: 🪛 Setup jq | |
uses: dcarbone/install-jq-action@v2 | |
- name: 🔨 Setup EAS | |
uses: expo/expo-github-action@v8 | |
with: | |
expo-version: latest | |
eas-version: latest | |
token: ${{ secrets.EXPO_TOKEN }} | |
- name: ⛏️ Setup EAS local builds | |
run: yarn global add eas-cli-local-build-plugin | |
- uses: actions/setup-java@v4 | |
with: | |
distribution: 'temurin' | |
java-version: '17' | |
- name: ⚙️ Install dependencies | |
run: yarn install | |
- name: 🔤 Compile translations | |
run: yarn intl:build 2>&1 | tee i18n.log | |
- name: Check for i18n compilation errors | |
run: if grep -q "invalid syntax" "i18n.log"; then echo "\n\nFound compilation errors!\n\n" && exit 1; else echo "\n\nNo compilation errors!\n\n"; fi | |
# EXPO_PUBLIC_ENV is handled in eas.json | |
- name: Env | |
id: env | |
run: | | |
export json='${{ secrets.GOOGLE_SERVICES_TOKEN }}' | |
echo "${{ secrets.ENV_TOKEN }}" > .env | |
echo "EXPO_PUBLIC_RELEASE_VERSION=$(jq -r '.version' package.json)" >> .env | |
echo "EXPO_PUBLIC_RELEASE_VERSION=$(jq -r '.version' package.json)" >> $GITHUB_OUTPUT | |
echo "EXPO_PUBLIC_BUNDLE_IDENTIFIER=$(git rev-parse HEAD)" >> .env | |
echo "EXPO_PUBLIC_BUNDLE_IDENTIFIER=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT | |
echo "EXPO_PUBLIC_BUNDLE_DATE=$(date -u +"%y%m%d%H")" >> .env | |
echo "EXPO_PUBLIC_SENTRY_DSN=${{ secrets.SENTRY_DSN }}" >> .env | |
echo "EXPO_PUBLIC_BITDRIFT_API_KEY=${{ secrets.BITDRIFT_API_KEY }}" >> .env | |
echo "EXPO_PUBLIC_GCP_PROJECT_ID=${{ secrets.EXPO_PUBLIC_GCP_PROJECT_ID }}" >> .env | |
echo "$json" > google-services.json | |
- name: 🏗️ EAS Build | |
run: > | |
SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }} | |
SENTRY_RELEASE=${{ steps.env.outputs.EXPO_PUBLIC_RELEASE_VERSION }} | |
SENTRY_DIST=${{ steps.env.outputs.EXPO_PUBLIC_BUNDLE_IDENTIFIER }} | |
yarn use-build-number-with-bump | |
eas build -p android | |
--profile ${{ inputs.profile || 'testflight-android' }} | |
--local --output build.aab --non-interactive | |
- name: ✍️ Rename Testflight bundle | |
if: ${{ inputs.profile != 'production' }} | |
run: mv build.aab build.apk | |
- name: ⏰ Get a timestamp | |
id: timestamp | |
uses: nanzm/get-time-action@master | |
with: | |
format: 'MM-DD-HH-mm-ss' | |
- name: 🚀 Upload Production Artifact | |
id: upload-artifact-production | |
if: ${{ inputs.profile == 'production' }} | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 30 | |
compression-level: 6 | |
name: build-${{ steps.timestamp.outputs.time }}.aab | |
path: build.aab | |
- name: 🚀 Upload Testflight Artifact | |
id: upload-artifact-testflight | |
if: ${{ inputs.profile != 'production' }} | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 30 | |
compression-level: 6 | |
name: build-${{ steps.timestamp.outputs.time }}.apk | |
path: build.apk | |
- name: 📚 Get version from package.json | |
id: get-build-info | |
run: bash scripts/setGitHubOutput.sh | |
- name: 🔔 Notify Slack of Production Build | |
if: ${{ inputs.profile == 'production' }} | |
uses: slackapi/[email protected] | |
with: | |
payload: | | |
{ | |
"text": "Android production build for Google Play Store submission is ready!\n```Artifact: ${{ steps.upload-artifact-production.outputs.artifact-url }}\nVersion Number: ${{ steps.get-build-info.outputs.PACKAGE_VERSION }}\nBuild Number: ${{ steps.get-build-info.outputs.BSKY_ANDROID_VERSION_CODE }}```" | |
} | |
env: | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLIENT_ALERT_WEBHOOK }} | |
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK | |
- name: 🔔 Notify Slack of Testflight Build | |
if: ${{ inputs.profile != 'production' }} | |
uses: slackapi/[email protected] | |
with: | |
payload: | | |
{ | |
"text": "Android build is ready for testing. Download the artifact here: ${{ steps.upload-artifact-testflight.outputs.artifact-url }}" | |
} | |
env: | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLIENT_ALERT_WEBHOOK }} | |
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK | |
- name: 🏗️ Build Production APK | |
if: ${{ inputs.profile == 'production' }} | |
run: > | |
SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }} | |
SENTRY_RELEASE=${{ steps.env.outputs.EXPO_PUBLIC_RELEASE_VERSION }} | |
SENTRY_DIST=${{ steps.env.outputs.EXPO_PUBLIC_BUNDLE_IDENTIFIER }} | |
yarn use-build-number-with-bump | |
eas build -p android | |
--profile production-apk | |
--local --output build.apk --non-interactive | |
- name: 🚀 Upload Production APK Artifact | |
id: upload-artifact-production-apk | |
if: ${{ inputs.profile == 'production' }} | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 30 | |
compression-level: 6 | |
name: build-${{ steps.timestamp.outputs.time }}.apk | |
path: build.apk | |
- name: 🔔 Notify Slack of Production APK Build | |
if: ${{ inputs.profile == 'production' }} | |
uses: slackapi/[email protected] | |
with: | |
payload: | | |
{ | |
"text": "Android production build for GitHub/Obtanium is ready!\n```Artifact: ${{ steps.upload-artifact-production-apk.outputs.artifact-url }}\nVersion Number: ${{ steps.get-build-info.outputs.PACKAGE_VERSION }}\nBuild Number: ${{ steps.get-build-info.outputs.BSKY_ANDROID_VERSION_CODE }}```" | |
} | |
env: | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLIENT_ALERT_WEBHOOK }} | |
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK | |
- name: ⬇️ Restore Cache | |
id: get-base-commit | |
uses: actions/cache@v4 | |
if: ${{ inputs.profile == 'testflight' }} | |
with: | |
path: most-recent-testflight-commit.txt | |
key: most-recent-testflight-commit | |
- name: ✏️ Write commit hash to cache | |
if: ${{ inputs.profile == 'testflight' }} | |
run: echo ${{ github.sha }} > most-recent-testflight-commit.txt |