Skip to content

Commit 9465b27

Browse files
committed
fix(ci): scope manifest updates to requested tracks only
The release manifest script now accepts a TRACKS env var to control which tracks are fetched and updated — unspecified tracks are preserved from the existing manifest. The deploy workflow passes its track input through, and bump-patch targets production with a configurable track selector and optional force_bump override. Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 19885c1 commit 9465b27

3 files changed

Lines changed: 80 additions & 34 deletions

File tree

.github/workflows/build-fcash2-upload-android.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ jobs:
117117
id: manifest
118118
env:
119119
SERVICE_ACCOUNT_KEY_JSON: ${{ steps.service_account_json_file.outputs.filePath }}
120+
TRACKS: ${{ github.event.inputs.track }}
120121
run: bash scripts/update-release-manifest.sh
121122

122123
- name: Commit & push manifest

.github/workflows/bump-patch.yml

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,22 @@ name: Record production release and bump patch
22

33
on:
44
workflow_dispatch:
5+
inputs:
6+
track:
7+
description: 'Track to record in the manifest'
8+
required: true
9+
default: 'production'
10+
type: choice
11+
options:
12+
- internal
13+
- alpha
14+
- beta
15+
- production
16+
force_bump:
17+
description: 'Force patch version bump regardless of track changes'
18+
required: false
19+
default: false
20+
type: boolean
521

622
jobs:
723
release:
@@ -26,14 +42,17 @@ jobs:
2642
id: manifest
2743
env:
2844
SERVICE_ACCOUNT_KEY_JSON: ${{ steps.service_account_json_file.outputs.filePath }}
45+
TRACKS: ${{ github.event.inputs.track }}
46+
FORCE_BUMP: ${{ github.event.inputs.force_bump }}
2947
run: bash scripts/update-release-manifest.sh
3048

3149
- name: Commit & Push changes
50+
if: steps.manifest.outputs.prod_changed == 'true' || steps.manifest.outputs.forced == 'true'
3251
uses: actions-js/push@master
3352
with:
3453
message: >-
3554
${{ 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' }}
55+
&& format('build: release Flipcash {0} ({1}), bump to {2}', steps.manifest.outputs.new_prod_name, steps.manifest.outputs.new_prod, steps.manifest.outputs.version)
56+
|| format('build: bump Flipcash to {0}', steps.manifest.outputs.version) }}
3857
branch: "code/cash"
3958
github_token: ${{ secrets.BOT_GITHUB_TOKEN }}

scripts/update-release-manifest.sh

Lines changed: 58 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
# SERVICE_ACCOUNT_KEY_JSON — path to the Google service account JSON file
1010
# PKG — package name (default: com.flipcash.app.android)
1111
# MANIFEST_PATH — manifest location (default: .well-known/release-manifest.json)
12+
# TRACKS — space-separated list of tracks to fetch and update
13+
# (default: production beta alpha internal)
14+
# Tracks not listed are preserved from the existing manifest.
1215
#
1316
# Outputs (written to $GITHUB_OUTPUT when running in CI):
1417
# old_prod / new_prod — previous and current production versionCode
@@ -28,6 +31,13 @@ fi
2831
SA_PATH="$SERVICE_ACCOUNT_KEY_JSON"
2932
PKG="${PKG:-com.flipcash.app.android}"
3033
MANIFEST_PATH="${MANIFEST_PATH:-.well-known/release-manifest.json}"
34+
TRACKS="${TRACKS:-production beta alpha internal}"
35+
FORCE_BUMP="${FORCE_BUMP:-false}"
36+
37+
ALL_TRACKS="production beta alpha internal"
38+
39+
# --- helper: check if a value is in a space-separated list ---
40+
in_list() { [[ " $2 " == *" $1 "* ]]; }
3141

