【问题标题】:Deploy App Engine go app using Cloud Build使用 Cloud Build 部署 App Engine go 应用
【发布时间】:2019-02-06 15:19:41
【问题描述】:

目标:

使用 Cloud Build 配置 - 将应用构建为可部署到应用引擎的工件。

不起作用的解决方案:

这是cloudbuild.yaml

steps:
- name: 'gcr.io/cloud-builders/go'
  args: ['get']
  env: ['PROJECT_ROOT=project-name']
- name: 'gcr.io/cloud-builders/go'
  args: ['build', '.']
  env: ['PROJECT_ROOT=project-name']
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['app', 'deploy']
timeout: '1600s'

artifacts:
  objects:
    location: 'gs://project-artifacts/'
    paths: ['project-name']

App Engine 配置app.yaml:

runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app

最后是main.go: https://github.com/GoogleCloudPlatform/golang-samples/blob/master/appengine/helloworld/hello.go

我知道部署步骤现在非常幼稚,甚至不需要前面的 2 个步骤。咨询cloud app 帮助,我无法查看deploy 步骤是否可以接受外部工件。

部署步骤失败:

failed analyzing /workspace: cannot find package "google.golang.org/appengine" in any of:
    ($GOROOT not set)
    /builder/home/go/src/google.golang.org/appengine (from $GOPATH)
GOPATH: /builder/home/go

我正在寻找 2 个解决方案:

  1. 理想情况下,能够将工件构建到 project-artifacts 存储桶中并使用部署步骤进行部署
  2. 如果这不可能,我至少需要知道如何在部署容器中运行 gcloud components install app-engine-go,这样它就不会因缺少依赖项而失败。

【问题讨论】:

  • 嗯......有趣的问题。我没有尝试将 Cloud Build 与 App Engine 结合使用,但您强迫我尝试一下。根据经验,我发现cloud-builders/go 难以配置。我会去报告!
  • 这是一个使用 Cloud Build 部署 App Engine 示例应用 (gist.github.com/DazWilkin/05984055d6e80cfcab6258b3da85e30a) 的示例。如前所述,我发现 Go 构建具有挑战性,但这只是反映了 Cloud Build 容器上的本地 go 结构,然后从 src 目录进行部署。
  • IIUC 使用artifacts 上传目录,您要么需要添加 zip 步骤并上传 zip,要么枚举所有文件。或者,您可能希望删除 artifacts 并添加 gsutil 构建步骤以递归复制您的工件。
  • 您分享的要点帮助我完成了部署工作。但是我从我的项目文件夹运行部署,该文件夹已经位于 go src 文件夹的深处。这意味着我所有的来源都在容器中的/workspace 中。我通过将我的资源移动到./app 子文件夹来暂时破解它。非常感谢您花时间尝试这个!

标签: google-app-engine go google-cloud-platform google-cloud-build


【解决方案1】:

在构建目录之外使用 GOPATH (/workspace)。例如,/gopath

此外,由于默认情况下在 Cloud Build 步骤之间仅保留 /workspace,因此您必须将 GOPATH 放入一个卷中。

以下完整示例对我有用:

steps:

- name: 'gcr.io/cloud-builders/go'
  args: ['get', '-d', './...']
  env: ['GOPATH=/gopath']
  volumes:
  - name: 'go'
    path: '/gopath'

- name: 'gcr.io/cloud-builders/gcloud'
  args: ['app', 'deploy']
  env: ['GOPATH=/gopath']
  volumes:
  - name: 'go'
    path: '/gopath'

此外,我必须将 App Engine Admin 角色授予 IAM 中的 Cloud Build 服务帐号,才能在 Cloud Build 中成功执行 gcloud app deploy 步骤。

【讨论】:

  • 这很好用,谢谢 Jeremy,我认为这个解决方案的缺点是需要在构建器图像参数中指定每个非标准依赖项。
  • 实际上通配符也可以工作(刚刚测试过)。我已经更新了我的答案,因为我同意它更简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2019-12-04
  • 2021-08-29
相关资源
最近更新 更多