Set up or align a GitHub Actions release pipeline for a versioned package, library, CLI, or marketplace action. Use when standardizing repos around the verify-then-release shape: push to main → guardrails → semantic-release tags + publishes → version-bump commit back to main with [skip ci].
99
100%
Does it follow best practices?
Impact
98%
1.55xAverage score across 4 eval scenarios
Passed
No known issues
Common failure modes when standing up or operating this pipeline. Check here before rewriting the workflow.
feat:, fix:, breaking). chore:/docs:/etc. are no-ops by default.npx semantic-release --dry-run --no-ci from the release branch. The output lists analyzed commits and the decision.feat: / fix: commit, or extend commit-analyzer releaseRules to bump on the type you care about.[skip ci] guard is missing on the release job's if:, or the bump message no longer contains [skip ci].main. Message must contain [skip ci]. Workflow must have if: ${{ … !contains(github.event.head_commit.message, '[skip ci]') }} on both verify and release.@semantic-release/git pushpersist-credentials: true (or set it to false), or the workflow's default token does not have contents: write.actions/checkout@v6 keeps credentials and the release job declares permissions: { contents: write }.@semantic-release/github (or the publish plugin) ran but failed silently because GITHUB_TOKEN / NPM_TOKEN was not exported into the step's env:.cycjimmy/semantic-release-action reads from the step's env:.cancel-in-progress: true.concurrency: { group: release-${{ github.repository }}-main, cancel-in-progress: false } at the job level. The verify job's cancellable group is separate.[skip ci] commits and is re-running the suite on the bump.[skip ci] guard to verify too. The bot commit changes generated files (CHANGELOG.md, lockfiles); re-running verify on it is wasted CI minutes at best and a flake source at worst.fetch-depth: 1 (the default) hides previous tags.actions/checkout@v6 with fetch-depth: 0 on both verify and release.setup-node did not write the auth file. Add registry-url: "https://registry.npmjs.org" to the action.package.json needs "publishConfig": { "access": "public" }.feat: / fix:), or pod trunk delete <podname> <version> (requires owner) and re-run.dist/, Package.swift rewrite) leak into the working tree before goreleaser runs.goreleaser release --clean flag is set, and that any pre-release script writes its output outside the working tree or stages it before goreleaser starts.@v1 see no updatesgit tag -f v1 && git push -f origin v1 step (see targets.md → GitHub Action). Verify by clicking the tag on the GitHub release page — it should match the latest v1.x.y.cycjimmy/semantic-release-action@v6