背景
相关问题: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)
总结一下,我目前的构建过程如下:
- 编辑代码。
- 使用 . 构建每个 Go 可执行文件
go build
。可执行文件名为main
,并与 . 一起保存在programX/main/
目录中main.go
。 - 提交并推送代码(因为
main
Git 跟踪可执行文件)到我的主分支。 main
Build Trigger 使用步骤 1 中构建的文件制作了四个 Docker 镜像。
目标
我想从我的构建过程中删除第 1 步,这样我就不再需要在本地编译我的可执行文件,也不需要main
在 Git 中跟踪我的可执行文件。
总之,这是我的理想过程:
- 编辑代码,提交,推送到远程。
- Build Trigger 编译所有四个程序,构建所有四个图像。
- 放松 :)
尝试的解决方案
我使用了开源的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)
它甚至没有寻找供应商目录?
接下来是什么?
我的猜测是以下情况之一是正确的:
- 我没有在构建请求文件中正确指定
GOPATH
/ 。PROJECT_ROOT
但如果是这样,正确的设置是什么? - 我的项目结构不正确。
- 我想做的是不可能的:(*
- 我需要以某种方式进行自定义构建步骤。
- 使用的 Go 版本很旧 - 但我该如何检查呢?
我无法在网上找到我想要实现的目标的示例,而且我发现 GCP 关于这个主题的文档非常缺乏。
任何帮助将不胜感激!