在没有自定义 docker 映像的情况下在代码构建中缓存 go 模块

kke*_*ley 5 caching go amazon-web-services aws-codebuild

TL; 博士

如何使用 AWS 提供的映像 (Go 1.12) 在代码构建中缓存我的模块?

背景

我正在尝试使用 AWS 的 go 映像 (1.12) 在 codebuild 中缓存 go 模块。

尝试缓存 /go/pkg/mod

深入挖掘后,我发现/go/pkg该图像中没有文件夹。因此,当我尝试缓存时,/go/pkg它会抛出错误。

错误挂载 /go/pkg/mod: 符号链接 /codebuild/local-cache/custom//go/pkg/mod /go/pkg/mod: 没有这样的文件或目录

即使在我运行之后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/**/*
Run Code Online (Sandbox Code Playgroud)

试图缓存 ./vendor

我还尝试缓存 ./vendor 文件夹,它不会在代码构建中引发任何错误。但是,我认为它不会缓存任何东西,因为构建时间不会减少。它还说它忽略了符号链接。

警告:忽略符号链接/codebuild/output/src074479210/src/github.com/kkesley/myrepo/vendor go:find github.com/aws/aws-lambda-go v1.11.1 go:find github.com/stretchr/testify v1 .2.1 go:查找github.com/pmezard/go-difflib v1.0.0 go:查找github.com/davecgh/go-spew v1.1.0 go:查找gopkg.in/urfave/cli.v1 v1.20.0 go:下载github.com/aws/aws-lambda-go v1.11.1 go:提取 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/**/*
Run Code Online (Sandbox Code Playgroud)

如何在不使用自定义 docker 镜像的情况下在代码构建中缓存 go 模块?是否可以?

Joe*_*rth 2

要使其与默认的 CodeBuild Ubuntu 构建映像一起使用(我使用的是 v4)

  1. 确保在 CodeBuild 项目上启用本地缓存。转到编辑然后工件,然后确保勾选自定义缓存 Codebuild 本地缓存设置

  2. 将缓存路径设置为/go/pkg/**.*

cache:
  paths:
    - '/go/pkg/**/*'
Run Code Online (Sandbox Code Playgroud)
  1. 确保您的构建脚本包含构建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/**/*'
Run Code Online (Sandbox Code Playgroud)