GCPのCloud Buildを使って、Githubのリポジトリへのプッシュをトリガーに、自動ビルドしてGAEにdeployする流れを作ろうと思ったら、色々苦労したところがあったので、メモを残す。
(1)そもそもリポジトリに接続できない
Source RepositoriesでGitHubのリポジトリを選んで「選択したリポジトリを接続」を押しても、1分くらいぐるぐる待ったあとに「リポジトリに接続できませんでした」というエラーメッセージが出てくる。
Private Repositoryだからダメなのか?と思ってPublicを選んでみても同様。
どうすりゃいいんだよと思っていたところ、とりあえず空っぽのリポジトリを1つ新規に作成すれば、内部的な何かのフラグがONになって接続できるようになるらしいとのことで。
実際、空リポジトリつくったあとは同様の操作で接続できた。
これGCPのバグでは。。。
(2)トリガーが動かない
GitHubにpushしてもトリガーが起動しない。
トリガーを手動で実行したところ Couldn't read commit というエラーメッセージ。
これは、Cloud Buildのトリガーの画面で「リポジトリを接続」していなかったから。
以下スクショの赤枠から操作する。
この操作後、トリガーの設定画面で、リポジトリの項に「GitHub」とは別に「GitHubアプリ」というのが選べるようになる。
これを選択してトリガーを作る。
(3) Permission errors
(3)-1. Permission 'cloudbuild.builds.create' denied
generic::permission_denied: goa-auth: Permission 'cloudbuild.builds.create' denied on resource 'projects/1234567890abcdef' (or it may not exist) というエラーが発生。( projects/1234567890abcdef
の部分は変えてあります)
とりあえずCloud Buildの管理権限つければいいのかと思い、トリガーの実行Service Accountにロールを付与した。
そしたらまた別のエラーが発生
(3)-2. if 'build.service_account' is specified, ...
generic::invalid_argument: generic::invalid_argument: if 'build.service_account' is specified, the build must either (a) specify 'build.logs_bucket' (b) use the CLOUD_LOGGING_ONLY logging option, or (c) use the NONE logging option というエラーが発生。
「トリガーを実行するService Accountは(a)か(b)か(c)のログ権限のいずれかだけ持ってりゃいい」ということのようで、平たく言えば「余分な権限もちすぎ」だと怒られているようだ。
これは実際その通りで、トリガーを実行するService Accountを個別に指定していて、かつそのService Accountがかなり色々できる強い権限をもったService Accountだったからだった。
ここを意図的に選択した場合、上記のように厳密なPermissionのチェックがかかるようだ。
未指定の場合は [projectid]@cloudbuild.gserviceaccount.com というService Accountが使われるらしいので、特に理由がない限りは、トリガーの実行Service Accountは指定せず、デフォルトのService Account [projectid]@cloudbuild.gserviceaccount.com にロールを付与していった方が良い。
というわけでこの枠を未指定にし、デフォルトのService Accountで実行してもらうように変更。
ついでに、IAMの設定画面でこのService Accountに「App Engineデプロイ担当者」のロールを付与。
最後にまた別のエラーが発生。。。
(3)-3. You do not have permission to act as ...
You do not have permission to act as '[project name]@appspot.gserviceaccount.com' というエラーが発生。
これはこちらの記事が参考になった。
トリガーの設定で「App Engine」と「Service Accounts」を有効にする。
おわりに
なかなか大変な作業だった。。。
GitHubにpushさえすれば、あとはビルド・デプロイまでいい感じでやってくれる他のPaaS系サービスを触っていると、なんという面倒くさい作業なのだと感じる部分は、正直ある。
まあでも構築できてしまいさえすれば後は楽なものなので。
このメモを屍として残すことで振り返りは終わりにする。