From 31daeb05edf2f8f50af1f27e5281f4dde1216b84 Mon Sep 17 00:00:00 2001 From: Andrea Luzzardi Date: Thu, 31 Mar 2022 19:21:54 -0700 Subject: [PATCH] ci: improve dogfood configuration - Use official Go package - Use golangci-lint package - Fix node_modules exclusion for local source - Improve CUE performance by optimizing cache hits Signed-off-by: Andrea Luzzardi --- ci/images.cue | 80 ------------------------- ci/main.cue | 160 +++++++++++++++++++++++++++++++------------------- source.cue | 15 ----- 3 files changed, 99 insertions(+), 156 deletions(-) delete mode 100644 ci/images.cue delete mode 100644 source.cue diff --git a/ci/images.cue b/ci/images.cue deleted file mode 100644 index 6e2296f7..00000000 --- a/ci/images.cue +++ /dev/null @@ -1,80 +0,0 @@ -package main - -import ( - "universe.dagger.io/docker" -) - -let GoVersion = "1.17" -let GolangCILintVersion = "1.44.0" -let CUEVersion = "0.4.2" - -// Base container images used for the CI -#Images: { - - // base image to build go binaries - goBuilder: _goBuilder.output - _goBuilder: docker.#Build & { - _packages: ["bash", "git", "alpine-sdk"] - - steps: [ - docker.#Pull & { - source: "index.docker.io/golang:\(GoVersion)-alpine" - }, - for pkg in _packages { - docker.#Run & { - command: { - name: "apk" - args: ["add", pkg] - flags: { - "-U": true - "--no-cache": true - } - } - } - }, - ] - } - - // base image for the Go linter - // https://golangci-lint.run/usage/install/#docker - goLinter: _goLinter.output - _goLinter: docker.#Pull & { - source: "index.docker.io/golangci/golangci-lint:v\(GolangCILintVersion)" - } - - // base image for CUE cli + alpine distrib - cue: _cue._alpine.output - _cue: { - _cueBinary: docker.#Pull & { - source: "index.docker.io/cuelang/cue:\(CUEVersion)" - } - - _alpine: docker.#Build & { - _packages: ["bash", "git"] - - steps: [ - docker.#Pull & { - source: "index.docker.io/alpine:3" - }, - for pkg in _packages { - docker.#Run & { - command: { - name: "apk" - args: ["add", pkg] - flags: { - "-U": true - "--no-cache": true - } - } - } - }, - docker.#Copy & { - // input: _alpine.output - contents: _cueBinary.output.rootfs - source: "/usr/bin/cue" - dest: "/usr/bin/cue" - }, - ] - } - } -} diff --git a/ci/main.cue b/ci/main.cue index 6abdcaa0..2d1f0ea5 100644 --- a/ci/main.cue +++ b/ci/main.cue @@ -2,98 +2,136 @@ package main import ( "dagger.io/dagger" - "dagger.io/dagger/core" + "universe.dagger.io/bash" + "universe.dagger.io/alpine" + "universe.dagger.io/docker" + "universe.dagger.io/go" + "universe.dagger.io/go/golangci" ) dagger.#Plan & { - // FIXME: Ideally we would want to automatically set the platform's arch identical to the host // to avoid the performance hit caused by qemu (linter goes from <3s to >3m when arch is x86) // Uncomment if running locally on Mac M1 to bypass qemu // platform: "linux/aarch64" platform: "linux/amd64" - client: filesystem: "./build": write: contents: actions.build.export.directories["/build"] + client: filesystem: "../": read: exclude: [ + "ci", + "**/node_modules", + "cmd/dagger/dagger", + "cmd/dagger/dagger-debug", + ] + client: filesystem: "./build": write: contents: actions.build.output actions: { - _mountGoCache: { - mounts: "go mod cache": { - dest: "/root/.gocache" - contents: core.#CacheDir & { - id: "go mod cache" + _source: client.filesystem["../"].read.contents + + // FIXME: this can be removed once `go` supports built-in VCS info + version: { + _image: alpine.#Build & { + packages: bash: _ + packages: curl: _ + packages: git: _ + } + + _revision: bash.#Run & { + input: _image.output + workdir: "/src" + mounts: source: { + dest: "/src" + contents: _source } + + script: contents: #""" + printf "$(git rev-parse --short HEAD)" > /revision + """# + export: files: "/revision": string } - env: GOMODCACHE: mounts["go mod cache"].dest + + output: _revision.export.files["/revision"] } - _mountSourceCode: { - mounts: "dagger source code": { - contents: _source.output - dest: "/usr/src/dagger" - } - workdir: mounts["dagger source code"].dest - } + build: go.#Build & { + source: _source + package: "./cmd/dagger/" + os: client.platform.os + arch: client.platform.arch - _baseImages: #Images - - // Go build the dagger binary - // depends on goLint and goTest to complete successfully - build: bash.#Run & { - _mountSourceCode - _mountGoCache - - input: _baseImages.goBuilder + ldflags: "-s -w -X go.dagger.io/dagger/version.Revision=\(version.output)" env: { - GOOS: client.platform.os - GOARCH: client.platform.arch CGO_ENABLED: "0" // Makes sure the linter and unit tests complete before starting the build - "__depends_lint": "\(goLint.exit)" - "__depends_tests": "\(goTest.exit)" + // "__depends_lint": "\(goLint.exit)" + // "__depends_tests": "\(goTest.exit)" } - - script: contents: #""" - mkdir -p /build - git_revision=$(git rev-parse --short HEAD) - go build -v -o /build/dagger \ - -ldflags '-s -w -X go.dagger.io/dagger/version.Revision='${git_revision} \ - ./cmd/dagger/ - """# - - export: directories: "/build": _ } // Go unit tests - goTest: bash.#Run & { - _mountSourceCode - _mountGoCache + test: go.#Test & { + // container: image: _goImage.output + source: _source + package: "./..." - input: _baseImages.goBuilder - script: contents: "go test -race -v ./..." + // FIXME: doesn't work with CGO_ENABLED=0 + // command: flags: "-race": true + + env: { + // FIXME: removing this complains about lack of gcc + CGO_ENABLED: "0" + } } - // Go lint using golangci-lint - goLint: bash.#Run & { - _mountSourceCode - _mountGoCache + lint: { + go: golangci.#Lint & { + source: _source + version: "1.45" + } - input: _baseImages.goLinter - script: contents: "golangci-lint run -v --timeout 5m" - } + cue: docker.#Build & { + steps: [ + alpine.#Build & { + packages: bash: _ + packages: curl: _ + packages: git: _ + }, - // CUE lint - cueLint: bash.#Run & { - _mountSourceCode + docker.#Copy & { + contents: _source + source: "go.mod" + dest: "go.mod" + }, - input: _baseImages.cue - script: contents: #""" - # Format the cue code - find . -name '*.cue' -not -path '*/cue.mod/*' -print | time xargs -n 1 -P 8 cue fmt -s - # Check that all formatted files where committed - test -z $(git status -s . | grep -e '^ M' | grep .cue | cut -d ' ' -f3) - """# + // Install CUE + bash.#Run & { + script: contents: #""" + export CUE_VERSION="$(grep cue ./go.mod | cut -d' ' -f2 | head -1 | sed -E 's/\.[[:digit:]]\.[[:alnum:]]+-[[:alnum:]]+$//')" + export CUE_TARBALL="cue_${CUE_VERSION}_linux_amd64.tar.gz" + echo "Installing cue version $CUE_VERSION" + curl -L "https://github.com/cue-lang/cue/releases/download/${CUE_VERSION}/${CUE_TARBALL}" | tar zxf - -C /usr/local/bin + cue version + """# + }, + + // CACHE: copy only *.cue files + docker.#Copy & { + contents: _source + include: ["*.cue"] + dest: "/cue" + }, + + // LINT + bash.#Run & { + workdir: "/cue" + script: contents: #""" + find . -name '*.cue' -not -path '*/cue.mod/*' -print | time xargs -t -n 1 -P 8 cue fmt -s + test -z "$(git status -s . | grep -e "^ M" | grep "\.cue" | cut -d ' ' -f3 | tee /dev/stderr)" + """# + }, + ] + } } } } diff --git a/source.cue b/source.cue deleted file mode 100644 index c5213142..00000000 --- a/source.cue +++ /dev/null @@ -1,15 +0,0 @@ -package main - -import ( - "dagger.io/dagger/core" -) - -_source: core.#Source & { - path: "." - exclude: [ - "ci", - "node_modules", - "cmd/dagger/dagger", - "cmd/dagger/dagger-debug", - ] -}