2

背景

相关问题:Google Container Builder:如何在构建步骤中安装 govendor 依赖项?

我正在尝试使用 Google Cloud Container Builder 使用 Build Triggers 自动构建我的 Docker 容器。

我的代码在 Go 中,vendor我的项目根目录中有一个文件夹(签入到 Git),其中包含我所有的 Go 依赖项。

我的项目有四个需要 Docker 化的二进制文件,结构如下:

vendor/
   ...
program1/
    program1.go
    main/
        main.go
        Dockerfile
program2/
    program2.go
    main/
        main.go
        Dockerfile
...

每个程序的 Dockerfile 都很简单:

FROM alpine
ADD main main
ENTRYPOINT ["/main"]

我设置了一个构建触发器来跟踪我的master分支。触发器运行以下构建请求 ( cloudbuild.yaml),它利用了开源 Docker 构建步骤:

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/program1:0.1.15-$SHORT_SHA', '.']
  dir: 'program1/main'

  ... (repeated for each program)
  (images, tags omitted)

总结一下,我目前的构建过程如下:

  1. 编辑代码。
  2. 使用 . 构建每个 Go 可执行文件go build。可执行文件名为main,并与 . 一起保存在programX/main/目录中main.go
  3. 提交并推送代码(因为mainGit 跟踪可执行文件)到我的主分支。
  4. mainBuild Trigger 使用步骤 1 中构建的文件制作了四个 Docker 镜像。

目标

我想从我的构建过程中删除第 1 步,这样我就不再需要在本地编译我的可执行文件,也不需要main在 Git 中跟踪我的可执行文件。

总之,这是我的理想过程:

  1. 编辑代码,提交,推送到远程。
  2. Build Trigger 编译所有四个程序,构建所有四个图像。
  3. 放松 :)

尝试的解决方案

我使用了开源的Go 构建步骤,如下:

cloudbuild.yaml: (更新)

steps:
- id: 'build-program1'
  name: 'gcr.io/cloud-builders/go'
  args: ['build', '-a', '-installsuffix', 'cgo', '-ldflags', '''-w''', '-o', 'main', './main.go']
  env: ['PROJECT_ROOT=/workspace', 'CGO_ENABLED=0', 'GOOS=linux']
  dir: 'program1/main'
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/program1:0.1.15-$SHORT_SHA', '.']
  dir: 'program1/main'
  waitFor: ['build-program1']

  ... (repeated for each program)
  (images, tags omitted)

在尝试了在env字段中设置 PROJECT_ROOT 和 GOPATH 的各种组合后build-programX,我的项目中使用的每个包都收到相同的错误(文件路径不同):

cannot find package "github.com/acoshift/go-firebase-admin" in any of
Step #0 - "build-program1": /usr/local/go/src/github.com/acoshift/go-firebase-admin (from $GOROOT) 
Step #0 - "build-program1": /workspace/auth/main/gopath/src/github.com/acoshift/go-firebase-admin (from $GOPATH)

它甚至没有寻找供应商目录?

接下来是什么?

我的猜测是以下情况之一是正确的:

  1. 我没有在构建请求文件中正确指定GOPATH/ 。PROJECT_ROOT但如果是这样,正确的设置是什么?
  2. 我的项目结构不正确。
  3. 我想做的是不可能的:(*
  4. 我需要以某种方式进行自定义构建步骤。
  5. 使用的 Go 版本很旧 - 但我该如何检查呢?

我无法在网上找到我想要实现的目标的示例,而且我发现 GCP 关于这个主题的文档非常缺乏。

任何帮助将不胜感激!

4

2 回答 2

3

问题在于#1:PROJECT_ROOT指的是二进制文件的所需导入路径。例如,如果program1/main/main.go您导入"github.com/foo/bar/program1"以获取 中定义的包program1/program1.go,您将设置PROJECT_ROOT=github.com/foo/bar.

于 2017-10-02T13:52:59.557 回答
2

由于这些更改,修复了问题(但不完全确定如何...):

  1. 设置PROJECT_ROOTmy_root,这样我要编译的代码就位于my_root/program1/main/main.go(感谢 John Asmuth 的回答:https ://stackoverflow.com/a/46526875/6905609 )
  2. 删除dirsGo 构建步骤的字段
  3. -o标志设置为./program1/main/main,并将最终构建参数设置为./program1/main/main.go

以前我在构建步骤中cd进入program1/main目录,并且由于某种原因go build正在寻找其中的包my_root/program1/main而不是my_root. 诡异的!

于 2017-10-03T12:45:32.063 回答