fix(ci): separate CI and CD into distinct pipelines#26
Merged
Conversation
The auto-release and update-screenshots workflows were triggering each other in a loop: screenshot commit → release → screenshot → release... Fix by making each workflow skip the other's commits: - auto-release now skips docs(screenshots): commits - update-screenshots now skips chore: release commits https://claude.ai/code/session_01S7y4A9bjckeJui8aGW3Xeq
Contributor
Release Version Check
This version will be released automatically when this PR is merged to Changelog preview0.1.32 (2026-03-11)Bug Fixes
Refactoring
|
Contributor
Preview DeploymentThe web app for this PR has been deployed: Use this to verify the app works correctly, especially for dependency updates. |
Eliminates the infinite release loop by merging three separate workflows (ci.yml, update-screenshots.yml, auto-release.yml) into a single pipeline. Key changes: - Screenshots run in parallel with other CI jobs, not as a separate workflow - Pixel-level comparison (ImageMagick) prevents metadata-only diffs from triggering commits — only actual visual changes are committed - Release job depends on ALL CI + screenshot jobs passing first - No duplicate validation: release job reuses CI results instead of re-running `bun run validate` - Screenshot commit + release commit are pushed together in a single push - Automated commits (releases, screenshot updates) skip the entire pipeline via a `should-run` gate job https://claude.ai/code/session_01S7y4A9bjckeJui8aGW3Xeq
Restructure the CI/CD pipeline to eliminate the infinite release loop:
CI (ci.yml) — push to main + PRs:
- lint, test, build, screenshots run in parallel
- Pixel-level screenshot comparison (ImageMagick) prevents metadata-only commits
- tag-release job depends on all CI passing, commits screenshots + version
bump + tag, pushes once
- should-run gate skips pipeline for automated commits
CD (cd.yml) — triggered by v* tag push:
- Creates GitHub release from CHANGELOG.md
- Deploys web app to GitHub Pages
- Builds desktop (macOS/Windows/Linux) and mobile (iOS/Android) in parallel
- Uploads all build artifacts to the GitHub release
Other changes:
- .release-it.json: github.release set to false (CD creates releases now)
- release.yml: simplified to manual bump+tag+push (CD handles the rest)
- Deleted release-web.yml, release-desktop.yml, release-mobile.yml
(consolidated into cd.yml)
https://claude.ai/code/session_01S7y4A9bjckeJui8aGW3Xeq
nsheaps
commented
Mar 10, 2026
nsheaps
commented
Mar 10, 2026
nsheaps
commented
Mar 10, 2026
nsheaps
commented
Mar 10, 2026
nsheaps
commented
Mar 10, 2026
Address PR review feedback: 1. Remove should-run gate — use [skip ci] in release and screenshot commit messages instead 2. Extract every CI job into a reusable workflow (_lint.yml, _test-unit.yml, _test-integration.yml, _test-e2e.yml, _build.yml, _update-screenshots.yml, _tag-release.yml) for readability 3. CI orchestrator (ci.yml) is now ~40 lines calling reusable workflows 4. Remove --project='Desktop Chrome' hardcode — run all CI-configured Playwright projects for screenshots 5. CD triggers on 'create' event (not 'push: tags') since [skip ci] in the release commit would suppress push-triggered workflows 6. Screenshot commits only happen when pixels actually change (pixel comparison was already in place, removed the unnecessary commit message skip condition) https://claude.ai/code/session_01S7y4A9bjckeJui8aGW3Xeq
This was referenced Mar 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes the infinite CI loop on
main(release→screenshots→release→..., up to v0.1.31) by restructuring into clean, separated CI and CD pipelines with reusable workflows.CI (
ci.yml) — push to main + PRsCD (
cd.yml) — triggered bycreateevent onv*tagsWhy there's no loop
[skip ci]→ GitHub skips CI entirelyon: createevent (noton: push: tags) which is not affected by[skip ci][skip ci]→ no re-triggershould-rungate needed —[skip ci]handles it nativelyKey changes
ci.yml_lint.yml_test-unit.yml_test-integration.yml_test-e2e.yml_build.yml_update-screenshots.yml_tag-release.ymlcd.yml.release-it.jsongithub.release: false, commit message adds[skip ci]release.ymlauto-release.ymlupdate-screenshots.ymlrelease-web.ymlrelease-desktop.ymlrelease-mobile.ymlScreenshot metadata fix
Screenshots compared pixel-by-pixel with ImageMagick
compare -metric AE. If 0 pixels differ (metadata-only change), the original file is restored — no commit generated.Test plan
feat:commit tomain→ CI runs all jobs in parallel → tags release → CD deploys[skip ci]in release commit prevents CI re-triggeron: createtag event triggers CD despite[skip ci]tag-releaseworkflow_dispatch)https://claude.ai/code/session_01S7y4A9bjckeJui8aGW3Xeq