Fixing create release job. #41
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: 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 | |
BUILD_JSON=$(npx eas build -p android --profile production --non-interactive --json) | |
echo "Raw build output: $BUILD_JSON" | |
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: Checkout repository | |
uses: actions/checkout@v4 | |
- 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: Install Project Dependencies (Including dotenv) | |
run: npm ci | |
- name: Verify Project Files | |
run: | | |
echo "Current directory contents:" | |
ls -la | |
echo "Checking for eas.json:" | |
cat eas.json || echo "No eas.json found!" | |
- name: Wait for EAS Build to Complete | |
run: | | |
cd $GITHUB_WORKSPACE | |
BUILD_ID=${{ needs.build-android.outputs.build_id }} | |
echo "Starting build monitoring for BUILD_ID: $BUILD_ID" | |
# Initial check without JSON for better error visibility | |
npx eas build:view $BUILD_ID || true | |
RETRY_COUNT=0 | |
MAX_RETRIES=120 | |
SLEEP_TIME=30 | |
while [[ $RETRY_COUNT -lt $MAX_RETRIES ]]; do | |
echo -e "\n=== Attempt $((RETRY_COUNT+1))/$MAX_RETRIES ===" | |
BUILD_STATUS_JSON=$(npx eas build:view --json $BUILD_ID) | |
echo "Raw API response: $BUILD_STATUS_JSON" | |
# Validate JSON and check for empty response | |
if ! echo "$BUILD_STATUS_JSON" | jq empty >/dev/null 2>&1 || [[ -z "$BUILD_STATUS_JSON" ]]; then | |
echo "Error: Invalid or empty response from EAS API! Retrying..." | |
RETRY_COUNT=$((RETRY_COUNT+1)) | |
sleep $SLEEP_TIME | |
continue | |
fi | |
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!" | |
exit 1 | |
fi | |
echo "APK_URL=$APK_URL" >> $GITHUB_ENV | |
exit 0 | |
;; | |
"ERRORED"|"CANCELLED") | |
if [[ "$BUILD_STATUS" == "canceled" ]]; then | |
echo "Build was canceled! Details:" | |
else | |
echo "Build failed! Error details:" | |
fi | |
echo "$BUILD_STATUS_JSON" | jq . | |
exit 1 | |
;; | |
"NEW"|"IN_QUE"|"IN_PROGRESS"|"PENDING") | |
echo "Build is still in progress..." | |
;; | |
*) | |
echo "Unknown build status: $BUILD_STATUS" | |
exit 1 | |
;; | |
esac | |
RETRY_COUNT=$((RETRY_COUNT+1)) | |
sleep $SLEEP_TIME | |
done | |
echo "Error: Build did not complete within the expected time!" | |
exit 1 | |
env: | |
EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }} | |
- name: Download APK | |
id: download | |
run: | | |
echo "Downloading APK from: $APK_URL" | |
curl -L "$APK_URL" -o app-release.apk | |
ls -lh app-release.apk | |
echo "APK_PATH=app-release.apk" >> $GITHUB_OUTPUT | |
echo "Downloaded APK size: $(du -h app-release.apk | cut -f1)" | |
- 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 | |
with: | |
fetch-depth: 0 # Ensures full history is available | |
- name: Generate Changelog | |
id: changelog | |
run: | | |
echo "Generating changelog..." | |
# Ensure full history is available | |
git fetch --prune --unshallow || true | |
# Generate changelog and write to file | |
CHANGELOG=$(git log --pretty=format:"- %s (%h) by %an" -n 10) | |
echo "$CHANGELOG" > changelog.txt | |
# Output for debugging | |
echo "Changelog content:" | |
cat changelog.txt | |
# Store in environment variables | |
CHANGELOG_ESCAPED=$(echo "$CHANGELOG" | sed 's/"/\\"/g' | tr -d '\r') | |
echo "CHANGELOG=$CHANGELOG_ESCAPED" >> $GITHUB_OUTPUT | |
echo "CHANGELOG<<EOF" >> $GITHUB_ENV | |
echo "$CHANGELOG_ESCAPED" >> $GITHUB_ENV | |
echo "EOF" >> $GITHUB_ENV | |
- 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 |