package main import ( "dagger.io/dagger" "universe.dagger.io/go" "universe.dagger.io/docker" "universe.dagger.io/alpine" ) dagger.#Plan & { client: { filesystem: ".": read: { contents: dagger.#FS include: ["go.mod", "go.sum", "**/*.go"] } env: DOCKER_PASSWORD: dagger.#Secret } actions: { // Alias to code _code: client.filesystem.".".read.contents // Improve go base image with useful tool // Enable cgo by installing build-base _base: go.#Image & { packages: { "build-base": version: _ bash: version: _ } } // Run go unit tests unitTest: go.#Test & { source: _code package: "./..." input: _base.output } // Build go project build: go.#Build & { source: _code } // Build docker image (depends on build) image: docker.#Build & { steps: [ alpine.#Build, docker.#Copy & { contents: build.output dest: "/usr/bin" }, docker.#Set & { config: cmd: [""] }, ] } // Push image to remote registry (depends on image) push: { // Docker username _dockerUsername: "" docker.#Push & { "image": image.output dest: "\(_dockerUsername)/" auth: { username: _dockerUsername secret: client.env.DOCKER_PASSWORD } } } } }