首页 > 解决方案 > 在 gcp cloudbuild 中使用“replace”指令失败

问题描述

我正在尝试使用serverless frameworkcloudbuild 构建我的 go 应用程序。

这是我的项目结构

/api
   /giam
      go.mod
      API.go
   /other_folders...
/util
   go.mod
   util.go

这是我的构建步骤:

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']
- name: 'softinstigate/serverless'
  args: ['deploy', '-v']
  dir: 'api/giam'
  env: ['PROJECT_ROOT=${REPO_NAME}', 'GO111MODULE=on']

这是我go.modapi/giam

module mybackend

require bitbucket.org/myusername/mybackend/util v0.0.0

replace bitbucket.org/myusername/mybackend/util => /workspace/util

我确认go.mod我的util文件夹中有一个。

这是内容

module util

require cloud.google.com/go v0.37.1

错误

运行 cloudbuild 时出现此错误..

{"ResourceType":"cloudfunctions.v1beta2.function","ResourceErrorCode":"400","ResourceErrorMessage":"Build failed: go: parsing util/go.mod: open /workspace/util/go.mod: no such file or directory\ngo: error loading module requirements\n"}

如果我做对了,错误是它找不到/workspace/util/go.mod

ls在cloudbuild中尝试过,特别是在/workspace/util我找到了go.mod文件。

我很卡在这里..我不知道下一步该怎么做..

标签: gogo-modules

解决方案


我设法通过使用vendor和省略go.mod以及go.sum在无服务器包中(通过使用 package.exclude)使其工作。

这是我的更新cloudbuild.yaml

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']
- name: 'gcr.io/cloud-builders/go'
  dir: 'api/giam'
  args: ['mod', 'edit', '-replace', 'bitbucket.org/myusername/mybackend/util=/workspace/util']
  env: ['GOPATH=/src', 'GO111MODULE=on']
- name: 'gcr.io/cloud-builders/go'
  dir: 'api/giam'
  args: ['mod', 'vendor']
  env: ['GOPATH=/src', 'GO111MODULE=on']
- name: 'softinstigate/serverless'
  args: ['deploy', '-v']
  dir: 'api/giam'
  env: ['GOPATH=/src', 'GO111MODULE=on']

我的go.mod

module mybackend

require (
    bitbucket.org/myusername/mybackend/util v0.0.0
    google.golang.org/api v0.2.1-0.20190318183801-2dc3ad4d67ba
)

replace bitbucket.org/myusername/mybackend/util => ../../util

根据https://github.com/GoogleCloudPlatform/golang-samples/issues/743中的github问题,它说您需要在部署中排除 go.mod 和 go.sum ,否则将不会使用供应商。这就是为什么serverless.yml我使用:

package:
  exclude:
    - ./**
  include:
    - vendor/**
    - '*.go'

推荐阅读