Skip to content

Updated api urls.

Updated api urls. #48

name: πŸš€ EAS Android Build & Smart Release
on:
push:
branches: [main]
workflow_dispatch:
env:
EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
jobs:
build-android:
name: πŸ”¨ Build Android - Version Manager
runs-on: ubuntu-latest
outputs:
build_id: ${{ steps.build.outputs.BUILD_ID }}
app_version: ${{ steps.version-control.outputs.app_version }}
build_number: ${{ steps.version-control.outputs.build_number }}
build_date: ${{ steps.version-control.outputs.build_date }}
is_production: ${{ steps.version-control.outputs.is_production }}
steps:
# ========================
# πŸ› οΈ Repository Setup
# ========================
- name: "πŸ“¦ Checkout (Full History)"
uses: actions/checkout@v4
with:
fetch-depth: 0
# ========================
# βš™οΈ Environment Configuration
# ========================
- name: "πŸ“¦ Setup Node.js 20.x"
uses: actions/setup-node@v4
with:
node-version: 20.x
cache: "npm"
- name: "🧩 Install dependencies (ci)"
run: npm ci
# ========================
# πŸ”„ Version Management
# ========================
- name: "πŸ”„ Update Production Version"
if: github.ref == 'refs/heads/main'
run: node scripts/bumpVersion.js
- name: "πŸ”§ Configure Git for Automation"
if: github.ref == 'refs/heads/main'
run: |
git config --global user.name "GitHub Actions"
git config --global user.email "actions@github.com"
- name: "πŸ’Ύ Commit Version Update"
if: github.ref == 'refs/heads/main'
run: |
git add version.json
git commit -m "chore: Auto-increment version [skip ci]"
git push
# ========================
# πŸ“Œ Version Tagging
# ========================
- name: "🏷️ Set CI/CD Versions"
id: version-control
run: |
# Set production or preview version
if [ "${{ github.ref }}" == "refs/heads/main" ]; then
APP_VERSION=$(node -p "require('./app.config.js').expo.version")
IS_PRODUCTION="true"
else
APP_VERSION="1.0.0-prerelease.${{ github.run_number }}"
IS_PRODUCTION="false"
fi
# Generate build identifiers
BUILD_NUMBER="${{ github.run_id }}"
BUILD_DATE=$(date +'%Y%m%d-%H%M%S')
# Set outputs for downstream jobs
echo "app_version=$APP_VERSION" >> $GITHUB_OUTPUT
echo "build_number=$BUILD_NUMBER" >> $GITHUB_OUTPUT
echo "build_date=$BUILD_DATE" >> $GITHUB_OUTPUT
echo "is_production=$IS_PRODUCTION" >> $GITHUB_OUTPUT
# Export environment variables
echo "APP_VERSION=$APP_VERSION" >> $GITHUB_ENV
echo "BUILD_NUMBER=$BUILD_NUMBER" >> $GITHUB_ENV
echo "BUILD_DATE=$BUILD_DATE" >> $GITHUB_ENV
# ========================
# πŸ” EAS Setup & Auth
# ========================
- name: "βš™οΈ Install EAS CLI"
run: npm install -g eas-cli@latest
- name: "πŸ” Verify Expo Credentials"
run: npx eas whoami --token $EXPO_TOKEN
# ========================
# πŸ—οΈ Build Execution
# ========================
- name: "πŸš€ Trigger EAS Build"
id: build
run: |
echo "πŸ”„ Initializing build process..."
sudo apt-get install -y jq
# Execute build and capture metadata
BUILD_JSON=$(npx eas build -p android --profile production --non-interactive --json)
BUILD_ID=$(echo "$BUILD_JSON" | jq -r '.[0].id')
# Export build ID for downstream jobs
echo "BUILD_ID=$BUILD_ID" >> $GITHUB_ENV
echo "BUILD_ID=$BUILD_ID" >> $GITHUB_OUTPUT
download-apk:
name: "πŸ“₯ APK Artifact Handler"
runs-on: ubuntu-latest
needs: build-android
outputs:
apk_path: ${{ steps.download.outputs.APK_PATH }}
steps:
# ========================
# πŸ› οΈ Environment Setup
# ========================
- name: "πŸ“¦ Checkout Repository"
uses: actions/checkout@v4
- name: "βš™οΈ Setup Node.js"
uses: actions/setup-node@v4
with:
node-version: 20.x
# ========================
# πŸ“¦ Dependency Management
# ========================
- name: "🧰 Install Build Tools"
run: |
npm install -g eas-cli@latest
sudo apt-get install -y jq curl
# ========================
# πŸ” Build Monitoring
# ========================
- name: "⏳ Wait for Build Completion"
run: |
echo "⏰ Monitoring build status..."
npx eas build:wait --build-id ${{ needs.build-android.outputs.build_id }} --timeout 1800
# ========================
# πŸ“¦ Artifact Handling
# ========================
- name: "πŸ“₯ Download APK"
id: download
run: |
echo "πŸ”½ Retrieving APK URL..."
APK_URL=$(npx eas build:list --build-id ${{ needs.build-android.outputs.build_id }} --json | jq -r '.[0].artifacts.url')
echo "πŸ“₯ Downloading APK from $APK_URL..."
curl -L "$APK_URL" -o app-release.apk
echo "APK_PATH=app-release.apk" >> $GITHUB_OUTPUT
- name: "πŸ“€ Upload Artifact"
uses: actions/upload-artifact@v4
with:
name: android-apk
path: app-release.apk
generate-changelog:
name: "πŸ“œ Changelog Generator"
runs-on: ubuntu-latest
needs: build-android
outputs:
changelog: ${{ steps.changelog.outputs.CHANGELOG }}
steps:
# ========================
# πŸ› οΈ Repository Setup
# ========================
- name: "πŸ“‚ Checkout with Full History"
uses: actions/checkout@v4
with:
fetch-depth: 0
# ========================
# πŸ“„ Changelog Generation
# ========================
- name: "πŸ“‹ Create Release Notes"
id: changelog
run: |
echo "πŸ“ Generating changelog from git history..."
CHANGELOG=$(git log --pretty=format:"- %s (%h) by %an" -n 15)
echo "$CHANGELOG" > changelog.txt
echo "CHANGELOG=$(cat changelog.txt)" >> $GITHUB_OUTPUT
- name: "πŸ“€ Upload Changelog"
uses: actions/upload-artifact@v4
with:
name: changelog
path: changelog.txt
create-release:
name: "πŸš€ Smart Release Publisher"
runs-on: ubuntu-latest
needs: [build-android, download-apk, generate-changelog]
steps:
# ========================
# πŸ“₯ Artifact Retrieval
# ========================
- name: "πŸ“¦ Get APK Artifact"
uses: actions/download-artifact@v4
with:
name: android-apk
- name: "πŸ“„ Get Changelog"
uses: actions/download-artifact@v4
with:
name: changelog
# ========================
# 🏷️ Release Creation
# ========================
- name: "🎚️ Determine Release Type"
id: release-type
run: |
echo "πŸ” Detecting release type..."
if [ "${{ needs.build-android.outputs.is_production }}" = "true" ]; then
echo "🟒 Production release detected"
echo "RELEASE_TAG=v${{ needs.build-android.outputs.app_version }}" >> $GITHUB_ENV
echo "RELEASE_TITLE=Production Release v${{ needs.build-android.outputs.app_version }}" >> $GITHUB_ENV
else
echo "🟑 Nightly build detected"
echo "RELEASE_TAG=nightly-${{ needs.build-android.outputs.build_date }}" >> $GITHUB_ENV
echo "RELEASE_TITLE=Nightly Build (${{ needs.build-android.outputs.build_date }})" >> $GITHUB_ENV
fi
- name: "πŸŽ‰ Publish GitHub Release"
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ env.RELEASE_TAG }}
name: ${{ env.RELEASE_TITLE }}
body_path: changelog.txt
files: app-release.apk
prerelease: ${{ needs.build-android.outputs.is_production != 'true' }}