Как запустить облачную функцию Google с использованием Go с зависимостями в частных репозиториях? - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь адаптировать пример Go из этого учебника к чему-то, что использует зависимости в частном репозитории. Вот пример кода облачной функции:

package helloworld

import (
    "context"
    "log"

    "github.com/kurtpeek/my-private-repo/mypackage"
)

// PubSubMessage is the payload of a Pub/Sub event.
type PubSubMessage struct {
    Data []byte `json:"data"`
}

// HelloPubSub2 consumes a Pub/Sub message.
func HelloPubSub2(ctx context.Context, m PubSubMessage) error {
    name := string(m.Data)
    if name == "" {
        name = "World"
    }
    log.Printf("Hello, %s!", name)
    log.Println(mypackage.SayHello())
    return nil
}

, где SayHello() определен в частном репо github.com/kurtpeek/my-private-repo как

package mypackage

// SayHello says hello
func SayHello() string {
    return "Hello, world!"
}

Без вызова mypackage.SayHello() облако Функция развертывается и работает должным образом. Я также могу запустить HelloPubSub2 в main.go после запуска

git config url."git@github.com".insteadOf "https://github.com"

и добавления моего ключа S SH в репо (см. Эту Средняя статья ) .

Однако, если я попробую его с mypackage.SayHello(), я получаю следующую ошибку:

не удалось прочитать имя пользователя для 'https://github.com'

Вот полный вывод терминала:

> 
gcloud functions deploy HelloPubSub2 --runtime go113 --trigger-topic mytopic
Created .gcloudignore file. See `gcloud topic gcloudignore` for details.
WARNING: Function created with limited-access IAM policy. To enable unauthorized access consider "gcloud alpha functions add-iam-policy-binding HelloPubSub2 --member=allUsers --role=roles/cloudfunctions.invoker"
Deploying function (may take a while - up to 2 minutes)...failed.                                              
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: {"error":{"buildpackId":"google.go.functions-framework","buildpackVersion":"0.9.0","errorType":13,"canonicalCode":13,"errorId":"03a1e2f7","errorMessage":"go: github.com/kurtpeek/my-private-repo@v0.0.0-20200508055124-8eb94cb388b2: invalid version: git fetch -f origin refs/heads/*:refs/heads/* refs/tags/*:refs/tags/* in /layers/google.go.functions-framework/functions-framework/pkg/mod/cache/vcs/93c0b37d34e5cf0f9b9778b99e5968bf272c89cabd21f8c0d683212c8dd2ef89: exit status 128:\n\tfatal: could not read Username for 'https://github.com': terminal prompts disabled"},"stats":null}

Как лучше всего развернуть эту облачную функцию? Следует ли мне запустить go mod vendor, а затем изменить зависимости, чтобы они ссылались на каталог vendor/? (Хотя каждый раз это кажется хлопотным).

Обновление

Эта документация, https://cloud.google.com/functions/docs/writing/specifying-dependencies-go#using_private_dependencies, касается именно этого варианта использования. Однако я еще не смог заставить его работать. Я добавил

go.mod
go.sum

в свой .gcloudignore и запустил go mod vendor, тем самым создав каталог vendor/, но если я попытаюсь развернуть его снова, теперь я получаю

не может найти пакет \ "github.com/kurtpeek/my-private-repo/mypackage \" ни в одном из: \ n \ t / usr / local / go / src / github.com / kurtpeek / my-private- repo / mypackage (из $ GOROOT) \ n \ t / workspace / src / github.com / kurtpeek / my-private-repo / mypackage (из $ GOPATH) "

~/g/s/g/k/m/helloworld> 
gcloud functions deploy HelloPubSub2 --runtime go113 --trigger-topic mytopic
Deploying function (may take a while - up to 2 minutes)...failed.                                            
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: {"error":{"buildpackId":"google.go.build","buildpackVersion":"0.9.0","errorType":2,"canonicalCode":2,"errorId":"6191efcd","errorMessage":"src/helloworld/helloworld.go:7:2: cannot find package \"github.com/kurtpeek/my-private-repo/mypackage\" in any of:\n\t/usr/local/go/src/github.com/kurtpeek/my-private-repo/mypackage (from $GOROOT)\n\t/workspace/src/github.com/kurtpeek/my-private-repo/mypackage (from $GOPATH)"},"stats":null}

Я запускаю это внутри своего GOPATH:

kurt@Kurts-MacBook-Pro-13 ~/g/s/g/k/my-cloud-function> go env GOPATH
/Users/kurt/go
kurt@Kurts-MacBook-Pro-13 ~/g/s/g/k/my-cloud-function> pwd
/Users/kurt/go/src/github.com/kurtpeek/my-cloud-function

Есть идеи, как это исправить?

1 Ответ

1 голос
/ 08 мая 2020

Я нашел ответ (от инженера Google, работающего над этим продуктом) здесь , а также Ошибка при попытке развернуть облачную функцию Google в Go 1.11 с использованием модулей go . Ключевым моментом является то, что gcloud functions deploy копирует только содержимое каталога, в котором оно запущено, в «контекст» облачной функции, поэтому каталог vendor/ должен находиться в этом каталоге. В то же время я заметил, что package не может быть main, поэтому я предпринял несколько необычный шаг, удалив go.mod из каталога root репозитория и запустив go mod init и go mod vendor в helloworld каталог. Теперь работает:

> 
gcloud functions deploy HelloPubSub2 --runtime go113 --trigger-topic mytopic
Deploying function (may take a while - up to 2 minutes)...done.                                                         
availableMemoryMb: 256
entryPoint: HelloPubSub2
eventTrigger:
...
...