@@ -15,145 +15,25 @@ jobs:
1515 fetch-depth : 0
1616 ref : " code/cash"
1717
18- - name : Verify Packaging.kt exists
19- run : |
20- if [ ! -f buildSrc/src/main/java/Packaging.kt ]; then
21- echo "Error: Packaging.kt not found"
22- exit 1
23- fi
24-
2518 - name : Decode Service Account Key JSON file
2619 uses : timheuer/base64-to-file@v1
2720 id : service_account_json_file
2821 with :
2922 fileName : serviceAccount.json
3023 encodedString : ${{ secrets.FLIPCASH_SERVICE_ACCOUNT_KEY_JSON }}
3124
32- - name : Get Play API access token
33- id : token
34- env :
35- SA_PATH : ${{ steps.service_account_json_file.outputs.filePath }}
36- run : |
37- NOW=$(date +%s); EXP=$((NOW + 3600))
38- CLIENT_EMAIL=$(jq -r .client_email "$SA_PATH")
39- PRIVATE_KEY=$(jq -r .private_key "$SA_PATH")
40-
41- HEADER=$(echo -n '{"alg":"RS256","typ":"JWT"}' | base64 -w0 | tr '+/' '-_' | tr -d '=')
42- PAYLOAD=$(jq -nc \
43- --arg iss "$CLIENT_EMAIL" \
44- --arg scope "https://www.googleapis.com/auth/androidpublisher" \
45- --argjson iat $NOW --argjson exp $EXP \
46- '{iss:$iss, scope:$scope, aud:"https://oauth2.googleapis.com/token", iat:$iat, exp:$exp}' \
47- | base64 -w0 | tr '+/' '-_' | tr -d '=')
48-
49- SIG=$(printf '%s.%s' "$HEADER" "$PAYLOAD" \
50- | openssl dgst -sha256 -sign <(echo "$PRIVATE_KEY") \
51- | base64 -w0 | tr '+/' '-_' | tr -d '=')
52-
53- ACCESS=$(curl -s -X POST https://oauth2.googleapis.com/token \
54- -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
55- -d "assertion=$HEADER.$PAYLOAD.$SIG" | jq -r .access_token)
56-
57- if [ -z "$ACCESS" ] || [ "$ACCESS" = "null" ]; then
58- echo "Error: Failed to mint Play API access token"
59- exit 1
60- fi
61-
62- echo "::add-mask::$ACCESS"
63- echo "access_token=$ACCESS" >> "$GITHUB_OUTPUT"
64-
65- - name : Fetch tracks and update manifest
25+ - name : Update release manifest
6626 id : manifest
6727 env :
68- ACCESS : ${{ steps.token.outputs.access_token }}
69- PKG : com.flipcash.app.android
70- MANIFEST_PATH : .well-known/release-manifest.json
71- run : |
72- AUTH="Authorization: Bearer $ACCESS"
73- BASE="https://androidpublisher.googleapis.com/androidpublisher/v3/applications/$PKG"
74- EDIT_ID=$(curl -s -X POST "$BASE/edits" -H "$AUTH" | jq -r .id)
75-
76- if [ -z "$EDIT_ID" ] || [ "$EDIT_ID" = "null" ]; then
77- echo "Error: Failed to create Play API edit"
78- exit 1
79- fi
80-
81- fetch_track() {
82- curl -s "$BASE/edits/$EDIT_ID/tracks/$1" -H "$AUTH" \
83- | jq -c '[.releases[]? | select(.status == "completed") | .versionCodes[]?] | map(tonumber) | max // null'
84- }
85-
86- PROD=$(fetch_track production)
87- BETA=$(fetch_track beta)
88- ALPHA=$(fetch_track alpha)
89- INTERNAL=$(fetch_track internal)
90-
91- curl -s -X DELETE "$BASE/edits/$EDIT_ID" -H "$AUTH" || true
92-
93- OLD_PROD=$(jq -r '.tracks.production // empty' "$MANIFEST_PATH" 2>/dev/null || echo "")
94-
95- mkdir -p "$(dirname "$MANIFEST_PATH")"
96- jq -n \
97- --argjson production "$PROD" \
98- --argjson beta "$BETA" \
99- --argjson alpha "$ALPHA" \
100- --argjson internal "$INTERNAL" \
101- --arg updated "$(date -u +%FT%TZ)" \
102- '{updated: $updated, tracks: {production:$production, beta:$beta, alpha:$alpha, internal:$internal}}' \
103- > "$MANIFEST_PATH"
104-
105- echo "old_prod=$OLD_PROD" >> "$GITHUB_OUTPUT"
106- echo "new_prod=$PROD" >> "$GITHUB_OUTPUT"
107- cat "$MANIFEST_PATH"
108-
109- - name : Determine if production changed
110- id : check
111- run : |
112- if [ "${{ steps.manifest.outputs.old_prod }}" = "${{ steps.manifest.outputs.new_prod }}" ]; then
113- echo "Production unchanged (${{ steps.manifest.outputs.new_prod }}) — manifest refreshed, skipping patch bump"
114- echo "prod_changed=false" >> "$GITHUB_OUTPUT"
115- else
116- echo "prod_changed=true" >> "$GITHUB_OUTPUT"
117- fi
118-
119- - name : Read current patch version and increment
120- if : steps.check.outputs.prod_changed == 'true'
121- id : version
122- run : |
123- CURRENT=$(sed -n '/object Flipcash : Packaging(/,/)/ s/.*patchVersion = \([0-9][0-9]*\).*/\1/p' buildSrc/src/main/java/Packaging.kt)
124- MAJOR=$(sed -n '/object Flipcash : Packaging(/,/)/ s/.*majorVersion = \([0-9][0-9]*\).*/\1/p' buildSrc/src/main/java/Packaging.kt)
125- MINOR=$(sed -n '/object Flipcash : Packaging(/,/)/ s/.*minorVersion = \([0-9][0-9]*\).*/\1/p' buildSrc/src/main/java/Packaging.kt)
126-
127- if [ -z "$CURRENT" ] || [ -z "$MAJOR" ] || [ -z "$MINOR" ]; then
128- echo "Error: Failed to parse version fields from Packaging.kt"
129- echo " major=$MAJOR minor=$MINOR patch=$CURRENT"
130- exit 1
131- fi
132-
133- NEXT=$((CURRENT + 1))
134- echo "CURRENT=$CURRENT" >> $GITHUB_OUTPUT
135- echo "NEXT=$NEXT" >> $GITHUB_OUTPUT
136- echo "VERSION=$MAJOR.$MINOR.$NEXT" >> $GITHUB_OUTPUT
137-
138- - name : Update patchVersion
139- if : steps.check.outputs.prod_changed == 'true'
140- run : |
141- sed -i '/object Flipcash : Packaging(/,/)/ s/patchVersion = [0-9][0-9]*/patchVersion = ${{ steps.version.outputs.NEXT }}/' buildSrc/src/main/java/Packaging.kt
142-
143- - name : Validate updated field
144- if : steps.check.outputs.prod_changed == 'true'
145- run : |
146- if ! grep -A 10 'object Flipcash : Packaging(' buildSrc/src/main/java/Packaging.kt | grep -q "patchVersion = ${{ steps.version.outputs.NEXT }}"; then
147- echo "Error: Failed to update patchVersion to ${{ steps.version.outputs.NEXT }}"
148- exit 1
149- fi
28+ SERVICE_ACCOUNT_KEY_JSON : ${{ steps.service_account_json_file.outputs.filePath }}
29+ run : bash scripts/update-release-manifest.sh
15030
15131 - name : Commit & Push changes
15232 uses : actions-js/push@master
15333 with :
15434 message : >-
155- ${{ steps.check .outputs.prod_changed == 'true'
156- && format('build: release versionCode {0}, bump Flipcash to {1}', steps.manifest.outputs.new_prod, steps.version .outputs.VERSION )
157- || 'chore : refresh release manifest' }}
35+ ${{ steps.manifest .outputs.prod_changed == 'true'
36+ && format('build: release versionCode {0}, bump Flipcash to {1}', steps.manifest.outputs.new_prod, steps.manifest .outputs.version )
37+ || 'build : refresh release manifest' }}
15838 branch : " code/cash"
159- github_token : ${{ secrets.BOT_GITHUB_TOKEN }}
39+ github_token : ${{ secrets.BOT_GITHUB_TOKEN }}
0 commit comments