Skip to content

Development and Testing

KoukeNeko edited this page Sep 9, 2026 · 5 revisions

Development and Testing

English · 繁體中文

The fast loop

No Docker required:

make test
make test-race
make lint

make lint runs go vet and golangci-lint run. The complete gate:

make verify

which is test, test-race, lint, and build together.

Docker E2E

make test-integration

The harness brings up a real Taiga in a dedicated taiga-cli-e2e Compose project on localhost:19000, waits for the API, builds the CLI, and runs the tests behind the integration build tag, covering auth, projects, agile workflows, wiki, attachments, batch, stats, and export/import.

The tests create their own throwaway account, project, and issues, and on exit tear down only their own containers and volumes — they never touch the Taiga instance you use day to day.

The E2E tests live in test/e2e. Because of the //go:build integration tag they are not picked up by go test ./....

Project layout

cmd/taiga            CLI entry point
cmd/releasepack      Cross-platform reproducible packaging tool
internal/cli         Cobra command layer
internal/taiga       Taiga REST API client
internal/config      TOML profiles and Git-local settings
internal/credential  OS keyring abstraction
internal/output      JSON envelopes and field filtering
internal/completioncache  Completion metadata cache
internal/atomicfile  Atomic file replacement
internal/version     Build information injected via ldflags
internal/releasepack Archives, checksums, and SBOM generation

internal/taiga does not depend on internal/cli and can be used as a standalone Taiga SDK.

Testing approach

The App type in internal/cli exposes every I/O dependency and side effect as an injectable field — stdin, stdout, stderr, the HTTP client, environment lookups, the working directory, and the keyring — so command-layer tests never touch the real environment or network. They run entirely against httptest.

Release packaging

make release \
  VERSION=v0.1.0 \
  COMMIT="$(git rev-parse HEAD)" \
  SOURCE_DATE_EPOCH="$(git show -s --format=%ct HEAD)"

This produces archives for six platforms, completions for four shells, SHA256SUMS, and an SPDX 2.3 SBOM under dist/<version>/. CI rebuilds the Linux archive and compares it byte for byte to prove reproducibility.

Release builds additionally sign and notarize the macOS binaries, which the packaging tool accepts through SIGN_IDENTITY, SIGN_KEYCHAIN, NOTARY_KEY, NOTARY_KEY_ID, and NOTARY_ISSUER. Leaving them unset — the default for a local build — skips signing entirely and keeps every archive reproducible. Signing only ever touches darwin targets.

The full maintainer release process is in RELEASING.md.

Clone this wiki locally