盆栽のテストを書くのに Cloud Datastore エミュレータ が必要になったので、GitHub Actions で利用してみた。
大きく分けて方法は2つある。
ジョブ中で明示的に gcloud beta emulators datastore start
する
setup-gcloud というアクションで gcloud コマンドをインストールできる。これを使う方法。
このままでは必要なコンポーネントはついてこないので、加えて gcloud components install
する必要がある。
また、エミュレータが起動したのを待つために、curl を --retry-connrefused つきで利用する、というわけで以下のようになる(全景はこちら)。
- run: | gcloud components install cloud-datastore-emulator --quiet gcloud components install beta --quiet - run: | gcloud beta emulators datastore start --project prchecklist-test & curl http://localhost:8081 --silent --retry 30 --retry-connrefused --retry-delay 1 - run: | eval $(gcloud beta emulators datastore env-init) ...
サービスコンテナを使う
上記の方法でもいいんだけど、本質的でないことに行数を費やしてしまっている気がしてしまってどうもよろしくない。
GitHub Actions にはサービスコンテナという概念があって、ジョブで利用したいサービスを宣言的に指定できるらしい。MySQL とか Redis とか使うならこれだろうから、Datastore もこれにしたい。
サービスコンテナは Docker イメージを起動するかたち。オフィシャルに google/cloud-sdk ってイメージがあって、これで gcloud
コマンドを利用できるんだけど、見るかぎり GitHub Actions のサービスコンテナでは今のところ CMD を外から指定できないようなので、エミュレータを起動する CMD をもったイメージを作る必要がある。
雑に検索してみた感じだと、ベースのバージョンに追従しつつ信用できそうな(=リポジトリと連携して automated build が有効になってそうな)やつがないので自作する。ただ書いてみたかっただけかもしれない。
https://hub.docker.com/r/motemen/datastore-emulator
google/cloud-sdk に CMD と HEALTHCHECK を足しただけ。これを使うと、以下のように書けてスッキリした(全景)。
services: datastore-emulator: image: motemen/datastore-emulator ports: - '8081:8081' env: CLOUDSDK_CORE_PROJECT: ...
そして
書いていたらまったく同じ課題を解決しようとしている記事をはっけんしました……(これを読んで自分の actions 設定を手直しした)。