3242
# --- helper: write to $GITHUB_OUTPUT when in CI, otherwise just print ---
3343
emit() {
@@ -71,25 +81,6 @@ fetch_track() {
7181
| max_by(.code) // { code: null, name: null }'
7282
}
7383

74-
PROD_JSON=$(fetch_track production)
75-
BETA_JSON=$(fetch_track beta)
76-
ALPHA_JSON=$(fetch_track alpha)
77-
INTERNAL_JSON=$(fetch_track internal)
78-
79-
PROD=$(echo "$PROD_JSON" | jq '.code')
80-
BETA=$(echo "$BETA_JSON" | jq '.code')
81-
ALPHA=$(echo "$ALPHA_JSON" | jq '.code')
82-
INTERNAL=$(echo "$INTERNAL_JSON" | jq '.code')
83-
84-
PROD_NAME=$(echo "$PROD_JSON" | jq -r '.name // empty')
85-
BETA_NAME=$(echo "$BETA_JSON" | jq -r '.name // empty')
86-
ALPHA_NAME=$(echo "$ALPHA_JSON" | jq -r '.name // empty')
87-
INTERNAL_NAME=$(echo "$INTERNAL_JSON" | jq -r '.name // empty')
88-
89-
echo "Tracks: prod=$PROD ($PROD_NAME) beta=$BETA ($BETA_NAME) alpha=$ALPHA ($ALPHA_NAME) internal=$INTERNAL ($INTERNAL_NAME)"
90-
91-
curl -s -X DELETE "$BASE/edits/$EDIT_ID" -H "$AUTH" >/dev/null || true
92-
9384
# --- helper: build a track object or null ---
9485
track_obj() {
9586
local code="$1" name="$2"
@@ -101,17 +92,45 @@ track_obj() {
10192
fi
10293
}
10394

95+
echo "Updating tracks: $TRACKS"
96+
97+
# --- read existing manifest as base ---
98+
mkdir -p "$(dirname "$MANIFEST_PATH")"
99+
if [ -f "$MANIFEST_PATH" ]; then
100+
EXISTING=$(cat "$MANIFEST_PATH")
101+
else
102+
EXISTING='{"tracks":{}}'
103+
fi
104+
105+
# --- for each track, either fetch fresh or preserve existing ---
106+
declare -A TRACK_OBJS
107+
for t in $ALL_TRACKS; do
108+
if in_list "$t" "$TRACKS"; then
109+
JSON=$(fetch_track "$t")
110+
CODE=$(echo "$JSON" | jq '.code')
111+
NAME=$(echo "$JSON" | jq -r '.name // empty')
112+
TRACK_OBJS[$t]=$(track_obj "$CODE" "$NAME")
113+
echo " $t: fetched code=$CODE name=$NAME"
114+
else
115+
TRACK_OBJS[$t]=$(echo "$EXISTING" | jq -c ".tracks.$t // null")
116+
echo " $t: preserved from manifest"
117+
fi
118+
done
119+
120+
curl -s -X DELETE "$BASE/edits/$EDIT_ID" -H "$AUTH" >/dev/null || true
121+
104122
# --- read previous prod ---
105-
OLD_PROD=$(jq -r '.tracks.production.versionCode // .tracks.production // empty' "$MANIFEST_PATH" 2>/dev/null || echo "")
106-
echo "Previous prod: ${OLD_PROD:-<none>} | New prod: $PROD"
123+
OLD_PROD=$(echo "$EXISTING" | jq -r '.tracks.production.versionCode // .tracks.production // empty' 2>/dev/null || echo "")
124+
NEW_PROD=$(echo "${TRACK_OBJS[production]}" | jq -r '.versionCode // empty' 2>/dev/null || echo "")
125+
NEW_PROD_NAME=$(echo "${TRACK_OBJS[production]}" | jq -r '.versionName // empty' 2>/dev/null || echo "")
126+
echo "Previous prod: ${OLD_PROD:-<none>} | Current prod: ${NEW_PROD:-<none>} (${NEW_PROD_NAME:-<none>})"
107127

108128
# --- write manifest ---
109-
mkdir -p "$(dirname "$MANIFEST_PATH")"
110129
jq -n \
111-
--argjson production "$(track_obj "$PROD" "$PROD_NAME")" \
112-
--argjson beta "$(track_obj "$BETA" "$BETA_NAME")" \
113-
--argjson alpha "$(track_obj "$ALPHA" "$ALPHA_NAME")" \
114-
--argjson internal "$(track_obj "$INTERNAL" "$INTERNAL_NAME")" \
130+
--argjson production "${TRACK_OBJS[production]}" \
131+
--argjson beta "${TRACK_OBJS[beta]}" \
132+
--argjson alpha "${TRACK_OBJS[alpha]}" \
133+
--argjson internal "${TRACK_OBJS[internal]}" \
115134
--arg updated "$(date -u +%FT%TZ)" \
116135
'{updated: $updated, tracks: {production:$production, beta:$beta, alpha:$alpha, internal:$internal}}' \
117136
> "$MANIFEST_PATH"
@@ -120,17 +139,24 @@ echo "Manifest written:"
120139
cat "$MANIFEST_PATH"
121140

122141
emit "old_prod" "${OLD_PROD:-null}"
123-
emit "new_prod" "$PROD"
142+
emit "new_prod" "${NEW_PROD:-null}"
143+
emit "new_prod_name" "${NEW_PROD_NAME:-null}"
144+
145+
# --- decide whether to bump patch ---
146+
PROD_CHANGED=false
147+
if in_list "production" "$TRACKS" && [ "${OLD_PROD:-null}" != "${NEW_PROD:-null}" ]; then
148+
PROD_CHANGED=true
149+
fi
124150

125-
# --- decide whether prod changed ---
126-
if [ "$OLD_PROD" = "$PROD" ]; then
127-
echo "Production unchanged, skipping patch bump"
151+
if [ "$FORCE_BUMP" != "true" ] && [ "$PROD_CHANGED" != "true" ]; then
152+
echo "Production unchanged and force_bump not set, skipping patch bump"
128153
emit "prod_changed" "false"
129154
exit 0
130155
fi
131156

132-
emit "prod_changed" "true"
133-
echo "Production changed ($OLD_PROD -> $PROD), bumping patch version"
157+
emit "prod_changed" "$PROD_CHANGED"
158+
emit "forced" "$FORCE_BUMP"
159+
echo "Bumping patch version (prod_changed=$PROD_CHANGED, forced=$FORCE_BUMP)"
134160

135161
# --- bump patch version ---
136162
KOTLIN_FILE=buildSrc/src/main/java/Packaging.kt

0 commit comments

Comments
 (0)