GlobalのCircleCIで動作実績のあるaws-ecrでのデプロイJobがCircleCI Enterpriseの環境では動作しないという現象に遭遇しました。
エラーメッセージは以下
Build-agent version 1.0.114877-701271cf (2022-03-15T13:07:16+0000)
Creating a dedicated VM with ubuntu-2004:202010-01 image
failed to create host: Image ubuntu-2004:202010-01 is not supported
failed to create host: Image ubuntu-2004:202010-01 is not supported
どうやら使用しようとしているDocker Imageがサポートされていないと言われているようです。
調査
CircleCI Enterpriseは今回初めて利用しましたが、これはGitHub Enterprise同様企業のローカルネットワーク内にCircleCIのサーバーをまるごと立てたもの、と理解しています。
GlobalでのCircleCIは世界中からのCIリクエストをさばくために膨大なマシンパワー/リソースを使用していると想像しますが、企業内からのリクエストだけを捌けば良いCircleCI Enterpriseでは同等のリソースが必要なわけではなく、規模に応じたリソース割当が行われていると思われます。(今回、ゲスト的な立場だったので実際のところどうなのかは聞けておらず、半分は想像です。)
特に拡張機能などはサポートするためにはサーバ側に色々とインストールする必要があって、それなりにストレージを消費すると思われるのでサポート範囲は限定的になっているんじゃないかと思います。
実際、aws-ecrのドキュメントにリストアップされているバージョンをいくつか試しましたが、7.3.0と8.1.2以外は
Cannot find circleci/aws-ecr@6.15.3 in the orb registry. Check that the namespace, orb name and version are correct.
と、orbが見つからないというエラーになりました。
まぁaws-ecrだけでもバージョンは30個以上ありますし、はるか昔の0.xバージョンを置いておいてもストレージの無駄遣いでしかないと思うので、この辺を限定するのは妥当だと思います。
同様にDockerImageやDockerEngineのバージョンなどもある程度限定されているようです。
解決
aws-ecrのドキュメントによるとbuild-and-push-image
のパラメータでexecutor
やremote-docker-version
を指定できるので、これらを指定することで動作しました。
こちらで動作した設定は以下
executors:
custom-ecr:
docker:
- image: cimg/base:2021.07
...
- aws-ecr/build-and-push-image:
...
executor: custom-ecr
setup-remote-docker: true
remote-docker-version: default
前述の通り、環境によってサポートされているDockerImage/DockerEngineVersionは違うと思うので、この設定がすべてのCircleCI Enterprise環境で動作するとは限りません。
ちなみにremote-docker-version
についてはCircleCIのdocker versionドキュメントに載っているバージョンを片っ端から試しましたが、どれ一つ動作せず。。。
最終的にdocker buildが動作している別のリポのCIの実行ログと見比べてdefault
が使えるらしいらしいということがわかって、それでようやく動作しました。
思うに、これaws-ecrが変にこの辺のパラメータのデフォルト値を細かく指定しているせいで発生する現象なんですよね。。。
例えばこの辺
本家のCircleCIでdefault
という値が有効かどうかわからないのと、パラメータの指定で回避可能であるのでIssueはあげませんでしたが、もうちょっとわかりやすくならないものか?とも思います。