Skip to content

Adding build:view debugging #31

Adding build:view debugging

Adding build:view debugging #31

name: EAS Android Build & Release
on:
push:
branches: [main]
workflow_dispatch:
env:
EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
jobs:
build-android:
name: Build Android APK
runs-on: ubuntu-latest
outputs:
build_id: ${{ steps.build.outputs.BUILD_ID }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20.x
cache: "npm"
- name: Install dependencies
run: npm ci
- name: Install EAS CLI
run: npm install -g eas-cli@latest
- name: Debug Expo Authentication
run: |
echo "Checking Expo authentication..."
npx eas whoami --token $EXPO_TOKEN || echo "Expo authentication check failed!"
- name: Start EAS Build
id: build
run: |
echo "Starting EAS build..."
sudo apt-get install -y jq
# Run build and capture JSON output
BUILD_JSON=$(npx eas build -p android --profile production --non-interactive --json)
echo "Raw build output: $BUILD_JSON"
# Extract BUILD_ID
BUILD_ID=$(echo "$BUILD_JSON" | jq -r '.[0].id')
if [[ -z "$BUILD_ID" || "$BUILD_ID" == "null" ]]; then
echo "Error: Failed to retrieve BUILD_ID!"
exit 1
fi
echo "EAS Build started with ID: $BUILD_ID"
echo "BUILD_ID=$BUILD_ID" >> $GITHUB_ENV
echo "BUILD_ID=$BUILD_ID" >> $GITHUB_OUTPUT
env:
EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
download-apk:
name: Download APK
runs-on: ubuntu-latest
needs: build-android
outputs:
apk_path: ${{ steps.download.outputs.APK_PATH }}
steps:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20.x
- name: Install Required Tools
run: |
npm install -g eas-cli@latest
sudo apt-get update
sudo apt-get install -y jq curl
- name: Wait for EAS Build to Complete
run: |
BUILD_ID=${{ needs.build-android.outputs.build_id }}
echo "Starting build monitoring for BUILD_ID: $BUILD_ID"
RETRY_COUNT=0
MAX_RETRIES=120 # 120 attempts * 30 seconds = 60 minutes
SLEEP_TIME=30
while [[ $RETRY_COUNT -lt $MAX_RETRIES ]]; do
echo -e "\n=== Attempt $((RETRY_COUNT+1))/$MAX_RETRIES ==="
# Get build status with full error visibility
echo "Fetching build status..."
npx eas build:view --json $BUILD_ID
BUILD_STATUS_JSON=$(npx eas build:view --json $BUILD_ID)
echo "Raw API response: $BUILD_STATUS_JSON"
# Validate JSON structure
if ! echo "$BUILD_STATUS_JSON" | jq empty >/dev/null 2>&1; then
echo "Error: Invalid JSON response from EAS API!"
exit 1
fi
# Parse status fields
BUILD_STATUS=$(echo "$BUILD_STATUS_JSON" | jq -r '.status')
ERROR_MESSAGE=$(echo "$BUILD_STATUS_JSON" | jq -r '.error.message // empty')
echo "Parsed status: $BUILD_STATUS"
[[ -n "$ERROR_MESSAGE" ]] && echo "Error message: $ERROR_MESSAGE"
case $BUILD_STATUS in
"finished")
APK_URL=$(echo "$BUILD_STATUS_JSON" | jq -r '.artifacts.buildUrl')
if [[ -z "$APK_URL" || "$APK_URL" == "null" ]]; then
echo "Error: Successful build but no APK URL found!"
echo "Full response: $BUILD_STATUS_JSON"
exit 1
fi
echo "APK_URL=$APK_URL" >> $GITHUB_ENV
echo "Build completed successfully!"
exit 0
;;
"errored")
echo "Build failed! Error details:"
echo "$BUILD_STATUS_JSON" | jq .
exit 1
;;
"canceled")
echo "Build was canceled!"
exit 1
;;
"new"|"in_queue"|"in_progress"|"pending")
echo "Build still in progress..."
;;
*)
echo "Unknown build status: $BUILD_STATUS"
echo "Full response: $BUILD_STATUS_JSON"
exit 1
;;
esac
RETRY_COUNT=$((RETRY_COUNT+1))
echo "Waiting $SLEEP_TIME seconds before next check..."
sleep $SLEEP_TIME
done
echo "Error: Build did not complete within $((MAX_RETRIES * SLEEP_TIME / 60)) minutes!"
exit 1
env:
EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
- name: Download APK
id: download
run: |
echo "Downloading APK from: $APK_URL"
curl -L -o app-release.apk "$APK_URL"
ls -lh app-release.apk
echo "APK_PATH=app-release.apk" >> $GITHUB_OUTPUT
- name: Upload APK as artifact
uses: actions/upload-artifact@v4
with:
name: android-apk
path: app-release.apk
generate-changelog:
name: Generate Changelog
runs-on: ubuntu-latest
needs: build-android
outputs:
changelog: ${{ steps.changelog.outputs.CHANGELOG }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Generate Changelog
id: changelog
run: |
echo "Generating changelog..."
git fetch --prune --unshallow 2> /dev/null || true
echo "## Changelog" > changelog.txt
echo "" >> changelog.txt
git log --pretty=format:"- %s (%h) by %an" $(git rev-parse HEAD^)..HEAD >> changelog.txt
echo "CHANGELOG=$(cat changelog.txt)" >> $GITHUB_OUTPUT
cat changelog.txt
- name: Upload Changelog as artifact
uses: actions/upload-artifact@v4
with:
name: changelog
path: changelog.txt
create-release:
name: Create GitHub Release
runs-on: ubuntu-latest
needs: [download-apk, generate-changelog]
steps:
- name: Download APK artifact
uses: actions/download-artifact@v4
with:
name: android-apk
- name: Download Changelog artifact
uses: actions/download-artifact@v4
with:
name: changelog
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: v1.0.${{ github.run_number }}
name: Release v1.0.${{ github.run_number }}
body_path: changelog.txt
draft: false
prerelease: false
files: app-release.apk