From b6d89eab9a6cb04b97d55e901e502f5382e88e5b Mon Sep 17 00:00:00 2001 From: Salman Faris Date: Wed, 21 Oct 2026 20:32:07 +0530 Subject: [PATCH 1/5] ci: use edge-apps-actions v26.10.0 with CalVer tag releases Deploy stage on pushes to the default branch and production on vYY.M.PATCH tags, refusing tags not on the default branch. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/checks.yml | 2 +- .github/workflows/initialize-edge-app.yml | 8 +++--- .github/workflows/update-edge-app.yml | 32 ++++++++++++++++------- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index c969846..3fa16ba 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -13,4 +13,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - - uses: Screenly/edge-apps-actions/checks@v1 + - uses: Screenly/edge-apps-actions/checks@v26.10.0 diff --git a/.github/workflows/initialize-edge-app.yml b/.github/workflows/initialize-edge-app.yml index 06319a7..715fb3d 100644 --- a/.github/workflows/initialize-edge-app.yml +++ b/.github/workflows/initialize-edge-app.yml @@ -30,12 +30,12 @@ jobs: environment: ${{ inputs.environment }} steps: - uses: actions/checkout@v7 - with: - ref: main - - uses: Screenly/edge-apps-actions/initialize@f4ccd2bd50db5fb0a5147d287ac03cafe552d29b + - uses: Screenly/edge-apps-actions/initialize@v26.10.0 with: screenly_api_token: ${{ secrets.SCREENLY_API_TOKEN }} edge_app_name: ${{ inputs.edge_app_name }} edge_app_title: ${{ inputs.edge_app_title }} environment: ${{ inputs.environment }} - edge_app_id: ${{ secrets.EDGE_APP_ID || (inputs.environment == 'production' && vars.PRODUCTION_EDGE_APP_ID || (inputs.environment == 'stage' && vars.STAGE_EDGE_APP_ID)) }} + # First create: leave STAGE_EDGE_APP_ID / PRODUCTION_EDGE_APP_ID unset + # so this is "". After create: set the matching var to the printed id. + edge_app_id: ${{ (inputs.environment == 'production' && vars.PRODUCTION_EDGE_APP_ID) || (inputs.environment == 'stage' && vars.STAGE_EDGE_APP_ID) || '' }} diff --git a/.github/workflows/update-edge-app.yml b/.github/workflows/update-edge-app.yml index 9181ede..bfb8c16 100644 --- a/.github/workflows/update-edge-app.yml +++ b/.github/workflows/update-edge-app.yml @@ -2,39 +2,51 @@ name: Update Edge App on: + workflow_dispatch: push: branches: - main tags: - - 'v*' + - 'v[0-9]*' -run-name: Updating RSS Reader in ${{ startsWith(github.ref, 'refs/tags/v') && 'production' || 'stage' }} +run-name: Updating RSS Reader in ${{ (github.event_name == 'push' && !github.event.deleted && startsWith(github.ref, 'refs/tags/v')) && 'production' || 'stage' }} jobs: deploy-stage: name: Updating RSS Reader in stage runs-on: ubuntu-latest - if: github.ref == 'refs/heads/main' + if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'workflow_dispatch' environment: stage steps: - - uses: actions/checkout@v6 - - uses: Screenly/edge-apps-actions/update@f4ccd2bd50db5fb0a5147d287ac03cafe552d29b + - uses: actions/checkout@v7 + - uses: Screenly/edge-apps-actions/update@v26.10.0 with: screenly_api_token: ${{ secrets.SCREENLY_API_TOKEN }} environment: stage delete_missing_settings: 'true' - edge_app_id: ${{ secrets.EDGE_APP_ID || vars.STAGE_EDGE_APP_ID }} + edge_app_id: ${{ vars.STAGE_EDGE_APP_ID }} deploy-production: name: Updating RSS Reader in production runs-on: ubuntu-latest - if: startsWith(github.ref, 'refs/tags/v') + if: github.event_name == 'push' && !github.event.deleted && startsWith(github.ref, 'refs/tags/v') environment: production steps: - - uses: actions/checkout@v6 - - uses: Screenly/edge-apps-actions/update@f4ccd2bd50db5fb0a5147d287ac03cafe552d29b + - uses: actions/checkout@v7 + with: + fetch-depth: 0 + - name: Verify tag is on the default branch + env: + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + run: | + git fetch --no-tags origin "$DEFAULT_BRANCH" + if ! git merge-base --is-ancestor HEAD FETCH_HEAD; then + echo "Tag $GITHUB_REF_NAME is not on $DEFAULT_BRANCH; refusing to deploy to production." + exit 1 + fi + - uses: Screenly/edge-apps-actions/update@v26.10.0 with: screenly_api_token: ${{ secrets.SCREENLY_API_TOKEN }} environment: production delete_missing_settings: 'true' - edge_app_id: ${{ secrets.EDGE_APP_ID || vars.PRODUCTION_EDGE_APP_ID }} + edge_app_id: ${{ vars.PRODUCTION_EDGE_APP_ID }} From fc118c2265944c232c5ec2aaddee0636ec8c0793 Mon Sep 17 00:00:00 2001 From: Salman Faris Date: Wed, 21 Oct 2026 20:32:07 +0530 Subject: [PATCH 2/5] docs: add release badge and preview screenshot to README Co-Authored-By: Claude Opus 5.5 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fc80680..5db2039 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Version](https://img.shields.io/github/v/release/Screenly/rss-reader-app)](https://github.com/Screenly/rss-reader-app/releases/latest) + # RSS Reader Displays the latest entries from any RSS feed on your Screenly digital signage screens. From 419f7bb8bb8541aebcc222b44d2b730ebea14d6f Mon Sep 17 00:00:00 2001 From: Salman Faris Date: Wed, 21 Oct 2026 20:44:49 +0530 Subject: [PATCH 3/5] docs: document the tag-based release process in README Co-Authored-By: Claude Opus 5.5 --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 5db2039..aac6128 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,22 @@ bun run deploy screenly edge-app instance create ``` +### Releasing + +Pushes to `main` deploy to stage automatically. To release to production, tag a commit on `main` and push the tag (the workflow refuses tags not on `main`): + +```bash +git checkout main && git pull +git tag v26.10.0 +git push origin v26.10.0 +``` + +Then publish a GitHub Release whose notes list the pull requests merged since the previous release. Add `--draft` to review the notes before publishing: + +```bash +gh release create v26.10.0 --verify-tag --generate-notes --title v26.10.0 +``` + ## Configuration | Setting | Description | Type | Default | From 66eabf9ee5a76a835f238fcb345277b3d67f11cc Mon Sep 17 00:00:00 2001 From: Salman Faris Date: Wed, 21 Oct 2026 20:53:26 +0530 Subject: [PATCH 4/5] ci: run checks on the development branch Co-Authored-By: Claude Opus 5.5 --- .github/workflows/checks.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 3fa16ba..8595e84 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -3,9 +3,11 @@ name: Checks on: push: branches: + - development - main pull_request: branches: + - development - main jobs: From a6724036aec64c7b7b760351bf11328c71f3804c Mon Sep 17 00:00:00 2001 From: Salman Faris Date: Wed, 28 Oct 2026 18:38:00 +0530 Subject: [PATCH 5/5] ci: call edge-apps-actions v26.10.2 reusable workflows Checks, Initialize and Update now call the reusable workflows; deploys queue instead of running side by side. Dependabot checks GitHub Actions weekly and targets development, so pin bumps go through the usual flow. --- .github/dependabot.yml | 3 +- .github/workflows/checks.yml | 11 ++++-- .github/workflows/initialize-edge-app.yml | 24 +++++------- .github/workflows/update-edge-app.yml | 46 ++++------------------- README.md | 2 +- 5 files changed, 28 insertions(+), 58 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index be27bdc..1094dfd 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -13,7 +13,8 @@ updates: - package-ecosystem: 'github-actions' directory: '/' schedule: - interval: 'monthly' + interval: 'weekly' + target-branch: 'development' groups: github-actions: patterns: diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 8595e84..91799b7 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -1,3 +1,4 @@ +--- name: Checks on: @@ -5,14 +6,16 @@ on: branches: - development - main + - master pull_request: branches: - development - main + - master + +permissions: + contents: read jobs: checks: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v7 - - uses: Screenly/edge-apps-actions/checks@v26.10.0 + uses: Screenly/edge-apps-actions/.github/workflows/checks.yml@v26.10.2 diff --git a/.github/workflows/initialize-edge-app.yml b/.github/workflows/initialize-edge-app.yml index 715fb3d..391eb5d 100644 --- a/.github/workflows/initialize-edge-app.yml +++ b/.github/workflows/initialize-edge-app.yml @@ -21,21 +21,17 @@ on: required: true type: string +permissions: + contents: read + run-name: Initializing ${{ inputs.edge_app_name }} in ${{ inputs.environment }} jobs: initialize: - name: Initializing ${{ inputs.edge_app_name }} in ${{ inputs.environment }} - runs-on: ubuntu-latest - environment: ${{ inputs.environment }} - steps: - - uses: actions/checkout@v7 - - uses: Screenly/edge-apps-actions/initialize@v26.10.0 - with: - screenly_api_token: ${{ secrets.SCREENLY_API_TOKEN }} - edge_app_name: ${{ inputs.edge_app_name }} - edge_app_title: ${{ inputs.edge_app_title }} - environment: ${{ inputs.environment }} - # First create: leave STAGE_EDGE_APP_ID / PRODUCTION_EDGE_APP_ID unset - # so this is "". After create: set the matching var to the printed id. - edge_app_id: ${{ (inputs.environment == 'production' && vars.PRODUCTION_EDGE_APP_ID) || (inputs.environment == 'stage' && vars.STAGE_EDGE_APP_ID) || '' }} + uses: Screenly/edge-apps-actions/.github/workflows/initialize.yml@v26.10.2 + with: + environment: ${{ inputs.environment }} + edge_app_name: ${{ inputs.edge_app_name }} + edge_app_title: ${{ inputs.edge_app_title }} + secrets: + SCREENLY_API_TOKEN: ${{ secrets.SCREENLY_API_TOKEN }} diff --git a/.github/workflows/update-edge-app.yml b/.github/workflows/update-edge-app.yml index bfb8c16..4688ae8 100644 --- a/.github/workflows/update-edge-app.yml +++ b/.github/workflows/update-edge-app.yml @@ -6,47 +6,17 @@ on: push: branches: - main + - master tags: - 'v[0-9]*' +permissions: + contents: read + run-name: Updating RSS Reader in ${{ (github.event_name == 'push' && !github.event.deleted && startsWith(github.ref, 'refs/tags/v')) && 'production' || 'stage' }} jobs: - deploy-stage: - name: Updating RSS Reader in stage - runs-on: ubuntu-latest - if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'workflow_dispatch' - environment: stage - steps: - - uses: actions/checkout@v7 - - uses: Screenly/edge-apps-actions/update@v26.10.0 - with: - screenly_api_token: ${{ secrets.SCREENLY_API_TOKEN }} - environment: stage - delete_missing_settings: 'true' - edge_app_id: ${{ vars.STAGE_EDGE_APP_ID }} - - deploy-production: - name: Updating RSS Reader in production - runs-on: ubuntu-latest - if: github.event_name == 'push' && !github.event.deleted && startsWith(github.ref, 'refs/tags/v') - environment: production - steps: - - uses: actions/checkout@v7 - with: - fetch-depth: 0 - - name: Verify tag is on the default branch - env: - DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} - run: | - git fetch --no-tags origin "$DEFAULT_BRANCH" - if ! git merge-base --is-ancestor HEAD FETCH_HEAD; then - echo "Tag $GITHUB_REF_NAME is not on $DEFAULT_BRANCH; refusing to deploy to production." - exit 1 - fi - - uses: Screenly/edge-apps-actions/update@v26.10.0 - with: - screenly_api_token: ${{ secrets.SCREENLY_API_TOKEN }} - environment: production - delete_missing_settings: 'true' - edge_app_id: ${{ vars.PRODUCTION_EDGE_APP_ID }} + update: + uses: Screenly/edge-apps-actions/.github/workflows/update.yml@v26.10.2 + secrets: + SCREENLY_API_TOKEN: ${{ secrets.SCREENLY_API_TOKEN }} diff --git a/README.md b/README.md index aac6128..2a20f8f 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ screenly edge-app instance create ### Releasing -Pushes to `main` deploy to stage automatically. To release to production, tag a commit on `main` and push the tag (the workflow refuses tags not on `main`): +Pushes to `main` start a stage deploy, which waits for approval. To release to production, tag a commit on `main` and push the tag (the workflow refuses tags not on `main`); the production deploy also waits for approval: ```bash git checkout main && git pull