Как аутентифицировать частный модуль Go с помощью go 1.11 и Google App Engine Standard - PullRequest
0 голосов
/ 07 декабря 2018

Я обновлял весь свой стандартный проект go gae, чтобы использовать модули go 1.11.

Структура основного каталога

app.yaml
app.go
go.mod
go.sum

app.go

package main

import "bitbucket.org/myPrivateRepo"

func main() {
    myImportantModule.Run()
}

go.mod

module myProject

require bitbucket.org/myPrivateRepo v0.0.1

Ошибка

Если я пытаюсь развернуть приложение gcloud:

ERROR: (gcloud.app.deploy) Error Response: [9] Cloud build <GUI> 
status: FAILURE.
Build error details: go: bitbucket.org/myPrivateRepo@v0.0.1: 
https://api.bitbucket.org/2.0/repositories/myPrivateRepo?fields=scm: 
403 Forbidden

(Примечание: очевидно, репо яИспользование имеет реальное имя).

Так я могу сделать это таким образом?Я признаю, что не полностью понимал документацию по миграции, особенно когда речь шла о «Перемещении файлов на вашу GOPATH».https://cloud.google.com/appengine/docs/standard/go111/go-differences

Я имею в виду, я думал, что одно из преимуществ новой модульной системы заключается в том, что вам не нужно все, что вам нужно.Например, когда я читаю https://github.com/golang/go/wiki/Modules, он очень рано говорит: «Создайте каталог вне вашей GOPATH:»

Итак, чтобы быть ясным, сейчас весь мой код находится вне пути перехода, но все строится локально просто отлично.

Я думаю, что все работает, потому что go автоматически загружает и кэширует вещи в пути go, когда я запускаю go mod tidy / go build и т. д.Я пытаюсь развернуть приложение gcloud.Как бы облачная система сборки Google могла когда-либо иметь доступ к моим личным репозиториям?Я явно упускаю что-то важное.Я также читал, что вы не должны сочетать вендорство с новой модульной системой, так что этого не может быть.

Я буду очень рад, если это сработает, поскольку использование DEP вынудило меня использовать развертывание goapp очень неловко.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Мое решение:

Вместо того, чтобы иметь дело с учетными данными, я использую функциональность замены модуля go, чтобы указать GAE на использование моего локального кода.Это работает хорошо.

Структура каталогов:

myService/
    src/
        service.go  // has a run() function to set up routers etc.
        go.mod      // depends on my private module in bitbucket and other things
        …           // other source files
    build/
        gae/
            src/        // simlink to ../../src
            modules/    // git ignored, I clone or copy my modules in build scripts.
            app.go  // see below…
            go.mod  // has main() which calls service.run() and appEngine.Main()
            app.yaml

Метод

Я использую замену модуля git, чтобы GAEиспользует мой локальный код.Перед сборкой я анализирую myService / src / go.mod, чтобы найти правильную версию моего частного модуля, а затем клонирую ее в папку модулей.Я также сделал возможность скопировать исходный код модуля wip для локальной отладки без фиксации в репозитории моего модуля.

go.mod из каталога gae:

module myServiceGAE

require (
    bitbucket.org/me/myService v0.0.0
    google.golang.org/appengine v1.4.0
)

replace bitbucket.org/me/myService => ./src

replace bitbucket.org/me/myModule => ./modules/utils

Плюсы

Пакет под myService не имеет ссылок или знаний о GAE, поэтому я легко могу встроить его в докер и т. Д. Я думаю, что парсинг файлов go.mod службы был бы похож на создание моего собственного менеджера зависимостей, исключающего преимуществаиз модулей go.

Минусы

Если бы у меня был приватный модуль, который зависел от другого приватного модуля, я думаю, что все было бы слишком сложно.

0 голосов
/ 07 декабря 2018

Установка учетных данных git перед развертыванием:

git config credential.helper '!f() { sleep 1; echo "username=${GIT_USER}\npassword=${GIT_PASSWORD}"; }; f'

export GIT_USER=put_git_user_here
export GIT_PASSWORD=put_git_password_here

gcloud app deploy
...