Skip to content

Commit 508763a

Browse files
ci: refactor update-rss-reader-apps workflow (#9)
- Add push triggers for main (stage) and v* tags (production) - Remove environment input; derive from git ref in prepare job - Pass environment, api_base_url, manifest_file_name as job outputs - Remove master branch guard and ref: master from checkouts - Add Bun setup, install, and build steps; deploy from ./dist - Remove APP_PATH, APP_NAME env vars and emoji step names - Simplify override logic and manifest patching
1 parent 5cbb00e commit 508763a

1 file changed

Lines changed: 63 additions & 138 deletions

File tree

.github/workflows/update-rss-reader-apps.yml

Lines changed: 63 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,13 @@
22
name: Update RSS Reader Apps
33

44
on:
5+
push:
6+
branches:
7+
- main
8+
tags:
9+
- 'v*'
510
workflow_dispatch:
611
inputs:
7-
environment:
8-
description: 'Environment to update (stage or production)'
9-
required: true
10-
default: 'stage'
11-
type: choice
12-
options:
13-
- stage
14-
- production
15-
1612
app_key:
1713
description: "App key (leave empty to update ALL apps, or enter one key like 'bbc-news')"
1814
required: false
@@ -43,7 +39,7 @@ on:
4339
required: false
4440
type: string
4541

46-
run-name: Update RSS Reader${{ inputs.app_key && format(' - {0}', inputs.app_key) || 's (ALL)' }} in ${{ inputs.environment }}
42+
run-name: Update RSS Reader${{ inputs.app_key && format(' - {0}', inputs.app_key) || 's (ALL)' }} in ${{ startsWith(github.ref, 'refs/tags/v') && 'production' || 'stage' }}
4743

4844
jobs:
4945
prepare:
@@ -52,190 +48,129 @@ jobs:
5248
outputs:
5349
matrix: ${{ steps.set-matrix.outputs.matrix }}
5450
app_count: ${{ steps.set-matrix.outputs.app_count }}
51+
environment: ${{ steps.set-env.outputs.environment }}
52+
api_base_url: ${{ steps.set-env.outputs.api_base_url }}
53+
manifest_file_name: ${{ steps.set-env.outputs.manifest_file_name }}
5554

5655
steps:
57-
- name: ⬇️ Checkout Repository
58-
uses: actions/checkout@v6
59-
with:
60-
ref: master
56+
- uses: actions/checkout@v6
6157

62-
- name: 🛠 Setup yq
58+
- name: Set environment
59+
id: set-env
60+
run: |
61+
if [[ "${{ github.ref }}" == refs/tags/v* ]]; then
62+
echo "environment=production" >> "$GITHUB_OUTPUT"
63+
echo "api_base_url=https://api.screenlyapp.com" >> "$GITHUB_OUTPUT"
64+
echo "manifest_file_name=screenly.yml" >> "$GITHUB_OUTPUT"
65+
else
66+
echo "environment=stage" >> "$GITHUB_OUTPUT"
67+
echo "api_base_url=https://api.screenlyappstage.com" >> "$GITHUB_OUTPUT"
68+
echo "manifest_file_name=screenly_qc.yml" >> "$GITHUB_OUTPUT"
69+
fi
70+
71+
- name: Setup yq
6372
uses: ./.github/actions/setup-yq
6473

65-
- name: 📋 Generate App Matrix
74+
- name: Generate App Matrix
6675
id: set-matrix
6776
run: |
6877
CONFIG_FILE="./deployed-apps.yml"
6978
APP_KEY_INPUT="${{ inputs.app_key }}"
70-
ENVIRONMENT="${{ inputs.environment }}"
71-
72-
echo "📋 Reading deployed apps from $CONFIG_FILE for environment: $ENVIRONMENT"
79+
ENVIRONMENT="${{ steps.set-env.outputs.environment }}"
7380
7481
if [ -n "$APP_KEY_INPUT" ]; then
75-
# Single app update
76-
echo "🎯 Single app mode: $APP_KEY_INPUT"
77-
78-
# Check if app exists and has ID for the requested environment
7982
if ! yq ".apps.$APP_KEY_INPUT" "$CONFIG_FILE" | grep -q "ids:" || \
8083
[ "$(yq -r ".apps.$APP_KEY_INPUT.ids | has(\"$ENVIRONMENT\")" "$CONFIG_FILE")" != "true" ]; then
81-
echo "❌ Error: App key '$APP_KEY_INPUT' missing 'ids.$ENVIRONMENT'"
82-
echo "Available environments for '$APP_KEY_INPUT':"
83-
yq -r ".apps.$APP_KEY_INPUT.ids | keys | .[]" "$CONFIG_FILE" 2>/dev/null || echo " (app not found or has no IDs configured)"
84+
echo "Error: App key '$APP_KEY_INPUT' missing 'ids.$ENVIRONMENT'"
8485
exit 1
8586
fi
86-
87-
# Create single-item matrix with environment-specific ID
87+
8888
MATRIX=$(yq -o=json -I=0 '.apps | to_entries | map(select(.key == "'"$APP_KEY_INPUT"'") | {"key": .key, "id": .value.ids.'"$ENVIRONMENT"'})' "$CONFIG_FILE")
8989
APP_COUNT=1
9090
else
91-
# All apps update
92-
echo "🚀 All apps mode"
93-
94-
# Extract all app keys and environment-specific IDs, filtering out apps without IDs for this environment
9591
MATRIX=$(yq -o=json -I=0 '.apps | to_entries | map(select(.value.ids and (.value.ids | has("'"$ENVIRONMENT"'"))) | {"key": .key, "id": .value.ids.'"$ENVIRONMENT"'})' "$CONFIG_FILE")
9692
APP_COUNT=$(echo "$MATRIX" | yq 'length')
97-
93+
9894
if [ "$APP_COUNT" -eq 0 ]; then
99-
echo "⚠️ No apps found with IDs configured for environment: $ENVIRONMENT"
95+
echo "No apps found with IDs configured for environment: $ENVIRONMENT"
10096
exit 1
10197
fi
10298
fi
10399
104-
# Validate matrix is not empty before outputting
105-
if [ "$APP_COUNT" -eq 0 ]; then
106-
echo "❌ No apps found for environment: $ENVIRONMENT"
107-
exit 1
108-
fi
109-
110-
# Output matrix as compact JSON
111100
echo "matrix=$MATRIX" >> "$GITHUB_OUTPUT"
112101
echo "app_count=$APP_COUNT" >> "$GITHUB_OUTPUT"
113102
114-
echo ""
115-
echo "✅ Found $APP_COUNT app(s) to update in $ENVIRONMENT:"
116-
echo "$MATRIX" | yq -P
117-
118103
deploy:
119104
name: Update ${{ matrix.app.key }}
120105
needs: prepare
121106
runs-on: ubuntu-latest
122-
if: github.ref == 'refs/heads/master' && needs.prepare.outputs.app_count > 0
123-
environment: ${{ inputs.environment }}
107+
if: needs.prepare.outputs.app_count > 0
108+
environment: ${{ needs.prepare.outputs.environment }}
124109
strategy:
125110
matrix:
126111
app: ${{ fromJson(needs.prepare.outputs.matrix) }}
127-
fail-fast: false # Continue updating other apps even if one fails
128-
112+
fail-fast: false
129113
env:
130-
API_BASE_URL: ${{ inputs.environment == 'stage' && 'https://api.screenlyappstage.com' || 'https://api.screenlyapp.com' }}
131-
APP_NAME: rss-reader
132-
APP_PATH: .
114+
API_BASE_URL: ${{ needs.prepare.outputs.api_base_url }}
115+
MANIFEST_FILE_NAME: ${{ needs.prepare.outputs.manifest_file_name }}
133116
SCREENLY_API_TOKEN: ${{ secrets.SCREENLY_API_TOKEN }}
134-
MANIFEST_FILE_NAME: ${{ inputs.environment == 'stage' && 'screenly_qc.yml' || 'screenly.yml' }}
135117

136118
steps:
137-
- name: ⬇️ Checkout Repository
138-
uses: actions/checkout@v6
139-
with:
140-
ref: master
119+
- uses: actions/checkout@v6
141120

142-
- name: 🛠 Setup yq
121+
- name: Setup yq
143122
uses: ./.github/actions/setup-yq
144123

145-
- name: 🔧 Update manifest from config
124+
- name: Update manifest from config
146125
run: |
147-
MANIFEST_FILE="${{ env.APP_PATH }}/${{ env.MANIFEST_FILE_NAME }}"
148-
CONFIG_FILE="${{ env.APP_PATH }}/deployed-apps.yml"
126+
CONFIG_FILE="./deployed-apps.yml"
149127
APP_ID="${{ matrix.app.id }}"
150128
APP_KEY="${{ matrix.app.key }}"
151-
ENVIRONMENT="${{ inputs.environment }}"
152129
153-
echo "📝 Updating manifest for: $APP_KEY in $ENVIRONMENT (ID: $APP_ID)"
154-
155-
# Load config from deployed-apps.yml (common fields for all environments)
156130
CONFIG_APP_NAME=$(yq ".apps.$APP_KEY.app_name" "$CONFIG_FILE")
157131
CONFIG_DESC=$(yq ".apps.$APP_KEY.description" "$CONFIG_FILE")
158132
CONFIG_RSS_TITLE=$(yq ".apps.$APP_KEY.rss_title" "$CONFIG_FILE")
159133
CONFIG_ICON=$(yq ".apps.$APP_KEY.icon_url" "$CONFIG_FILE")
160134
CONFIG_RSS_URL=$(yq ".apps.$APP_KEY.rss_url" "$CONFIG_FILE")
161135
162-
echo ""
163-
echo "📖 Loaded from deployed-apps.yml:"
164-
echo " App Name: $CONFIG_APP_NAME"
165-
echo " Description: $CONFIG_DESC"
166-
echo " RSS Title: $CONFIG_RSS_TITLE"
167-
echo " Icon URL: $CONFIG_ICON"
168-
echo " RSS URL: $CONFIG_RSS_URL"
169-
170-
# Apply overrides if provided, otherwise use config values
171136
FINAL_APP_NAME="${{ inputs.override_app_name }}"
172-
if [ -z "$FINAL_APP_NAME" ]; then
173-
FINAL_APP_NAME="$CONFIG_APP_NAME"
174-
else
175-
echo ""
176-
echo "🔧 Override: App Name = $FINAL_APP_NAME"
177-
fi
137+
[ -z "$FINAL_APP_NAME" ] && FINAL_APP_NAME="$CONFIG_APP_NAME"
178138
179139
FINAL_DESC="${{ inputs.override_description }}"
180-
if [ -z "$FINAL_DESC" ]; then
181-
FINAL_DESC="$CONFIG_DESC"
182-
else
183-
echo "🔧 Override: Description = $FINAL_DESC"
184-
fi
140+
[ -z "$FINAL_DESC" ] && FINAL_DESC="$CONFIG_DESC"
185141
186142
FINAL_RSS_TITLE="${{ inputs.override_rss_title }}"
187-
if [ -z "$FINAL_RSS_TITLE" ]; then
188-
FINAL_RSS_TITLE="$CONFIG_RSS_TITLE"
189-
else
190-
echo "🔧 Override: RSS Title = $FINAL_RSS_TITLE"
191-
fi
143+
[ -z "$FINAL_RSS_TITLE" ] && FINAL_RSS_TITLE="$CONFIG_RSS_TITLE"
192144
193145
FINAL_ICON="${{ inputs.override_icon_url }}"
194-
if [ -z "$FINAL_ICON" ]; then
195-
FINAL_ICON="$CONFIG_ICON"
196-
else
197-
echo "🔧 Override: Icon URL = $FINAL_ICON"
198-
fi
146+
[ -z "$FINAL_ICON" ] && FINAL_ICON="$CONFIG_ICON"
199147
200148
FINAL_RSS_URL="${{ inputs.override_rss_url }}"
201-
if [ -z "$FINAL_RSS_URL" ]; then
202-
FINAL_RSS_URL="$CONFIG_RSS_URL"
203-
else
204-
echo "🔧 Override: RSS URL = $FINAL_RSS_URL"
205-
fi
149+
[ -z "$FINAL_RSS_URL" ] && FINAL_RSS_URL="$CONFIG_RSS_URL"
206150
207-
# Update manifest with final values
208-
echo ""
209-
echo "✅ Updating manifest with:"
210-
yq -i '.id = "'"$APP_ID"'"' "$MANIFEST_FILE"
211-
echo " App ID: $APP_ID"
151+
yq -i '.id = "'"$APP_ID"'"' "$MANIFEST_FILE_NAME"
152+
yq -i '.description = "'"$FINAL_DESC"'"' "$MANIFEST_FILE_NAME"
153+
yq -i '.icon = "'"$FINAL_ICON"'"' "$MANIFEST_FILE_NAME"
154+
yq -i '.settings.rss_url.default_value = "'"$FINAL_RSS_URL"'"' "$MANIFEST_FILE_NAME"
155+
yq -i '.settings.rss_title.default_value = "'"$FINAL_RSS_TITLE"'"' "$MANIFEST_FILE_NAME"
212156
213-
yq -i '.description = "'"$FINAL_DESC"'"' "$MANIFEST_FILE"
214-
echo " Description: $FINAL_DESC"
157+
- name: Show updated manifest
158+
run: cat "$MANIFEST_FILE_NAME"
215159

216-
yq -i '.icon = "'"$FINAL_ICON"'"' "$MANIFEST_FILE"
217-
echo " Icon URL: $FINAL_ICON"
160+
- name: Set up Bun
161+
uses: oven-sh/setup-bun@v2
218162

219-
yq -i '.settings.rss_url.default_value = "'"$FINAL_RSS_URL"'"' "$MANIFEST_FILE"
220-
echo " RSS URL: $FINAL_RSS_URL"
163+
- name: Install dependencies
164+
run: bun install --frozen-lockfile
221165

222-
yq -i '.settings.rss_title.default_value = "'"$FINAL_RSS_TITLE"'"' "$MANIFEST_FILE"
223-
echo " RSS Title: $FINAL_RSS_TITLE"
224-
225-
- name: 📋 Show updated manifest
226-
run: |
227-
echo "📄 Manifest for ${{ matrix.app.key }}:"
228-
cat ${{ env.APP_PATH }}/${{ env.MANIFEST_FILE_NAME }}
166+
- name: Build
167+
run: bun run build
229168

230-
- name: 🚀 Deploy Edge App
169+
- name: Deploy Edge App
231170
uses: screenly/cli@master
232171
with:
233172
screenly_api_token: ${{ env.SCREENLY_API_TOKEN }}
234-
cli_commands: edge-app deploy --path="${{ env.APP_PATH }}" --delete-missing-settings=false
235-
236-
- name: ✅ Deployment Complete
237-
run: |
238-
echo "✅ Successfully updated ${{ matrix.app.key }}"
173+
cli_commands: edge-app deploy --path="./dist"
239174

240175
summary:
241176
name: Deployment Summary
@@ -244,18 +179,8 @@ jobs:
244179
if: always()
245180

246181
steps:
247-
- name: 📊 Summary
182+
- name: Summary
248183
run: |
249-
echo "🎉 Update All RSS Readers Workflow Complete"
250-
echo ""
251-
echo "📊 Summary:"
252-
echo " Environment: ${{ inputs.environment }}"
253-
echo " Apps processed: ${{ needs.prepare.outputs.app_count }}"
254-
echo ""
255-
if [ "${{ needs.deploy.result }}" == "success" ]; then
256-
echo "✅ All apps updated successfully!"
257-
elif [ "${{ needs.deploy.result }}" == "failure" ]; then
258-
echo "⚠️ Some apps failed to update. Check individual job logs."
259-
else
260-
echo "ℹ️ Deployment status: ${{ needs.deploy.result }}"
261-
fi
184+
echo "Environment: ${{ needs.prepare.outputs.environment }}"
185+
echo "Apps processed: ${{ needs.prepare.outputs.app_count }}"
186+
echo "Deployment status: ${{ needs.deploy.result }}"

0 commit comments

Comments
 (0)