Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
201 changes: 63 additions & 138 deletions .github/workflows/update-rss-reader-apps.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,13 @@
name: Update RSS Reader Apps

on:
push:
branches:
- main
tags:
- 'v*'
workflow_dispatch:
inputs:
environment:
description: 'Environment to update (stage or production)'
required: true
default: 'stage'
type: choice
options:
- stage
- production

app_key:
description: "App key (leave empty to update ALL apps, or enter one key like 'bbc-news')"
required: false
Expand Down Expand Up @@ -43,7 +39,7 @@ on:
required: false
type: string

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

jobs:
prepare:
Expand All @@ -52,190 +48,129 @@ jobs:
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
app_count: ${{ steps.set-matrix.outputs.app_count }}
environment: ${{ steps.set-env.outputs.environment }}
api_base_url: ${{ steps.set-env.outputs.api_base_url }}
manifest_file_name: ${{ steps.set-env.outputs.manifest_file_name }}

steps:
- name: ⬇️ Checkout Repository
uses: actions/checkout@v6
with:
ref: master
- uses: actions/checkout@v6

- name: 🛠 Setup yq
- name: Set environment
id: set-env
run: |
if [[ "${{ github.ref }}" == refs/tags/v* ]]; then
echo "environment=production" >> "$GITHUB_OUTPUT"
echo "api_base_url=https://api.screenlyapp.com" >> "$GITHUB_OUTPUT"
echo "manifest_file_name=screenly.yml" >> "$GITHUB_OUTPUT"
else
echo "environment=stage" >> "$GITHUB_OUTPUT"
echo "api_base_url=https://api.screenlyappstage.com" >> "$GITHUB_OUTPUT"
echo "manifest_file_name=screenly_qc.yml" >> "$GITHUB_OUTPUT"
fi

- name: Setup yq
uses: ./.github/actions/setup-yq

- name: 📋 Generate App Matrix
- name: Generate App Matrix
id: set-matrix
run: |
CONFIG_FILE="./deployed-apps.yml"
APP_KEY_INPUT="${{ inputs.app_key }}"
ENVIRONMENT="${{ inputs.environment }}"

echo "📋 Reading deployed apps from $CONFIG_FILE for environment: $ENVIRONMENT"
ENVIRONMENT="${{ steps.set-env.outputs.environment }}"

if [ -n "$APP_KEY_INPUT" ]; then
# Single app update
echo "🎯 Single app mode: $APP_KEY_INPUT"

