標記の通り、CircleCIのOrb(aws-ecr)を使っていて、build資材をルートディレクトリではなく別のディレクトリに置いていたので、build資材のpath指定を変えたくなりました。
build-pathをどっかで渡せばいいんだよね?と思ってやってみたら、ハマったので記事にまとめました。
前提
- circleci 2.1
- circleci/aws-ecr@8.2.1
やりたいこと
CircleCIのOrb(aws-ecr)の処理(build-and-push-image)の際に、build資材のpath指定をルートディレクトリではなく、指定のディレクトリに変更したいです。
Orbとは?
Orb は、再利用可能なコードスニペットです。Orb を使用すると、繰り返しのプロセスを自動化でき、手早くプロジェクトをセットアップできます。サードパーティ製ツールとの連携も容易になります。 CircleCI Developer Hub の CircleCI Orb レジストリでは、設定作業の簡素化に役立つ Orb を検索できます。
AWSのECRのドキュメントに従って、コマンドを書いていくでもいいのですが、
特に要件とか気にしないなら、CircleCIのOrbに従うだけで、Build/Pushの処理を簡単に実装出来ます。
例えば、docker buildやdocker pushコマンドをガリガリ書かなくても、
引数を渡してメソッドを実行する感覚で、ECRへのPushまで出来てしまいます。
version: 2.1
orbs:
aws-ecr: circleci/aws-ecr@8.2.1
workflows:
build-and-deploy:
jobs:
- aws-ecr/build-and-push-image:
context:
- CIRCLECI_SAMPLE_CONTEXT
repo: "${AWS_RESOURCE_NAME_PREFIX}"
tag: "${CIRCLE_SHA1}"
dockerfile: "Dockerfile"
今回問題となったケース
Build資材がルートディレクトリには無く、サブディレクトリに存在するパターンです。
~/D/l/c/sample ❯❯❯ tree
.
├── hogehoge.txt
└── side-app
├── Dockerfile
├── node_modules
└── yarn.lock
この場合、DockerfileのpathとBuild資材のPathをパラメータとして渡す必要があります。
aws-ecrのドキュメントを見てみると、以下のパラメータが渡せるようです。
- path: Path to the directory containing your Dockerfile and build context.
- build-path: Path to the directory containing your build context.
設定してみる。
version: 2.1
orbs:
aws-ecr: circleci/aws-ecr@8.2.1
workflows:
build-and-deploy:
jobs:
- aws-ecr/build-and-push-image:
context:
- CIRCLECI_SAMPLE_CONTEXT
repo: "${AWS_RESOURCE_NAME_PREFIX}"
tag: "${CIRCLE_SHA1}"
dockerfile: "Dockerfile"
path: "./side-app"
build-path: "./side-app"
構文チェックしてみると…
~/D/l/c/sample ❯❯❯ circleci config validate
Error: Error calling workflow: 'build-and-deploy'
Error calling job: 'aws-ecr/build-and-push-image'
Unexpected argument(s): build-path
あれ、build-pathが渡せない…???
よくよくドキュメントを見てみると、
Jobs > build-and-push-image には、build-pathのパラメータが無い。
Commands > build-and-push-image には、build-pathのパラメータがある。
つまり、workflowからjobとして呼び出す際には、build-pathが指定できず、
jobからcommandとして呼び出さなければならないわけです。
解決策
jobからOrbのbuild-and-push-imageコマンドを呼び出します。
version: 2.1
orbs:
aws-ecr: circleci/aws-ecr@8.2.1
jobs:
aws-build-and-push:
docker:
- image: cimg/base:current
steps:
- setup_remote_docker:
version: 20.10.2
docker_layer_caching: true
- aws-ecr/build-and-push-image:
repo: "${AWS_RESOURCE_NAME_PREFIX}"
tag: "${CIRCLE_SHA1}"
dockerfile: "Dockerfile"
path: "./side-app"
build-path: "./side-app"
workflows:
build-and-deploy:
jobs:
- aws-build-and-push:
context:
- CIRCLECI_SAMPLE_CONTEXT
これならOKなわけですね。
これが分かるまで紆余曲折あったのですが、半日は潰しました。
おわりに
build-pathを渡せるようになったのもつい最近(v8.2.0から)です。
リリースノートに記載があります。
PRはこちら:https://github.com/CircleCI-Public/aws-ecr-orb/pull/251
This PR adds the build-path parameter to the docker-build-and-push-image command and job along with the build-image command. This enables users to specify the path of the build directory in the case that it differs from the path to the Dockerfile.
この PR は、build-image コマンドとともに、build-path パラメーターを docker-build-and-push-image コマンドとジョブに追加します。 これにより、ビルド ディレクトリのパスが Dockerfile へのパスと異なる場合に、ユーザーはそのパスを指定できます。
やっぱり同じ悩みを抱える方が居たんですね。
>This PR adds the build-path parameter to the docker-build-and-push-image command and job
Jobにも追加されているの?
動いてないような…?
Issue切るか。
ここまで読んでいただきありがとうございました。
追記 2023/09/23
以下のIssueがCloseされ、この問題は解決しているようです。
https://github.com/CircleCI-Public/aws-ecr-orb/issues/257
PR: https://github.com/CircleCI-Public/aws-ecr-orb/pull/276