From 5a64cbfbf1fdafa5a5df806c00c345335b6f2ac4 Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Wed, 22 Apr 2026 11:32:42 -0700 Subject: [PATCH] ci: refactor update-rss-reader-apps workflow - 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 --- .github/workflows/update-rss-reader-apps.yml | 201 ++++++------------- 1 file changed, 63 insertions(+), 138 deletions(-) diff --git a/.github/workflows/update-rss-reader-apps.yml b/.github/workflows/update-rss-reader-apps.yml index 0e6b988..a9ed137 100644 --- a/.github/workflows/update-rss-reader-apps.yml +++ b/.github/workflows/update-rss-reader-apps.yml @@ -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 @@ -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: @@ -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 @@ -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 }}"