Skip to content

chore: align CI, release, and tooling to axonops/mask pattern #8

Description

@millerjp

Summary

Re-platforms syncmap's CI/release/tooling to mirror github.com/axonops/mask exactly. The earlier infrastructure PRs (#2, #4, #6) landed a bespoke approach; the mask pattern is the canonical AxonOps Go-library template and must be the source of truth. Replaces all infrastructure files, adds Apache 2.0 headers so the apache-header-guard job passes, and lays the groundwork for release automation plus Dependabot. Supersedes the closed #7.

Requirements

  1. Replace (files currently on main, already merged in chore: add .gitignore, Makefile, and .golangci.yml (#3) #4/ci: add GitHub Actions CI workflow (#5) #6 — will be overwritten):

    • Makefile — adopt mask's target set, SHELL := bash with -eu -o pipefail, make check includes coverage, add bench-regression, llms-full, llms-full-check, clean.
    • .golangci.yml — adopt mask's v2 config exactly: default: none, explicit enables (errcheck, govet, ineffassign, staticcheck, unused, misspell, gocyclo, gocritic, revive, unconvert, unparam, bodyclose, goconst, prealloc, nolintlint, copyloopvar). UK misspell locale. Adjust goimports.local-prefixes to github.com/axonops/syncmap.
    • .gitignore — adopt mask's list verbatim. Keep the CLAUDE.md / .claude/ entries.
    • .github/workflows/ci.yml — adopt mask's job layout and action pins (actions/checkout@v6.0.2, actions/setup-go@v6.4.0, actions/upload-artifact@v7.0.1, golangci/golangci-lint-action@v9.2.0, goreleaser/goreleaser-action@v7.0.0, DavidAnson/markdownlint-cli2-action@v21.0.0). Go "1.26". Port every guard job that applies (local-paths-guard, apache-header-guard, attribution-guard, makefile-targets-guard, lint, test matrix, build matrix, security, release-check). Adjust coverage threshold to 95% per CLAUDE.md §Testing.
  2. Add (new):

    • .github/workflows/release.yml — workflow_dispatch-only release with mask's verifytaggoreleaserproxy-warm job sequence. dry_run input. CI-only tag creation via github-actions[bot].
    • .goreleaser.ymlversion: 2, builds: [{skip: true}], source archive + sha256 checksums + mask's grouped GitHub changelog + mask's release header/footer templates adapted for syncmap. Archive files: list contains only files that exist at merge time (LICENSE, README.md); Phase 5 expands the list.
    • .github/dependabot.yml — weekly gomod + github-actions updates, mask's schedule and labels.
    • .github/workflows/dependabot-automerge.yml — mask's version verbatim.
  3. Add Apache 2.0 headers to the two Go files currently on main so the new apache-header-guard job passes:

  4. Defer to Phase 5:

    • .github/workflows/cla.yml and .github/workflows/contributors.yml — both require CLA.md, CONTRIBUTORS.md, signatures/version1/cla.json, scripts/generate-contributors.sh, and the CLA_ASSISTANT_PAT secret. Land them together when Phase 5 drops CLA content.
    • llms-full-up-to-date guard job — requires scripts/gen-llms-full.sh + llms-full.txt. Re-enable in Phase 5.
    • markdownlint guard job — requires README/CONTRIBUTING/SECURITY content. Re-enable in Phase 5.
    • bdd-strict-mode-guard — requires tests/bdd/ + godog entry file. Re-enable in feat: add Swap and Clear methods #13.
    • benchstat-regression-guard — requires bench.txt baseline + scripts/check-bench-regression.sh. Re-enable in feat!: rename Items to Values #12.
  5. Repo-specific adjustments wherever values appear: project_name: syncmap, owner/name: axonops/syncmap, local-prefixes: github.com/axonops/syncmap, proxy URL paths, labels, concurrency groups.

Acceptance Criteria

  1. diff <(curl mask/Makefile) Makefile shows only: (a) GORELEASER var — unchanged; (b) dropped targets for scripts syncmap doesn't have yet (llms-full, llms-full-check, bench-regression); (c) adjusted BDD_PKG path if present. No other drift.
  2. diff <(curl mask/.golangci.yml) .golangci.yml shows only local-prefixes: github.com/axonops/syncmap and the mask-specific hash.go path exclusion removed.
  3. diff <(curl mask/.github/workflows/ci.yml) .github/workflows/ci.yml shows only: removed guard jobs enumerated in Req 4, plus axonops/maskaxonops/syncmap substitutions, plus 90% → 95% coverage threshold.
  4. diff <(curl mask/.github/workflows/release.yml) .github/workflows/release.yml shows only axonops/maskaxonops/syncmap substitutions.
  5. diff <(curl mask/.goreleaser.yml) .goreleaser.yml shows only project_name, owner/name, header prose, and the archives.files list reduced to files that exist at merge time.
  6. diff <(curl mask/.github/dependabot.yml) .github/dependabot.yml — label adjustments only; same schedule and same grouping.
  7. diff <(curl mask/.github/workflows/dependabot-automerge.yml) .github/workflows/dependabot-automerge.yml is empty.
  8. actionlint .github/workflows/*.yml exits 0.
  9. make release-check passes (goreleaser check).
  10. goreleaser release --snapshot --clean --skip=publish produces dist/syncmap-*-source.tar.gz and dist/checksums.txt.
  11. make check passes (fmt-check + vet + lint + tidy-check + test + test-bdd + coverage + security). Coverage ≥95% on the library.
  12. CI on the PR is fully green — every kept guard job and the test/build matrices pass.
  13. Every .go file on main after merge carries the Apache 2.0 header. git ls-files '*.go' | xargs grep -L 'Licensed under the Apache License, Version 2.0' returns empty.

Testing Requirements

Documentation Requirements

Dependencies

Labels

  • chore
  • ci/cd
  • P0

Metadata

Metadata

Assignees

No one assigned

    Labels

    P0Blocks releasechoreMaintenance, dependencies, CI, toolingci/cdCI/CD pipelines and release

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions