1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-03-17 20:47:50 +02:00
goreleaser/dagger/test.go
Carlos Alexandro Becker 2bf08f11a6
ci: run build/test workflow on windows too (#5263)
Maybe 3rd time is the charm!

This makes the CI build run on windows too, and fix broken tests/featuers on Windows.

Most of the changes are related to ignoring certain tests on windows, or making sure to use the right path separators.

More work to do in the future, probably!

#4293

---------

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>
2024-11-16 10:30:39 -03:00

125 lines
2.8 KiB
Go

package main
import (
"context"
"fmt"
"runtime"
"github.com/goreleaser/goreleaser/dagger/internal/dagger"
)
const (
// nixos/nix:2.18.3
nixBase = "nixos/nix@sha256:3f8fec6acf10ae6f1c8843ccc607490d4635d620a75afc0b523eedba7617c16e"
buildxVersion = "v0.15.1"
)
// Test Goreleaser
func (g *Goreleaser) Test(ctx context.Context) *TestResult {
test := g.TestEnv().
WithExec([]string{
"go",
"test",
"-failfast",
"-race",
"-coverpkg=./...",
"-covermode=atomic",
"-coverprofile=coverage.txt",
"./...",
"-run",
".",
})
return &TestResult{
Container: test,
}
}
// Custom type for test results
type TestResult struct {
// Container with the test executed
Container *dagger.Container
}
// Coverage report from the test. Save with '-o ./coverage.txt'
func (t *TestResult) CoverageReport() *dagger.File {
return t.Container.File("coverage.txt")
}
// Stdout from the test command
func (t *TestResult) Output(ctx context.Context) (string, error) {
return t.Container.Stdout(ctx)
}
// Container to test Goreleaser
func (g *Goreleaser) TestEnv() *dagger.Container {
// Dependencies needed for testing
testDeps := []string{
"bash",
"curl",
"git",
"gpg",
"gpg-agent",
"upx",
"cosign",
"docker",
"syft",
}
return g.Base().
WithEnvVariable("CGO_ENABLED", "1").
WithExec(append([]string{"apk", "add"}, testDeps...)).
With(installNix).
With(installBuildx).
WithUser("nonroot").
WithExec([]string{"go", "install", "github.com/google/ko@latest"}).
// This is bound at localhost for the hardcoded docker and ko registry tests
WithServiceBinding("localhost", dag.Docker().Engine()).
WithEnvVariable("DOCKER_HOST", "tcp://localhost:2375").
// Mount the source code last to optimize cache
With(WithSource(g))
}
// Install Nix binaries from nixos image
func installNix(target *dagger.Container) *dagger.Container {
nix := dag.Container().From(nixBase)
nixBin := "/root/.nix-profile/bin"
binaries := []string{
"nix",
"nix-build",
"nix-channel",
"nix-collect-garbage",
"nix-copy-closure",
"nix-daemon",
"nix-env",
"nix-hash",
"nix-instantiate",
"nix-prefetch-url",
"nix-shell",
"nix-store",
}
for _, binary := range binaries {
target = target.WithFile("/bin/"+binary, nix.File(nixBin+"/"+binary))
}
target = target.WithDirectory("/nix/store", nix.Directory("/nix/store"))
return target
}
// Install buildx plugin for Docker from buildx github release
func installBuildx(target *dagger.Container) *dagger.Container {
arch := runtime.GOARCH
url := fmt.Sprintf("https://github.com/docker/buildx/releases/download/%s/buildx-%s.linux-%s", buildxVersion, buildxVersion, arch)
bin := dag.HTTP(url)
return target.WithFile(
"/usr/lib/docker/cli-plugins/docker-buildx",
bin,
dagger.ContainerWithFileOpts{
Permissions: 0o777,
})
}