From 77ef00539a6079c0508402005209a66229dd5822 Mon Sep 17 00:00:00 2001 From: Salman Faris Date: Wed, 21 Oct 2026 20:32:09 +0530 Subject: [PATCH 1/4] 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 | 28 ++++++++++++++++------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index f08b3b4..8595e84 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -15,4 +15,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 48932f3..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: ${{ inputs.environment == 'production' && 'main' || github.ref }} - - 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 4c5d028..17b4f38 100644 --- a/.github/workflows/update-edge-app.yml +++ b/.github/workflows/update-edge-app.yml @@ -5,36 +5,48 @@ on: workflow_dispatch: push: branches: - - development - main + tags: + - 'v[0-9]*' -run-name: Updating Simple Timer App in ${{ github.event_name == 'workflow_dispatch' && 'stage' || (github.ref == 'refs/heads/main' && 'production' || 'stage') }} +run-name: Updating Simple Timer App in ${{ (github.event_name == 'push' && !github.event.deleted && startsWith(github.ref, 'refs/tags/v')) && 'production' || 'stage' }} jobs: deploy-stage: name: Updating Simple Timer App in stage runs-on: ubuntu-latest - if: (github.event_name == 'push' && github.ref == 'refs/heads/development') || github.event_name == 'workflow_dispatch' + 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@f4ccd2bd50db5fb0a5147d287ac03cafe552d29b + - 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 Simple Timer App in production runs-on: ubuntu-latest - if: github.event_name == 'push' && github.ref == 'refs/heads/main' + if: github.event_name == 'push' && !github.event.deleted && startsWith(github.ref, 'refs/tags/v') environment: production steps: - uses: actions/checkout@v7 - - uses: Screenly/edge-apps-actions/update@f4ccd2bd50db5fb0a5147d287ac03cafe552d29b + 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 02fdafb4e16c40be172cae72c2541e5d2ccf904b Mon Sep 17 00:00:00 2001 From: Salman Faris Date: Wed, 21 Oct 2026 20:32:09 +0530 Subject: [PATCH 2/4] docs: add release badge and preview screenshot to README Co-Authored-By: Claude Opus 5.5 --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 557b483..2fe13b1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ +[![Version](https://img.shields.io/github/v/release/Screenly/simple-timer-app)](https://github.com/Screenly/simple-timer-app/releases/latest) + # Screenly Simple Timer App +![Simple Timer App Preview](/screenshots/1920x1080.webp) + ## Getting Started ```bash From 029e714f76d62dc1d99f78c25ca31be90cd009ac Mon Sep 17 00:00:00 2001 From: Salman Faris Date: Wed, 21 Oct 2026 20:45:08 +0530 Subject: [PATCH 3/4] 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 2fe13b1..fa1e73a 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,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 The app accepts the following settings via `screenly.yml`: From 8f4a5c5caa7b6057e211543e9e46f2e662eb9567 Mon Sep 17 00:00:00 2001 From: Salman Faris Date: Wed, 28 Oct 2026 18:38:13 +0530 Subject: [PATCH 4/4] 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 17b4f38..363b425 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 Simple Timer App in ${{ (github.event_name == 'push' && !github.event.deleted && startsWith(github.ref, 'refs/tags/v')) && 'production' || 'stage' }} jobs: - deploy-stage: - name: Updating Simple Timer App 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 Simple Timer App 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 fa1e73a..4fab63f 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,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