Проблема с развертыванием Bitbucket Pipeline в Google App Engine

Я пытаюсь развернуть приложение golang на движке приложений. Теперь я могу сделать это через интерфейс командной строки gcloud на моем Mac, и это отлично работает (запуск приложения gcloud, развертывание app.yaml). Однако я получаю следующую ошибку в Bitbucket Pipelines:

+ gcloud --quiet --verbosity=error app deploy app.yaml --promote
You are about to deploy the following services:
 - some-project/default/20171128t070345 (from [/go/src/bitbucket.org/acme/some-app/app.yaml])
     Deploying to URL: [https://project-url.appspot.com]

Beginning deployment of service [default]...
ERROR: (gcloud.app.deploy) Staging command [/tmp/google-cloud-sdk/platform/google_appengine/goroot/bin/go-app-stager /go/src/bitbucket.org/acme/some-app/app.yaml /tmp/tmpLbUCA5] failed with return code [1].

------------------------------------ STDOUT ------------------------------------
------------------------------------ STDERR ------------------------------------
2017/11/28 07:03:45 failed analyzing /go/src/bitbucket.org/acme/some-app: cannot find package "github.com/gorilla/context" in any of:
    ($GOROOT not set)
    /go/src/github.com/gorilla/context (from $GOPATH)
GOPATH: /go
--------------------------------------------------------------------------------

Вот мой контент bitbucket-pipelines.yaml:

image: golang:onbuild

pipelines:
  branches:
    develop:
    - step:
        script: # Modify the commands below to build your repository.
          # Downloading the Google Cloud SDK
          - curl -o /tmp/google-cloud-sdk.tar.gz https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-155.0.0-linux-x86_64.tar.gz
          - tar -xvf /tmp/google-cloud-sdk.tar.gz -C /tmp/
          - /tmp/google-cloud-sdk/install.sh -q
          - source /tmp/google-cloud-sdk/path.bash.inc
          - PACKAGE_PATH="${GOPATH}/src/bitbucket.org/${BITBUCKET_REPO_OWNER}/${BITBUCKET_REPO_SLUG}"
          - mkdir -pv "${PACKAGE_PATH}"
          - tar -cO --exclude-vcs --exclude=bitbucket-pipelines.yml . | tar -xv -C "${PACKAGE_PATH}"
          - cd "${PACKAGE_PATH}"
          - go get -v
          - go get -u github.com/golang/dep/cmd/dep
          - go build -v
          - go install
          - go test -v
          - echo $GOOGLE_CLIENT_SECRET | base64 --decode --ignore-garbage > ./gcloud-api-key.json
          - gcloud auth activate-service-account --key-file gcloud-api-key.json
          - gcloud components install app-engine-go
          #- GOROOT="/tmp/go"
          # Linking to the Google Cloud project
          - gcloud config set project $CLOUDSDK_CORE_PROJECT
          # Deploying the application
          - gcloud --quiet --verbosity=error app deploy app.yaml --promote
          - echo $GCLOUD_API_KEYFILE | base64 --decode --ignore-garbage > ./gcloud-api-key.json
          #- gcloud auth activate-service-account --key-file gcloud-api-key.json

И хотя это не должно быть проблемой, поскольку развертывание в облаке работает нормально, мой файл app.yaml тоже:

runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app


nobuild_files:
- vendor

skip_files:
- |
  ^(.*/)?(
  (#.*#)|
  (.*\.mapping)|
  (.*\.po)|
  (.*\.pot)|
  (.*\.py[co])|
  (.*\.sw?)|
  (.*\.yaml)|
  (.*_test\.go)|
  (.*~)|
  (LICENSE)|
  (Makefile.*)|
  (\..*)|
  (vendor/.*)|
  )$

Я почти уверен, что моя проблема связана с тем, как мой файл bitbucket yaml или образ докера, с которого я начинаю, но я застрял. Есть предположения?


person ephilip    schedule 28.11.2017    source источник
comment
Типичная проблема, вызывающая сбои для автоматически выполняемых скриптов, заключается в отсутствии некоторой переменной среды, которая при успешном выполнении вручную каким-то образом устанавливается либо вручную, либо через какой-либо файл .rc. ($GOROOT not set) в сообщении об ошибке может указывать на это. Сравните ваши среды в двух случаях.   -  person Dan Cornilescu    schedule 28.11.2017
comment
Я не пользователь Go, поэтому я не уверен в этом: у вашего приложения есть некоторые внешние зависимости (/go/src/github.com/gorilla/context), которые могут уже доступны в системе, в которой выполняется развертывание вручную, но может потребоваться явное извлечение в конвейере битбакета.   -  person Dan Cornilescu    schedule 28.11.2017
comment
@DanCornilescu, я тоже так подумал и попытался установить GOROOT сам. однако строки не могут найти пакет github.com/gorilla/context ни в одном из: ($ GOROOT не установлен) /go/src/github.com/gorilla/context (из $ GOPATH) сообщает мне, что он действительно ищет (и находит ) что-то в моем GOPATH.   -  person ephilip    schedule 28.11.2017
comment
github.com/gorilla/context используется только в ваших тестовых файлах? Если это так, go get по умолчанию не получит тестовые зависимости. Что, если вы добавите go get github.com/gorilla/context исключительно в свой сценарий конвейера?   -  person PassKit    schedule 28.11.2017
comment
@PassKit использовался только в пакете Gorilla Mux. Однако ваше исправление сработало (клянусь, я пробовал это раньше, и это не сработало), добавив go get github.com/gorilla/context в мой конвейер. Это странное поведение, потому что на моем локальном компьютере этого тоже не было. В любом случае, если вы разместите свой комментарий в качестве ответа, я могу отметить его как правильный. Благодаря тонну   -  person ephilip    schedule 28.11.2017


Ответы (1)


github.com/gorilla/context используется только в ваших тестовых файлах?

go get, по умолчанию не будут получать тестовые зависимости.

Вы можете исключительно добавить go get github.com/gorilla/context в свой сценарий конвейера.

person PassKit    schedule 29.11.2017