在没有自定义 docker 图像的情况下在 codebuild 中缓存 go 模块
caching go modules in codebuild without custom docker image
TL;DR
如何使用 AWS 提供的映像 (Go 1.12) 在 codebuild 中缓存我的模块?
背景
我正在尝试使用来自 AWS 的 go 映像 (1.12) 在 codebuild 中缓存 go 模块。
正在尝试缓存 /go/pkg/mod
深入挖掘后,我发现该图像中没有 /go/pkg
文件夹。因此,当我尝试缓存 /go/pkg
时,它会抛出一个错误。
Error mounting /go/pkg/mod: symlink /codebuild/local-cache/custom//go/pkg/mod /go/pkg/mod: no such file or directory
即使在我 运行 go mod download
之后(这将创建 /go/pkg/mod
,它也不会缓存该文件夹,因为 codebuild 无法更早地安装它)。
这是我的codebuild.yml
version: 0.2
phases:
install:
runtime-versions:
golang: 1.12
nodejs: 10
commands:
- npm install
build:
commands:
- go build -ldflags="-s -w" -o api/bin/main api/main.go
cache:
paths:
- /go/src/**/*
- /go/pkg/mod/**/*
正在尝试缓存 ./vendor
我还尝试缓存 ./vendor 文件夹,它不会在代码构建中引发任何错误。但是,我认为它不会缓存任何内容,因为构建时间不会减少。它还说它忽略了符号链接。
warning: ignoring symlink /codebuild/output/src074479210/src/github.com/kkesley/myrepo/vendor
go: finding github.com/aws/aws-lambda-go v1.11.1
go: finding github.com/stretchr/testify v1.2.1
go: finding github.com/pmezard/go-difflib v1.0.0
go: finding github.com/davecgh/go-spew v1.1.0
go: finding gopkg.in/urfave/cli.v1 v1.20.0
go: downloading github.com/aws/aws-lambda-go v1.11.1
go: extracting github.com/aws/aws-lambda-go v1.11.1
这是我的 codebuild.yml
这个版本:
version: 0.2
phases:
install:
runtime-versions:
golang: 1.12
nodejs: 10
commands:
- npm install
- go mod vendor
build:
commands:
- go build -mod vendor -ldflags="-s -w" -o api/bin/main api/main.go
cache:
paths:
- /go/src/**/*
- vendor/**/*
问题
如何在不使用自定义 docker 图像的情况下在代码构建中缓存 go 模块?可能吗?
让它与默认的 CodeBuild Ubuntu 构建映像一起工作(我使用的是 v4)
确保在 CodeBuild 项目上启用了本地缓存。去编辑然后工件然后确保自定义缓存被勾选
设置缓存路径为/go/pkg/**.*
cache:
paths:
- '/go/pkg/**/*'
- 确保您的构建脚本在为
go mod download
构建之前包含一个步骤。 在我这样做之前,这个缓存似乎不起作用,所以这似乎是关键步骤。
这是我的完整buildspec.yml供参考
version: 0.2
phases:
install:
runtime-versions:
golang: latest
commands:
- "git config --global credential.helper '!aws codecommit credential-helper $@'"
- "git config --global credential.UseHttpPath true"
build:
commands:
- 'go mod edit -dropreplace git-codecommit.ap-southeast-2.amazonaws.com/v1/repos/xyz'
- 'go mod download'
# Use latest from develop for the build (test env only)
- 'go get git-codecommit.ap-southeast-2.amazonaws.com/v1/repos/xyz@develop'
- 'rm -rf "dist"'
- 'cp -r "eb-template" "dist"'
- 'env GOOS=linux GOARCH=amd64 go build -o "dist/bin/server"'
- 'go mod edit -replace git-codecommit.ap-southeast-2.amazonaws.com/v1/repos/xyz=../xyz'
- 'echo -n ${CODEBUILD_RESOLVED_SOURCE_VERSION} > dist/commithash'
artifacts:
base-directory: dist
files:
- '**/*'
cache:
paths:
- '/go/pkg/**/*'
TL;DR
如何使用 AWS 提供的映像 (Go 1.12) 在 codebuild 中缓存我的模块?
背景
我正在尝试使用来自 AWS 的 go 映像 (1.12) 在 codebuild 中缓存 go 模块。
正在尝试缓存 /go/pkg/mod
深入挖掘后,我发现该图像中没有 /go/pkg
文件夹。因此,当我尝试缓存 /go/pkg
时,它会抛出一个错误。
Error mounting /go/pkg/mod: symlink /codebuild/local-cache/custom//go/pkg/mod /go/pkg/mod: no such file or directory
即使在我 运行 go mod download
之后(这将创建 /go/pkg/mod
,它也不会缓存该文件夹,因为 codebuild 无法更早地安装它)。
这是我的codebuild.yml
version: 0.2
phases:
install:
runtime-versions:
golang: 1.12
nodejs: 10
commands:
- npm install
build:
commands:
- go build -ldflags="-s -w" -o api/bin/main api/main.go
cache:
paths:
- /go/src/**/*
- /go/pkg/mod/**/*
正在尝试缓存 ./vendor
我还尝试缓存 ./vendor 文件夹,它不会在代码构建中引发任何错误。但是,我认为它不会缓存任何内容,因为构建时间不会减少。它还说它忽略了符号链接。
warning: ignoring symlink /codebuild/output/src074479210/src/github.com/kkesley/myrepo/vendor go: finding github.com/aws/aws-lambda-go v1.11.1 go: finding github.com/stretchr/testify v1.2.1 go: finding github.com/pmezard/go-difflib v1.0.0 go: finding github.com/davecgh/go-spew v1.1.0 go: finding gopkg.in/urfave/cli.v1 v1.20.0 go: downloading github.com/aws/aws-lambda-go v1.11.1 go: extracting github.com/aws/aws-lambda-go v1.11.1
这是我的 codebuild.yml
这个版本:
version: 0.2
phases:
install:
runtime-versions:
golang: 1.12
nodejs: 10
commands:
- npm install
- go mod vendor
build:
commands:
- go build -mod vendor -ldflags="-s -w" -o api/bin/main api/main.go
cache:
paths:
- /go/src/**/*
- vendor/**/*
问题
如何在不使用自定义 docker 图像的情况下在代码构建中缓存 go 模块?可能吗?
让它与默认的 CodeBuild Ubuntu 构建映像一起工作(我使用的是 v4)
确保在 CodeBuild 项目上启用了本地缓存。去编辑然后工件然后确保自定义缓存被勾选
设置缓存路径为
/go/pkg/**.*
cache:
paths:
- '/go/pkg/**/*'
- 确保您的构建脚本在为
go mod download
构建之前包含一个步骤。 在我这样做之前,这个缓存似乎不起作用,所以这似乎是关键步骤。
这是我的完整buildspec.yml供参考
version: 0.2
phases:
install:
runtime-versions:
golang: latest
commands:
- "git config --global credential.helper '!aws codecommit credential-helper $@'"
- "git config --global credential.UseHttpPath true"
build:
commands:
- 'go mod edit -dropreplace git-codecommit.ap-southeast-2.amazonaws.com/v1/repos/xyz'
- 'go mod download'
# Use latest from develop for the build (test env only)
- 'go get git-codecommit.ap-southeast-2.amazonaws.com/v1/repos/xyz@develop'
- 'rm -rf "dist"'
- 'cp -r "eb-template" "dist"'
- 'env GOOS=linux GOARCH=amd64 go build -o "dist/bin/server"'
- 'go mod edit -replace git-codecommit.ap-southeast-2.amazonaws.com/v1/repos/xyz=../xyz'
- 'echo -n ${CODEBUILD_RESOLVED_SOURCE_VERSION} > dist/commithash'
artifacts:
base-directory: dist
files:
- '**/*'
cache:
paths:
- '/go/pkg/**/*'