在没有自定义docker镜像的情况下,在codebuild中缓存go模块。

问题描述 投票:5回答:1

TL;DR

如何在codebuild中使用AWS提供的镜像(Go 1.12)缓存我的模块?

背景介绍

我试图在codebuild中使用AWS的go镜像(1.12)缓存go模块。

试图缓存gopkgmod

深入了解后,我发现,并没有 /go/pkg 文件夹中。因此,当我试图缓存 /go/pkg 它将抛出一个错误。

挂载 gopkgmod 出错:符号链接 codebuildlocal-cachecustom/gopkgmod gopkgmod: 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文件夹,这在codebuild中没有抛出任何错误。然而,我不认为它在缓存任何东西,因为构建时间没有减少。它还说它忽略了符号链接。

warning: ignoring symlink codebuildoutputsrc074479210srcgithub.comkkesleymyrepovendor go: finding github.comawsaws-lambda-go v1.11.1 go: finding github.comstretchrtestify v1.2.1 go: finding github. compmezardgo-difflib v1.0.0 去:找到github.comdavecghgo-spew v1.1.0 去:找到gopkg.inurfavecli.v1 v1.20.0 去:下载github.comawsaws-lambda-go v1.11.1 去:解压github.comawsaws-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模块?这可能吗?

amazon-web-services go caching aws-codebuild
1个回答
1
投票

为了让它与默认的CodeBuild Ubuntu构建镜像一起工作(我使用的是v4)

  1. 确保在CodeBuild项目中启用了本地缓存。进入编辑,然后是工件,然后确保自定义缓存被勾选。Codebuild local cache settings

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

cache:
  paths:
    - '/go/pkg/**/*'
  1. 确保你的构建脚本在构建之前包含了一个步骤,以实现 go mod download. 在我这样做之前,缓存似乎没有工作,所以这似乎是一个关键步骤。

下面是我的完整的buildpec.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/**/*'
© www.soinside.com 2019 - 2024. All rights reserved.