ci(release): check for existing versionCode on Google Play before build (#3320)

main
James Rich 2025-10-03 16:29:16 -05:00 zatwierdzone przez GitHub
rodzic be2719d365
commit c1f411b2ad
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
1 zmienionych plików z 60 dodań i 9 usunięć

Wyświetl plik

@ -97,9 +97,47 @@ jobs:
echo "exists=false" >> $GITHUB_OUTPUT echo "exists=false" >> $GITHUB_OUTPUT
fi fi
check-versioncode-google-play:
runs-on: ubuntu-latest
needs: prepare-build-info
outputs:
exists: ${{ steps.check_versioncode.outputs.exists }}
steps:
- name: Checkout code
uses: actions/checkout@v5
- name: Setup Fastlane
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.2'
bundler-cache: true
- name: Check if versionCode exists on Google Play Internal Track
id: check_versioncode
env:
VERSION_CODE: ${{ needs.prepare-build-info.outputs.APP_VERSION_CODE }}
GOOGLE_PLAY_JSON_KEY: ${{ secrets.GOOGLE_PLAY_JSON_KEY }}
run: |
set -euo pipefail
echo "$GOOGLE_PLAY_JSON_KEY" > /tmp/play-store-credentials.json
exists=false
if bundle exec fastlane supply --help | grep -q -- '--json'; then
JSON=$(bundle exec fastlane supply --json_key /tmp/play-store-credentials.json --package_name com.geeksville.mesh --track internal --json || true)
if echo "$JSON" | jq -e ".tracks.internal.releases[].versionCodes[] | select(. == ${VERSION_CODE})" >/dev/null 2>&1; then
exists=true
fi
else
# Fallback: use fastlane action output and parse array from stdout
OUTFILE=$(mktemp)
bundle exec fastlane run google_play_track_version_codes json_key:/tmp/play-store-credentials.json package_name:com.geeksville.mesh track:internal --capture_output | tee "$OUTFILE" || true
ARR=$(grep -oE '\\[[^]]*\\]' "$OUTFILE" | head -n1)
if echo "$ARR" | tr -d '[] ' | tr ',' '\n' | grep -x "${VERSION_CODE}" >/dev/null 2>&1; then
exists=true
fi
fi
echo "exists=${exists}" >> $GITHUB_OUTPUT
release-google: release-google:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [prepare-build-info, prepare-release-environment] needs: [prepare-build-info, prepare-release-environment, check-versioncode-google-play]
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v5 uses: actions/checkout@v5
@ -146,12 +184,19 @@ jobs:
bundler-cache: true bundler-cache: true
- name: Build and Deploy to Internal Track - name: Build and Deploy to Internal Track
if: needs.prepare-release-environment.outputs.exists == 'false' if: contains(github.ref_name, '-internal') && needs.prepare-release-environment.outputs.exists == 'false' && needs.check-versioncode-google-play.outputs.exists == 'false'
env: env:
VERSION_NAME: ${{ needs.prepare-build-info.outputs.APP_VERSION_NAME }} VERSION_NAME: ${{ needs.prepare-build-info.outputs.APP_VERSION_NAME }}
VERSION_CODE: ${{ needs.prepare-build-info.outputs.APP_VERSION_CODE }} VERSION_CODE: ${{ needs.prepare-build-info.outputs.APP_VERSION_CODE }}
run: bundle exec fastlane internal run: bundle exec fastlane internal
- name: Build Google artifacts without upload
if: contains(github.ref_name, '-internal') && needs.prepare-release-environment.outputs.exists == 'false' && needs.check-versioncode-google-play.outputs.exists == 'true'
env:
VERSION_NAME: ${{ needs.prepare-build-info.outputs.APP_VERSION_NAME }}
VERSION_CODE: ${{ needs.prepare-build-info.outputs.APP_VERSION_CODE }}
run: ./gradlew clean bundleGoogleRelease assembleGoogleRelease -Pandroid.injected.version.name=${VERSION_NAME} -Pandroid.injected.version.code=${VERSION_CODE}
- name: Determine Fastlane Promotion Lane - name: Determine Fastlane Promotion Lane
id: fastlane_lane id: fastlane_lane
if: "!contains(github.ref_name, '-internal')" if: "!contains(github.ref_name, '-internal')"
@ -165,15 +210,21 @@ jobs:
echo "lane=production" >> $GITHUB_OUTPUT echo "lane=production" >> $GITHUB_OUTPUT
fi fi
- name: Ensure internal track has version for promotion
if: "!contains(github.ref_name, '-internal') && needs.check-versioncode-google-play.outputs.exists != 'true'"
run: |
echo "::error::Cannot promote: versionCode ${{ needs.prepare-build-info.outputs.APP_VERSION_CODE }} not found on Google Play internal track. Run internal build first." >&2
exit 1
- name: Promote on Google Play - name: Promote on Google Play
if: "steps.fastlane_lane.outputs.lane != ''" if: "steps.fastlane_lane.outputs.lane != '' && needs.check-versioncode-google-play.outputs.exists == 'true'"
env: env:
VERSION_NAME: ${{ needs.prepare-build-info.outputs.APP_VERSION_NAME }} VERSION_NAME: ${{ needs.prepare-build-info.outputs.APP_VERSION_NAME }}
VERSION_CODE: ${{ needs.prepare-build-info.outputs.APP_VERSION_CODE }} VERSION_CODE: ${{ needs.prepare-build-info.outputs.APP_VERSION_CODE }}
run: bundle exec fastlane ${{ steps.fastlane_lane.outputs.lane }} run: bundle exec fastlane ${{ steps.fastlane_lane.outputs.lane }}
- name: Upload Google AAB artifact - name: Upload Google AAB artifact
if: needs.prepare-release-environment.outputs.exists == 'false' if: needs.prepare-release-environment.outputs.exists == 'false' && contains(github.ref_name, '-internal')
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: google-aab name: google-aab
@ -181,7 +232,7 @@ jobs:
retention-days: 1 retention-days: 1
- name: Upload Google APK artifact - name: Upload Google APK artifact
if: needs.prepare-release-environment.outputs.exists == 'false' if: needs.prepare-release-environment.outputs.exists == 'false' && contains(github.ref_name, '-internal')
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: google-apk name: google-apk
@ -189,7 +240,7 @@ jobs:
retention-days: 1 retention-days: 1
- name: Attest Google artifacts provenance - name: Attest Google artifacts provenance
if: needs.prepare-release-environment.outputs.exists == 'false' if: needs.prepare-release-environment.outputs.exists == 'false' && contains(github.ref_name, '-internal')
uses: actions/attest-build-provenance@v3 uses: actions/attest-build-provenance@v3
with: with:
subject-path: | subject-path: |
@ -197,9 +248,9 @@ jobs:
app/build/outputs/apk/google/release/app-google-release.apk app/build/outputs/apk/google/release/app-google-release.apk
release-fdroid: release-fdroid:
if: needs.prepare-release-environment.outputs.exists == 'false' if: contains(github.ref_name, '-internal') && needs.prepare-release-environment.outputs.exists == 'false' && needs.check-versioncode-google-play.outputs.exists == 'false'
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [prepare-build-info, prepare-release-environment] needs: [prepare-build-info, prepare-release-environment, check-versioncode-google-play]
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v5 uses: actions/checkout@v5
@ -254,7 +305,7 @@ jobs:
manage-github-release: manage-github-release:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [prepare-build-info, prepare-release-environment, release-google, release-fdroid] needs: [prepare-build-info, prepare-release-environment, check-versioncode-google-play, release-google, release-fdroid]
steps: steps:
- name: Download all artifacts - name: Download all artifacts
if: needs.prepare-release-environment.outputs.exists == 'false' if: needs.prepare-release-environment.outputs.exists == 'false'