Не удалось использовать директиву replace в gcp cloudbuild

Я пытаюсь создать свое приложение go, используя serverless framework в облачной сборке.

Вот моя структура проекта

/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.mod в api/giam

module mybackend

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

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

и я подтвердил, что у меня в папке util есть go.mod.

и вот содержание

module util

require cloud.google.com/go v0.37.1

Ошибка

Я получил эту ошибку при запуске облачной сборки ..

{"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 в облачной сборке, особенно в /workspace/util, и нашел go.mod файл.

Я здесь довольно застрял ... Я не знаю, что делать дальше ...


person kkesley    schedule 20.03.2019    source источник
comment
попробуйте /workspace/util = ›../../util   -  person beiping96    schedule 20.03.2019
comment
@ beiping96 Я пробовал это, но папка стала /util/go.mod Думаю, это из-за PROJECT_ROOT=${REPO_NAME} env в конфигурации облачной сборки   -  person kkesley    schedule 20.03.2019


Ответы (1)


Мне удалось заставить его работать, используя 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

в соответствии с проблемой github в https://github.com/GoogleCloudPlatform/golang-samples/issues/743, в нем говорится, что вам нужно исключить go.mod и go.sum из развертывания, иначе поставщик не будет использоваться. Поэтому в serverless.yml я использую:

package:
  exclude:
    - ./**
  include:
    - vendor/**
    - '*.go'
person kkesley    schedule 20.03.2019