22name : Update RSS Reader Apps
33
44on :
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
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
4844jobs :
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