ci: add create-tag workflow to streamline release process#2493
ci: add create-tag workflow to streamline release process#2493
Conversation
Signed-off-by: Ludovic Ortega <ludovic.ortega@adminafk.fr>
📝 WalkthroughWalkthroughRemoves skip-ci conditions from existing CI workflow and adds a new "Create tag" GitHub Actions workflow that computes the next tag via git-cliff, updates package.json, commits the change, and creates & pushes a git tag on main branch pushes. Changes
Sequence Diagram(s)sequenceDiagram
participant Repo as Repository (push to main)
participant Actions as GitHub Actions
participant Cliff as git-cliff
participant Runner as Job Runner (create-tag)
participant Git as Git remote (origin)
Repo->>Actions: push to main (or workflow_dispatch)
Actions->>Cliff: run git-cliff to determine TAG_VERSION
Cliff-->>Actions: outputs TAG_VERSION
Actions->>Runner: start create-tag job with TAG_VERSION
Runner->>Runner: bump package.json (no git hooks, no tag)
Runner->>Git: commit changes and push
Runner->>Git: create and push git tag (TAG_VERSION)
Git-->>Repo: tag and commits available on origin
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
.github/workflows/create-tag.yml (2)
84-87: Consider verifying the tag doesn't already exist before creating.If someone manually created a tag or re-runs the workflow, the tag creation will fail. Adding a pre-check improves the error message and workflow reliability.
♻️ Optional defensive check
- name: Create git tag run: | + if git rev-parse "${TAG_VERSION}" >/dev/null 2>&1; then + echo "::error::Tag ${TAG_VERSION} already exists" + exit 1 + fi git tag "${TAG_VERSION}" git push origin "${TAG_VERSION}"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.github/workflows/create-tag.yml around lines 84 - 87, Add a pre-check before creating the git tag to verify TAG_VERSION doesn't already exist locally or on origin; in the "Create git tag" step check for existence of ${TAG_VERSION} (e.g., via git rev-parse or git ls-remote for origin) and only run git tag ${TAG_VERSION} / git push origin ${TAG_VERSION} when the tag is absent, otherwise emit a clear message and fail or skip gracefully so re-runs or manually-created tags don't cause an unhelpful error.
78-82: Scopegit addto specific files and quote shell variables.Using
git add .could unintentionally stage files not related to the version bump. Additionally, quotingTAG_VERSIONprevents potential issues with malformed version strings.♻️ Proposed refinement
- name: Commit updated files run: | - git add . + git add package.json git commit -m 'chore: prepare for release' git push - name: Create git tag run: | - git tag ${TAG_VERSION} - git push origin ${TAG_VERSION} + git tag "${TAG_VERSION}" + git push origin "${TAG_VERSION}"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.github/workflows/create-tag.yml around lines 78 - 82, Replace the unscoped staging and unquoted variable usage: avoid using "git add ." and instead explicitly add only the files changed by the release (e.g., the version file(s) your workflow updates such as package.json, package-lock.json, CHANGELOG.md or VERSION) by replacing "git add ." with "git add <specific-file(s)>"; also quote the TAG_VERSION variable wherever it is used (use "$TAG_VERSION") in commands like git commit messages or git push refs to guard against spaces or special characters. Ensure the commit command remains explicit (e.g., git commit -m "chore: prepare for release $TAG_VERSION") and any push or tag creation uses "$TAG_VERSION".
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.github/workflows/create-tag.yml:
- Around line 36-41: The "Get tag version" step captures git-cliff output into
the variable tag_version but does not validate it; add a check after computing
tag_version in that step to ensure it is non-empty and exit with a clear error
if empty (so the workflow stops before calling npm version). Specifically, in
the step that sets tag_version (the step with id git-cliff and variable
tag_version), test tag_version and if it's empty print a descriptive message to
the job log and exit non‑zero (and avoid writing an empty tag_version to
GITHUB_OUTPUT); this prevents subsequent steps (like the npm version invocation)
from running with an empty TAG_VERSION.
---
Nitpick comments:
In @.github/workflows/create-tag.yml:
- Around line 84-87: Add a pre-check before creating the git tag to verify
TAG_VERSION doesn't already exist locally or on origin; in the "Create git tag"
step check for existence of ${TAG_VERSION} (e.g., via git rev-parse or git
ls-remote for origin) and only run git tag ${TAG_VERSION} / git push origin
${TAG_VERSION} when the tag is absent, otherwise emit a clear message and fail
or skip gracefully so re-runs or manually-created tags don't cause an unhelpful
error.
- Around line 78-82: Replace the unscoped staging and unquoted variable usage:
avoid using "git add ." and instead explicitly add only the files changed by the
release (e.g., the version file(s) your workflow updates such as package.json,
package-lock.json, CHANGELOG.md or VERSION) by replacing "git add ." with "git
add <specific-file(s)>"; also quote the TAG_VERSION variable wherever it is used
(use "$TAG_VERSION") in commands like git commit messages or git push refs to
guard against spaces or special characters. Ensure the commit command remains
explicit (e.g., git commit -m "chore: prepare for release $TAG_VERSION") and any
push or tag creation uses "$TAG_VERSION".
sudo-kraken
left a comment
There was a problem hiding this comment.
Looks good to me. Will be a good addition to our workflows.
fallenbagel
left a comment
There was a problem hiding this comment.
Accidentally pressed copilot again. Lgtm!
There was a problem hiding this comment.
Pull request overview
This PR adds automation for the release process by introducing a new create-tag workflow that runs on the main branch. The workflow automatically determines the next version using git-cliff, updates package.json, commits the change, and creates a tag that triggers the existing release workflow. Additionally, manual [skip ci] checks have been removed from CI workflows since GitHub Actions now natively supports this feature.
Changes:
- Added new
create-tag.ymlworkflow that automates version bumping and tag creation - Removed redundant manual
[skip ci]checks from CI workflows (now handled natively by GitHub)
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| .github/workflows/create-tag.yml | New workflow to automate release tagging process using git-cliff for version detection, npm for package.json updates, and git commands for committing and tagging |
| .github/workflows/ci.yml | Removed manual [skip ci] condition checks as GitHub Actions now supports this natively |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
fallenbagel
left a comment
There was a problem hiding this comment.
There are two reviews by copilot that I believe might be worth checking out
Signed-off-by: Ludovic Ortega <ludovic.ortega@adminafk.fr>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Duplicate comments:
In @.github/workflows/create-tag.yml:
- Around line 36-41: The step that runs git-cliff (step name "Get tag version",
id "git-cliff") can produce an empty tag_version which is then exported; update
the step to validate tag_version after running git-cliff and before writing to
GITHUB_OUTPUT by checking if tag_version is non-empty, logging an error and
exiting non-zero (or setting a safe default) when it is empty, and only echoing
"tag_version=${tag_version}" to "$GITHUB_OUTPUT" when the value is present.
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/seerr-team/seerr](https://github.com/seerr-team/seerr) | minor | `v3.0.1` → `v3.1.0` | | [seerr-team/seerr](https://github.com/seerr-team/seerr) | minor | `v3.0.1` → `v3.1.0` | --- ### Release Notes <details> <summary>seerr-team/seerr (ghcr.io/seerr-team/seerr)</summary> ### [`v3.1.0`](https://github.com/seerr-team/seerr/releases/tag/v3.1.0) [Compare Source](seerr-team/seerr@v3.0.1...v3.1.0) ##### 🛡️ Security - Patch [CVE-2026-27707](GHSA-rc4w-7m3r-c2f7) - Unauthenticated account registration on Plex-configured Seerr instances via Jellyfin authentication endpoint - ([4ae2068](seerr-team/seerr@4ae2068)) - Patch [CVE-2026-27793](GHSA-f7xw-jcqr-57hp) - Broken Object-Level Authorization in User Profile Endpoint Exposes Third-Party Notification Credentials - ([4f089b2](seerr-team/seerr@4f089b2)) - Patch [CVE-2026-27792](GHSA-gx3h-3jg5-q65f) - Missing authentication on pushSubscription endpoints - ([946bdecec](seerr-team/seerr@946bdec)) ##### 🚀 Features - *(helm)* Use an existing PVC as config volume ([#​2447](seerr-team/seerr#2447)) - ([8f0c904](seerr-team/seerr@8f0c904)) - *(servarr-api)* Make Servarr API request timeout configurable ([#​2556](seerr-team/seerr#2556)) - ([3bcb4da](seerr-team/seerr@3bcb4da)) - Self-host font for better privacy ([#​2540](seerr-team/seerr#2540)) - ([10ea21b](seerr-team/seerr@10ea21b)) ##### 🐛 Bug Fixes - *(helm)* Add "v" as prefix for appVersion tag ([#​2445](seerr-team/seerr#2445)) - ([04b9d87](seerr-team/seerr@04b9d87)) - *(jellyfin-scanner)* Include unmatched seasons in processable seasons ([#​2538](seerr-team/seerr#2538)) - ([68f56d2](seerr-team/seerr@68f56d2)) - *(link-account)* Fix error-message override ([#​2547](seerr-team/seerr#2547)) - ([b843be0](seerr-team/seerr@b843be0)) - *(plex-scanner)* Add TVDb to TMDB fallback in plex scanner ([#​2537](seerr-team/seerr#2537)) - ([7c60a5c](seerr-team/seerr@7c60a5c)) - *(radarr)* Trigger search for existing monitored movies without files ([#​2391](seerr-team/seerr#2391)) - ([55776ea](seerr-team/seerr@55776ea)) - *(servarr)* Increase default API timeout from 5000ms to 10000ms ([#​2442](seerr-team/seerr#2442)) - ([b499976](seerr-team/seerr@b499976)) - *(sonarr)* Use configured metadata provider for season filtering ([#​2516](seerr-team/seerr#2516)) - ([5013d1d](seerr-team/seerr@5013d1d)) - *(watch-data)* Use sentinel values to avoid invalid SQL syntax ([#​2552](seerr-team/seerr#2552)) - ([947f70c](seerr-team/seerr@947f70c)) - *(watchlist-sync)* Correct permission typo for TV auto requests ([#​2488](seerr-team/seerr#2488)) - ([e0e4b6f](seerr-team/seerr@e0e4b6f)) - Preserve blocklist on media deletion & optimise watchlist-sync ([#​2478](seerr-team/seerr#2478)) - ([9da8bb6](seerr-team/seerr@9da8bb6)) ##### 🚜 Refactor - *(tailwind)* Replace deprecated tailwind utilities ([#​2542](seerr-team/seerr#2542)) - ([f42a4ec](seerr-team/seerr@f42a4ec)) ##### 📖 Documentation - *(synology)* Add installation guide via SynoCommunity ([#​2503](seerr-team/seerr#2503)) - ([0e636a3](seerr-team/seerr@0e636a3)) - *(truenas)* Update install/migration guide ([#​2491](seerr-team/seerr#2491)) - ([dc1734d](seerr-team/seerr@dc1734d)) - *(unraid)* Improve unraid migration guide ([#​2470](seerr-team/seerr#2470)) - ([5e64d49](seerr-team/seerr@5e64d49)) - Update Unraid install and migration guides with dual permission methods ([#​2532](seerr-team/seerr#2532)) - ([a0d0eb1](seerr-team/seerr@a0d0eb1)) - Add a warning in migration-guide for third party installation ([#​2527](seerr-team/seerr#2527)) - ([7e9dff3](seerr-team/seerr@7e9dff3)) - Remove double quotes (") from DB\_HOST environment variable ([#​2514](seerr-team/seerr#2514)) - ([fa905be](seerr-team/seerr@fa905be)) - Add Unraid installation and migration guide ([#​2440](seerr-team/seerr#2440)) - ([b6a9132](seerr-team/seerr@b6a9132)) - Fix migration guide title ([#​2425](seerr-team/seerr#2425)) - ([39ae32f](seerr-team/seerr@39ae32f)) ##### ⚡ Performance - Add missing indexes on all foreign key columns ([#​2461](seerr-team/seerr#2461)) - ([c6bcfe0](seerr-team/seerr@c6bcfe0)) ##### ⚙️ Miscellaneous Tasks - *(changelog)* Fix changelog template ([#​2431](seerr-team/seerr#2431)) - ([c2977f6](seerr-team/seerr@c2977f6)) - *(eslint)* Add react/self-closing-comp ([#​2563](seerr-team/seerr#2563)) - ([cd8b386](seerr-team/seerr@cd8b386)) - *(github)* Add docs and maintenance issue templates ([#​2467](seerr-team/seerr#2467)) - ([cf4883a](seerr-team/seerr@cf4883a)) - *(helm)* Add GatewayAPI route support to helm chart ([#​2544](seerr-team/seerr#2544)) - ([3a42f59](seerr-team/seerr@3a42f59)) - *(helm)* Update ghcr.io/seerr-team/seerr ( 3.0.0 → 3.0.1 ) \[skip-ci] ([#​2441](seerr-team/seerr#2441)) - ([87fb0df](seerr-team/seerr@87fb0df)) - *(husky)* Fixed husky commit message from bash/zsh syntax to sh syntax ([#​2572](seerr-team/seerr#2572)) - ([a00c9e5](seerr-team/seerr@a00c9e5)) - *(release)* Prepare ${TAG\_VERSION} - ([94a70bb](seerr-team/seerr@94a70bb)) - Updated the Contributing and Security guides to reflect our current practices ([#​2579](seerr-team/seerr#2579)) - ([0d40a42](seerr-team/seerr@0d40a42)) - Disable nextjs telemetry ([#​2517](seerr-team/seerr#2517)) - ([cecdd63](seerr-team/seerr@cecdd63)) - Update contributing guide regarding Automated AI Agent ([#​2518](seerr-team/seerr#2518)) - ([880fbc9](seerr-team/seerr@880fbc9)) - Remove discord notification from release ([#​2501](seerr-team/seerr#2501)) - ([fba20c1](seerr-team/seerr@fba20c1)) - Add create-tag workflow to streamline release process ([#​2493](seerr-team/seerr#2493)) - ([06e5eb0](seerr-team/seerr@06e5eb0)) - Update concurrency logic ([#​2481](seerr-team/seerr#2481)) - ([4939f13](seerr-team/seerr@4939f13)) - Add semantic-pr workflow to enforce conventional commits ([#​2472](seerr-team/seerr#2472)) - ([5e57fdc](seerr-team/seerr@5e57fdc)) ##### New Contributors ❤️ - [@​caillou](https://github.com/caillou) made their first contribution - [@​Kenshin9977](https://github.com/Kenshin9977) made their first contribution - [@​MagicLegend](https://github.com/MagicLegend) made their first contribution - [@​wiiaam](https://github.com/wiiaam) made their first contribution - [@​mjonkus](https://github.com/mjonkus) made their first contribution - [@​nova-api](https://github.com/nova-api) made their first contribution - [@​mreid-tt](https://github.com/mreid-tt) made their first contribution - [@​DataBitz](https://github.com/DataBitz) made their first contribution - [@​Hyperion2220](https://github.com/Hyperion2220) made their first contribution - [@​blassley](https://github.com/blassley) made their first contribution - [@​JanKleine](https://github.com/JanKleine) made their first contribution - [@​koiralasandesh](https://github.com/koiralasandesh) made their first contribution<!-- generated by git-cliff --> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNS43IiwidXBkYXRlZEluVmVyIjoiNDMuMjUuNyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=--> Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4284 Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net> Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Description
I added a new
create-tagworkflow that can only be run on themainbranch and streamlines the release process. It can be triggered via the web UI, automatically detects the appropriate tag, bumps thepackage.jsonversion, commit it and creates a new tag. Afterward, the Seerr release workflow is triggered automatically.To make it work, I set up a private key in the repository settings (deploy key + secret variable) because of this GitHub limitation.
I also removed the
"skip ci"check from the other workflows, as GitHub Actions already supports this feature natively (reference).How Has This Been Tested?
Create tag workflow run : https://github.com/M0NsTeRRR/seerr/actions/runs/22122957497
Seerr release workflow run : https://github.com/M0NsTeRRR/seerr/actions/runs/22122967642
Screenshots / Logs (if applicable)
Checklist:
pnpm buildpnpm i18n:extractSummary by CodeRabbit