# Check if app exists and has ID for the requested environment
if ! yq ".apps.$APP_KEY_INPUT" "$CONFIG_FILE" | grep -q "ids:" || \
[ "$(yq -r ".apps.$APP_KEY_INPUT.ids | has(\"$ENVIRONMENT\")" "$CONFIG_FILE")" != "true" ]; then
echo "❌ Error: App key '$APP_KEY_INPUT' missing 'ids.$ENVIRONMENT'"
echo "Available environments for '$APP_KEY_INPUT':"
yq -r ".apps.$APP_KEY_INPUT.ids | keys | .[]" "$CONFIG_FILE" 2>/dev/null || echo " (app not found or has no IDs configured)"
echo "Error: App key '$APP_KEY_INPUT' missing 'ids.$ENVIRONMENT'"
exit 1
fi

# Create single-item matrix with environment-specific ID

MATRIX=$(yq -o=json -I=0 '.apps | to_entries | map(select(.key == "'"$APP_KEY_INPUT"'") | {"key": .key, "id": .value.ids.'"$ENVIRONMENT"'})' "$CONFIG_FILE")
APP_COUNT=1
else
# All apps update
echo "🚀 All apps mode"

# Extract all app keys and environment-specific IDs, filtering out apps without IDs for this environment
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")
APP_COUNT=$(echo "$MATRIX" | yq 'length')

if [ "$APP_COUNT" -eq 0 ]; then
echo "⚠️ No apps found with IDs configured for environment: $ENVIRONMENT"
echo "No apps found with IDs configured for environment: $ENVIRONMENT"
exit 1
fi
fi

# Validate matrix is not empty before outputting
if [ "$APP_COUNT" -eq 0 ]; then
echo "❌ No apps found for environment: $ENVIRONMENT"
exit 1
fi

# Output matrix as compact JSON
echo "matrix=$MATRIX" >> "$GITHUB_OUTPUT"
echo "app_count=$APP_COUNT" >> "$GITHUB_OUTPUT"

echo ""
echo "✅ Found $APP_COUNT app(s) to update in $ENVIRONMENT:"
echo "$MATRIX" | yq -P

deploy:
name: Update ${{ matrix.app.key }}
needs: prepare
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master' && needs.prepare.outputs.app_count > 0
environment: ${{ inputs.environment }}
if: needs.prepare.outputs.app_count > 0
environment: ${{ needs.prepare.outputs.environment }}
strategy:
matrix:
app: ${{ fromJson(needs.prepare.outputs.matrix) }}
fail-fast: false # Continue updating other apps even if one fails

fail-fast: false
env:
API_BASE_URL: ${{ inputs.environment == 'stage' && 'https://api.screenlyappstage.com' || 'https://api.screenlyapp.com' }}
APP_NAME: rss-reader
APP_PATH: .
API_BASE_URL: ${{ needs.prepare.outputs.api_base_url }}
MANIFEST_FILE_NAME: ${{ needs.prepare.outputs.manifest_file_name }}
SCREENLY_API_TOKEN: ${{ secrets.SCREENLY_API_TOKEN }}
MANIFEST_FILE_NAME: ${{ inputs.environment == 'stage' && 'screenly_qc.yml' || 'screenly.yml' }}

steps:
- name: ⬇️ Checkout Repository
uses: actions/checkout@v6
with:
ref: master
- uses: actions/checkout@v6

- name: 🛠 Setup yq
- name: Setup yq
uses: ./.github/actions/setup-yq

- name: 🔧 Update manifest from config
- name: Update manifest from config
run: |
MANIFEST_FILE="${{ env.APP_PATH }}/${{ env.MANIFEST_FILE_NAME }}"
CONFIG_FILE="${{ env.APP_PATH }}/deployed-apps.yml"
CONFIG_FILE="./deployed-apps.yml"
APP_ID="${{ matrix.app.id }}"
APP_KEY="${{ matrix.app.key }}"
ENVIRONMENT="${{ inputs.environment }}"

echo "📝 Updating manifest for: $APP_KEY in $ENVIRONMENT (ID: $APP_ID)"

# Load config from deployed-apps.yml (common fields for all environments)
CONFIG_APP_NAME=$(yq ".apps.$APP_KEY.app_name" "$CONFIG_FILE")
CONFIG_DESC=$(yq ".apps.$APP_KEY.description" "$CONFIG_FILE")
CONFIG_RSS_TITLE=$(yq ".apps.$APP_KEY.rss_title" "$CONFIG_FILE")
CONFIG_ICON=$(yq ".apps.$APP_KEY.icon_url" "$CONFIG_FILE")
CONFIG_RSS_URL=$(yq ".apps.$APP_KEY.rss_url" "$CONFIG_FILE")

echo ""
echo "📖 Loaded from deployed-apps.yml:"
echo " App Name: $CONFIG_APP_NAME"
echo " Description: $CONFIG_DESC"
echo " RSS Title: $CONFIG_RSS_TITLE"
echo " Icon URL: $CONFIG_ICON"
echo " RSS URL: $CONFIG_RSS_URL"

# Apply overrides if provided, otherwise use config values
FINAL_APP_NAME="${{ inputs.override_app_name }}"
if [ -z "$FINAL_APP_NAME" ]; then
FINAL_APP_NAME="$CONFIG_APP_NAME"
else
echo ""
echo "🔧 Override: App Name = $FINAL_APP_NAME"
fi
[ -z "$FINAL_APP_NAME" ] && FINAL_APP_NAME="$CONFIG_APP_NAME"

FINAL_DESC="${{ inputs.override_description }}"
if [ -z "$FINAL_DESC" ]; then
FINAL_DESC="$CONFIG_DESC"
else
echo "🔧 Override: Description = $FINAL_DESC"
fi
[ -z "$FINAL_DESC" ] && FINAL_DESC="$CONFIG_DESC"

FINAL_RSS_TITLE="${{ inputs.override_rss_title }}"
if [ -z "$FINAL_RSS_TITLE" ]; then
FINAL_RSS_TITLE="$CONFIG_RSS_TITLE"
else
echo "🔧 Override: RSS Title = $FINAL_RSS_TITLE"
fi
[ -z "$FINAL_RSS_TITLE" ] && FINAL_RSS_TITLE="$CONFIG_RSS_TITLE"

FINAL_ICON="${{ inputs.override_icon_url }}"
if [ -z "$FINAL_ICON" ]; then
FINAL_ICON="$CONFIG_ICON"
else
echo "🔧 Override: Icon URL = $FINAL_ICON"
fi
[ -z "$FINAL_ICON" ] && FINAL_ICON="$CONFIG_ICON"

FINAL_RSS_URL="${{ inputs.override_rss_url }}"
if [ -z "$FINAL_RSS_URL" ]; then
FINAL_RSS_URL="$CONFIG_RSS_URL"
else
echo "🔧 Override: RSS URL = $FINAL_RSS_URL"
fi
[ -z "$FINAL_RSS_URL" ] && FINAL_RSS_URL="$CONFIG_RSS_URL"

# Update manifest with final values
echo ""
echo "✅ Updating manifest with:"
yq -i '.id = "'"$APP_ID"'"' "$MANIFEST_FILE"
echo " App ID: $APP_ID"
yq -i '.id = "'"$APP_ID"'"' "$MANIFEST_FILE_NAME"
yq -i '.description = "'"$FINAL_DESC"'"' "$MANIFEST_FILE_NAME"
yq -i '.icon = "'"$FINAL_ICON"'"' "$MANIFEST_FILE_NAME"
yq -i '.settings.rss_url.default_value = "'"$FINAL_RSS_URL"'"' "$MANIFEST_FILE_NAME"
yq -i '.settings.rss_title.default_value = "'"$FINAL_RSS_TITLE"'"' "$MANIFEST_FILE_NAME"

yq -i '.description = "'"$FINAL_DESC"'"' "$MANIFEST_FILE"
echo " Description: $FINAL_DESC"
- name: Show updated manifest
run: cat "$MANIFEST_FILE_NAME"

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

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

yq -i '.settings.rss_title.default_value = "'"$FINAL_RSS_TITLE"'"' "$MANIFEST_FILE"
echo " RSS Title: $FINAL_RSS_TITLE"

- name: 📋 Show updated manifest
run: |
echo "📄 Manifest for ${{ matrix.app.key }}:"
cat ${{ env.APP_PATH }}/${{ env.MANIFEST_FILE_NAME }}
- name: Build
run: bun run build

- name: 🚀 Deploy Edge App
- name: Deploy Edge App
uses: screenly/cli@master
with:
screenly_api_token: ${{ env.SCREENLY_API_TOKEN }}
cli_commands: edge-app deploy --path="${{ env.APP_PATH }}" --delete-missing-settings=false

- name: ✅ Deployment Complete
run: |
echo "✅ Successfully updated ${{ matrix.app.key }}"
cli_commands: edge-app deploy --path="./dist"

summary:
name: Deployment Summary
Expand All @@ -244,18 +179,8 @@ jobs:
if: always()

steps:
- name: 📊 Summary
- name: Summary
run: |
echo "🎉 Update All RSS Readers Workflow Complete"
echo ""
echo "📊 Summary:"
echo " Environment: ${{ inputs.environment }}"
echo " Apps processed: ${{ needs.prepare.outputs.app_count }}"
echo ""
if [ "${{ needs.deploy.result }}" == "success" ]; then
echo "✅ All apps updated successfully!"
elif [ "${{ needs.deploy.result }}" == "failure" ]; then
echo "⚠️ Some apps failed to update. Check individual job logs."
else
echo "ℹ️ Deployment status: ${{ needs.deploy.result }}"
fi
echo "Environment: ${{ needs.prepare.outputs.environment }}"
echo "Apps processed: ${{ needs.prepare.outputs.app_count }}"
echo "Deployment status: ${{ needs.deploy.result }}"