mirror of
https://github.com/goreleaser/goreleaser.git
synced 2025-01-16 03:52:12 +02:00
d594cdd436
## What is this? This daggerizes the lint, test, and build pipelines for Goreleaser. ## Why? For context, the previous pass at this can be found here https://github.com/goreleaser/goreleaser/pull/4186 . Since that time, the DX for using Dagger has been considerably improved. The benefit this brings to the Goreleaser project is that the test pipeline can be run locally the same as it is run in CI without requiring contributors to configure additional tools in their developer environments. Additionally, by codifying the test and build execution environments, you no longer need to be concerned with changing or outdated Github Actions runner environments. ## How? As a contributor, you can simply clone/fork Goreleaser and run: `dagger functions` to see which commands are available. To lint local code: `dagger call --source . lint` To run tests against local code: `dagger call --source . test output` To run tests against local code and get the coverage report: `dagger call --source . test coverage-report -o ./coverage.txt` To run tests on the main branch on Github: `dagger call --source=https://github.com/goreleaser/goreleaser test output` To run tests against a PR branch on Github: `dagger call --source=https://github.com/goreleaser/goreleaser#pull/4958/head test output` To run tests against a PR branch using the dagger pipeline committed to the main branch, without checking out goreleaser: `dagger -m github.com/goreleaser/goreleaser call --source=https://github.com/goreleaser/goreleaser#pull/4958/head test output` And so on 😃 ## Also In addition to the Dagger code, I've updated the build.yml workflow to use the test pipeline and updated CONTRIBUTING.md with the command to run tests with Dagger. Note that I did not update the Taskfile.yml to avoid breaking anything for contributors comfortable with their existing workflows. Do you feel that this will benefit the Goreleaser project? Would you like to see the Dagger functions doing more/less? --------- Signed-off-by: kpenfound <kyle@dagger.io> Signed-off-by: Lev Lazinskiy <lev@levlaz.org> Signed-off-by: Lev Lazinskiy <lev@dagger.io> Co-authored-by: Lev Lazinskiy <lev@levlaz.org> Co-authored-by: Lev Lazinskiy <lev@dagger.io>
125 lines
2.8 KiB
Go
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: 0777,
|
|
})
|
|
}
|