技術(tech)

CircleCIのOrb(aws-ecr)でbuild資材のpath指定を変えたい

標記の通り、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 を検索できます。

https://circleci.com/docs/ja/orb-intro/

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