diff --git a/cmd/releasekit/multi_module_woodpecker_test.go b/cmd/releasekit/multi_module_woodpecker_test.go index dd8e686..f6eebef 100644 --- a/cmd/releasekit/multi_module_woodpecker_test.go +++ b/cmd/releasekit/multi_module_woodpecker_test.go @@ -55,6 +55,7 @@ func TestMultiModuleWoodpeckerDelivery(t *testing.T) { if output := runWoodpeckerBlock(t, command, repository, env); !strings.Contains(output, "state complete") || !strings.Contains(output, "tool-version=v0.2.197") { t.Fatalf("tagged page delivery output = %q", output) } + assertGoSelection(t, repository, env["RELEASEKIT_GO_LOG"]) if delivery.snapshot().creates != 1 || delivery.snapshot().requests == 0 || delivery.snapshot().tag != tag { t.Fatalf("page delivery fixture = %#v", delivery.snapshot()) } @@ -400,6 +401,7 @@ func multiModuleWorkflowEnvironment(t *testing.T, repository, commit, tag, binar t.Helper() goDir, goLog := installGoBootstrapShim(t) environment := templateEnvironment(repository, commit, goDir, goLog) + environment["GOOS"], environment["GOARCH"] = foreignTarget() environment["CI_COMMIT_TAG"] = tag environment["RELEASEKIT_TEST_BINARY"] = binary useSyntheticModuleProxy(t, environment, "file://"+filepath.ToSlash(proxy)) diff --git a/cmd/releasekit/woodpecker_test.go b/cmd/releasekit/woodpecker_test.go index 4897dc4..5cb28f3 100644 --- a/cmd/releasekit/woodpecker_test.go +++ b/cmd/releasekit/woodpecker_test.go @@ -46,6 +46,7 @@ func TestWoodpeckerTagDeliveryTemplate(t *testing.T) { goDir, goLog := installGoBootstrapShim(t) env := templateEnvironment(repository, commit, goDir, goLog) + env["GOOS"], env["GOARCH"] = foreignTarget() moduleBefore := readWoodpeckerFixtureFile(t, filepath.Join(repository, "go.mod")) output := runWoodpeckerBlock(t, command, repository, env) if !strings.Contains(output, "state complete") { @@ -77,6 +78,7 @@ func TestWoodpeckerTagDeliveryTemplate(t *testing.T) { goDir, goLog := installGoBootstrapShim(t) env := templateEnvironment(repository, commit, goDir, goLog) + env["GOOS"], env["GOARCH"] = foreignTarget() moduleBefore := readWoodpeckerFixtureFile(t, filepath.Join(repository, "go.mod")) sumBefore := readWoodpeckerFixtureFile(t, filepath.Join(repository, "go.sum")) for attempt := 0; attempt < 2; attempt++ { @@ -108,6 +110,7 @@ func TestWoodpeckerTagDeliveryTemplate(t *testing.T) { unrelated := cliGitOutput(t, repository, "rev-parse", "HEAD") goDir, goLog := installControlledGoBootstrapShim(t) env := templateEnvironment(repository, unrelated, goDir, goLog) + env["GOOS"], env["GOARCH"] = foreignTarget() if output, err := executeWoodpeckerBlock(command, repository, env); err == nil { t.Fatalf("wrong tag succeeded: %s", output) } else if !strings.Contains(output, commit) || !strings.Contains(output, unrelated) { @@ -123,6 +126,7 @@ func TestWoodpeckerTagDeliveryTemplate(t *testing.T) { writeRepositoryFile(t, repository, "go.mod", "module example.com/different-tool-selection\n\ngo 1.25.0\n") goDir, goLog := installControlledGoBootstrapShim(t) env := templateEnvironment(repository, commit, goDir, goLog) + env["GOOS"], env["GOARCH"] = foreignTarget() if output, err := executeWoodpeckerBlock(command, repository, env); err == nil { t.Fatalf("dirty module succeeded: %s", output) } @@ -153,6 +157,7 @@ func TestWoodpeckerTagDeliveryTemplate(t *testing.T) { goDir, goLog := installControlledGoBootstrapShim(t) toolArgs := filepath.Join(t.TempDir(), "tool-arguments") env := templateEnvironment(repository, strings.ToUpper(eventID), goDir, goLog) + env["GOOS"], env["GOARCH"] = foreignTarget() env["CI_COMMIT_TAG"] = event.tag env["RELEASEKIT_TOOL_ARGS_LOG"] = toolArgs env["RELEASEKIT_TOOL_EXIT"] = "37" @@ -225,6 +230,7 @@ func TestWoodpeckerTagDeliveryUsesTaggedModuleVersion(t *testing.T) { moduleBefore := readWoodpeckerFixtureFile(t, filepath.Join(repository, "go.mod")) commit := oldCommit env := templateEnvironment(repository, commit, goDir, goLog) + env["GOOS"], env["GOARCH"] = foreignTarget() useSyntheticModuleProxy(t, env, "file://"+filepath.ToSlash(proxy)) sumLog := filepath.Join(t.TempDir(), "tool-only-sums") env["RELEASEKIT_SUM_LOG"] = sumLog @@ -242,6 +248,7 @@ func TestWoodpeckerTagDeliveryUsesTaggedModuleVersion(t *testing.T) { const module = "go.maximumdirect.net/releasekit" writeRepositoryFile(t, repository, "go.mod", "module example.com/cli-candidate\n\ngo 1.25.0\n\nrequire "+module+" v0.2.197\n\ntool "+module+"/cmd/releasekit\n") env := templateEnvironment(repository, "", goDir, goLog) + env["GOOS"], env["GOARCH"] = foreignTarget() useSyntheticModuleProxy(t, env, "file://"+filepath.ToSlash(proxy)) runWoodpeckerBlock(t, "go mod tidy\ngo mod vendor", repository, env) cliGitRun(t, repository, "add", "go.mod", "go.sum", "vendor") @@ -267,6 +274,7 @@ func TestWoodpeckerTagDeliveryUsesTaggedModuleVersion(t *testing.T) { commit := pushTaggedCLIRepository(t, repository) moduleBefore := readWoodpeckerFixtureFile(t, filepath.Join(repository, "go.mod")) env := templateEnvironment(repository, commit, goDir, goLog) + env["GOOS"], env["GOARCH"] = foreignTarget() useSyntheticModuleProxy(t, env, "file://"+filepath.ToSlash(proxy)) sumLog := filepath.Join(t.TempDir(), "tool-only-sums") env["RELEASEKIT_SUM_LOG"] = sumLog @@ -418,6 +426,7 @@ func installGoBootstrapShim(t *testing.T) (string, string) { goLog := filepath.Join(shimDir, "go-commands") shim := `#!/bin/sh printf 'cwd=%s GOWORK=%s GOTOOLCHAIN=%s %s\n' "$PWD" "$GOWORK" "$GOTOOLCHAIN" "$*" >> "$RELEASEKIT_GO_LOG" +case " $* " in *" -deps "*) printf 'target=%s/%s\n' "$GOOS" "$GOARCH" >> "$RELEASEKIT_GO_LOG" ;; esac "$RELEASEKIT_REAL_GO" "$@" status=$? if [ "$status" -eq 0 ] && [ "$1" = "tool" ] && [ -n "${RELEASEKIT_SUM_LOG:-}" ]; then @@ -442,6 +451,8 @@ func installControlledGoBootstrapShim(t *testing.T) (string, string) { shim := `#!/bin/sh set -eu printf 'cwd=%s GOWORK=%s GOTOOLCHAIN=%s %s\n' "$PWD" "$GOWORK" "$GOTOOLCHAIN" "$*" >> "$RELEASEKIT_GO_LOG" +if [ "$1" = env ]; then exec "$RELEASEKIT_REAL_GO" "$@"; fi +case " $* " in *" -deps "*) printf 'target=%s/%s\n' "$GOOS" "$GOARCH" >> "$RELEASEKIT_GO_LOG" ;; esac modfile= for argument in "$@"; do case "$argument" in -modfile=*) modfile=${argument#-modfile=} ;; esac @@ -644,6 +655,9 @@ func assertModuleBootstrap(t *testing.T, repository, goLog, moduleBefore string, func assertGoSelection(t *testing.T, repository, goLog string) { t.Helper() log := readWoodpeckerFixtureFile(t, goLog) + if !strings.Contains(log, "target="+runtime.GOOS+"/"+runtime.GOARCH) { + t.Fatalf("dependency inspection did not use host target: %s", log) + } list := "list -mod=mod -modfile=" tool := "tool -modfile=" module := "go.maximumdirect.net/releasekit" diff --git a/docs/roadmap/implementation.md b/docs/roadmap/implementation.md index 228b0b2..67d1fa6 100644 --- a/docs/roadmap/implementation.md +++ b/docs/roadmap/implementation.md @@ -42,6 +42,8 @@ checks in Stage 6. ## Stage 2: Normalize consumer Woodpecker templates +**Completed.** + 1. Apply the Stage 1 recipe in the [single-module](../../examples/woodpecker/tag-delivery.yml) and [multi-module](../../examples/multi-module/woodpecker.yml) tag delivery diff --git a/examples/multi-module/woodpecker.yml b/examples/multi-module/woodpecker.yml index 5a64db0..b1f407c 100644 --- a/examples/multi-module/woodpecker.yml +++ b/examples/multi-module/woodpecker.yml @@ -52,6 +52,9 @@ steps: releasekit_module=go.maximumdirect.net/releasekit ( cd "$${module_path}" + releasekit_host_os=$(go env GOHOSTOS) || exit $? + releasekit_host_arch=$(go env GOHOSTARCH) || exit $? + export GOOS="$${releasekit_host_os}" GOARCH="$${releasekit_host_arch}" go list -mod=mod -modfile="$${bootstrap_dir}/releasekit.mod" -m "$${releasekit_module}" go mod edit -modfile="$${bootstrap_dir}/releasekit.mod" -tool="$${releasekit_module}/cmd/releasekit" go list -mod=mod -modfile="$${bootstrap_dir}/releasekit.mod" -deps "$${releasekit_module}/cmd/releasekit" > /dev/null diff --git a/examples/woodpecker/tag-delivery.yml b/examples/woodpecker/tag-delivery.yml index f23ad6e..ed3d20a 100644 --- a/examples/woodpecker/tag-delivery.yml +++ b/examples/woodpecker/tag-delivery.yml @@ -41,6 +41,9 @@ steps: export GOWORK=off export GOTOOLCHAIN=local + releasekit_host_os=$(go env GOHOSTOS) || exit $? + releasekit_host_arch=$(go env GOHOSTARCH) || exit $? + export GOOS="$${releasekit_host_os}" GOARCH="$${releasekit_host_arch}" releasekit_module=go.maximumdirect.net/releasekit go list -mod=mod -modfile="$${bootstrap_dir}/releasekit.mod" -m "$${releasekit_module}" go mod edit -modfile="$${bootstrap_dir}/releasekit.mod" -tool="$${releasekit_module}/cmd/releasekit"