--- name: release description: Prepare or publish a safe gocron release by choosing a SemVer bump, updating AppVersion and migrations, invoking the complete verification gate, committing, checking CI, and creating an annotated tag. Use when asked to release, 发版, bump the version, cut a release, 打 tag, or assess release readiness. --- # Release gocron Keep preparation separate from publication. A version-bump request authorizes the local version edit and verification, but not a push, merge, or tag unless the user also asks to publish the release. ## Compatibility evidence (required) Before tagging, record evidence for every affected case: - `N` frontend/client with `N-1` and `N` backend; - `N` backend with `N-1` and `N` frontend/client; - `N` gocron with `N-1` and `N` gocron-node, in both directions; - `N` upgrading an existing SQLite, MySQL, and PostgreSQL database; - rolling upgrade with temporary `N`/`N-1` HA members when HA is affected. Use automated compatibility tests, previous-version fixtures, or a documented reproducible check. Current/current tests and a fresh install are not enough. If a case cannot remain compatible, stop before tagging: obtain explicit approval, use a major version, and document migration, deployment order, rollback limits, and recovery. ## Performance evidence (required when affected) - Identify affected hot paths and record the workload, data size, environment, command, baseline, and release-candidate result. - Compare latency, throughput, memory/allocations, goroutines, query count, database writes, and migration duration as applicable. - Include SQLite concurrent read/write and lock behavior when database write frequency, logging, polling, migrations, or scheduler state changed. - Require a benchmark or regression test for a material fix or risk. Do not publish a material unexplained regression; an accepted tradeoff needs the user's explicit approval and release-note disclosure. ## 1. Establish the release - Inspect the current branch, working tree, latest `v*` tag, `AppVersion`, and changes since the latest release. - Never develop or commit directly on `master`; create or use a release branch. - Choose the SemVer bump from user-facing changes: features bump minor and fixes or chores bump patch. Ask when the intended version cannot be inferred safely. Honor an explicit version supplied by the user. - Check that the target version and `vX.Y.Z` tag do not already exist. ## 2. Update version and migrations - Update `AppVersion` in `cmd/gocron/gocron.go`. - Update `helm/gocron/Chart.yaml` `appVersion` to the same application version. Increment the Chart `version` whenever the packaged Chart changes; the chart release workflow skips versions that have already been published. - If the release changes the schema, add the model to the `Install` tables slice where applicable, append a unique migration version id and matching `upgradeForNNN` function in `internal/models/migration.go`, add it to the upgrade chain, and add a migration test. - Derive the migration id using the repository's existing version conversion convention. Confirm it with `ToNumberVersion`; do not guess or reuse an id. - If there is no schema change, do not add an empty migration. - For migrations that rewrite existing data, tell the user to back up the database and include the impact in release notes. ## 3. Pass the mandatory gate Invoke `$verify` and require every backend, frontend, lint, test, and Docker check to pass. Do not commit, merge, push, or tag while any check is failed, skipped, or unavailable. Review the final diff and confirm `AppVersion`, Helm `appVersion` and Chart `version`, migration id, tests, and user-facing release notes agree. ## 4. Publish only when requested - Commit with `chore(release): bump version to X.Y.Z`; keep the subject under 100 characters and omit `Co-Authored-By`. - Push the branch and merge it into `master` according to the repository's normal review process. - Confirm the GitHub Actions CI run for the exact release commit is green. - Confirm local `master`, remote `master`, and the green CI SHA all identify the same commit. - Create and push an annotated tag: `git tag -a vX.Y.Z -m "vX.Y.Z"` followed by `git push origin vX.Y.Z`. - Confirm the tag-triggered release workflow starts successfully. Never move or replace an existing release tag, and never tag an unverified commit.