概要
GithubActionsからGoのアプリケーションをGAEにデプロイしようとした時に、
依存関係でハマったことについて。
コードをそのままGAEにデプロイしただけでは依存エラーになる。
go get . ...
を実行すると必要なライブラリを全部取ってきてくれることは知っていたので、GAEにデプロイしたら勝手に上のコマンドを実行するものだと思っていた。
でもそうではないようだ。。。
エラー内容
cannot find package
普通に依存エラーですね
2020/03/29 12:38:43 Failed to build app: Your app is not on your GOPATH, please move it there and try again.
building app with command [go build -o /tmp/staging/usr/local/bin/start ./...], env [PATH=/go/bin:/usr/local/go/bin:/builder/google-cloud-sdk/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=581cc460cea4 HOME=/builder/home BUILDER_OUTPUT=/builder/outputs DEBIAN_FRONTEND=noninteractive GOROOT=/usr/local/go/ GOPATH=/go GOPATH=/tmp/staging/srv/gopath]: err=exit status 1, out=srv/command/SignUpRequestCommand.go:4:2: cannot find package "github.com/BambooTuna/quest-market/model/account" in any of:
/usr/local/go/src/github.com/BambooTuna/quest-market/model/account (from $GOROOT)
/tmp/staging/srv/gopath/src/github.com/BambooTuna/quest-market/model/account (from $GOPATH)
##[error]srv/model/account/AccountCredentials.go:4:2: cannot find package "github.com/BambooTuna/quest-market/settings" in any of:
/usr/local/go/src/github.com/BambooTuna/quest-market/settings (from $GOROOT)
/tmp/staging/srv/gopath/src/github.com/BambooTuna/quest-market/settings (from $GOPATH)
...
解決策
go.mod
をapp.yml
と同じところに作って置けばいいようだ
-
ファイル構成
GoApp / - main.go (アプリ本体のコード群) - app.yml (GAE用の設定ファイル) - go.mod <- これが必要
-
go.modの作成方法
$ go mod init example.com/m/v2 $ go get -v -t -d ./...
自分が使っているGithubActionsの設定
変更のたびにローカルでgo.mod
を作成・更新するのは面倒なので、デプロイ時に作ってしまおう。
以下コードに出てくる環境変数(GCLOUD_SERVICE_KEY)については
こちらを参考にしてください。
name: Go
on:
push:
branches: [ master ]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Set up Go 1.13
uses: actions/setup-go@v1
with:
go-version: 1.13
id: go
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Get dependencies
run: |
go mod init example.com/m/v2
go get -v -t -d ./...
if [ -f Gopkg.toml ]; then
curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
dep ensure
fi
- name: GAE deploy
run: |
sudo apt-get install google-cloud-sdk-app-engine-go
echo ${GCLOUD_SERVICE_KEY} | base64 -d > ./service_key.json
echo 'github-actions@${PROJECT_NAME}.iam.gserviceaccount.com' | gcloud auth activate-service-account --key-file ./service_key.json
gcloud app deploy app.yaml --project ${PROJECT_NAME}
env:
CI: true
PROJECT_NAME: あなたのプロジェクト
GCLOUD_SERVICE_KEY: ${{ secrets.GcloudServiceKey }}
おまけ(app.yaml)
runtime: go113
service: default
handlers:
- url: /.*
script: auto
コメント