この記事は
YAMAP エンジニア Advent Calendar 2020 の 17 日目になる予定です。
頑張るぞ。
tl;dr
ECS にアプリケーションのデプロイする際に利用している ecs-deploy というコマンドラインツールをインストールする CircleCI orbs を作ったので共有させて頂きます。
ecs-deploy とは
ECS のタスク定義を作成して、サービスを更新するコマンドラインツールです。AWS CLI が必要になります。
ecs-deploy は色々なプロジェクトで利用していますが、各プロジェクトにて、ecs-deploy の最新のバージョンに追従出来ていないという課題を抱えています。
CircleCI orbs とは
CircleCI のワークフローで実行する各種ジョブをまとめて再利用出来るようにしたものです。
作ったもの
そして、リリースした orbs は以下の通りです。
以下のように利用します。
--- version: 2.1 orbs: aws-cli: circleci/aws-cli@1.3.1 ecs-deploy: inokappa/ecs-deploy-install@0.0.1 jobs: build: docker: - image: cimg/base:2020.01 steps: - aws-cli/install - ecs-deploy/install: version: 3.8.0 # latest: true - run: name: Get AWS CLI Version command: | aws --version - run: name: Get ecs-deploy Version command: | ecs-deploy --version - run: command: | ecs-deploy --cluster your-ecs-cluster \ --image your-container-image \ --service-name your-ecs-service-name \ --region ap-northeast-1 \ --timeout 300 \ --enable-rollback
latest:true
を付与することで, 常に最新の ecs-deploy がインストールされます. また, version: x.x.x
を指定することで任意の ecs-deploy バージョンをインストールすることが出来ます。
これまでは .circleci/config.yml の中で、以下のように ecs-deploy をインストールする各種ステップを記述していましたが、この orbs を利用することで記述する必要がなくなり、.circleci/config.yml が少しだけシンプルに保つことが出来ます。
これまでの .circleci/config.yml は以下の通りです。
version: 2.1 executors: default: docker: - image: docker:18.06.3-ce-git commands: setup_ecs_deploy: steps: - run: name: Setup ecs-deploy command: | latest=$(curl -s 'https://api.github.com/repos/silinternational/ecs-deploy/tags' | jq -r '.[].name' | head -1 || true) curl -s https://raw.githubusercontent.com/silinternational/ecs-deploy/${latest}/ecs-deploy | tee -a /usr/local/bin/ecs-deploy \ && chmod +x /usr/local/bin/ecs-deploy jobs: deploy: executor: default steps: - checkout - setup_remote_docker: docker_layer_caching: true ... - setup_ecs_deploy ...
orbs を利用した場合の .circleci/config.yml は以下の通りとなります。
version: 2.1 executors: default: docker: - image: docker:18.06.3-ce-git orbs: ecs-deploy: inokappa/ecs-deploy-install@0.0.1 jobs: deploy: executor: default steps: - checkout - setup_remote_docker: docker_layer_caching: true ... - ecs-deploy/install ...
commands.setup_ecs_deploy
が丸っと無くなっているので, .circleci/config.yml が少しだけシンプルになりました。
デモ
以下のようにインストールされていることを確認出来ました。
orbs の実装について
シンプルという名の泥臭さ
orb の実装は以下のように YAML の中にシェルスクリプトを書いていく必要があります。シェルスクリプト自体はシンプルなんですが、結構な泥臭い印象が否めません。
--- description: | Installing ecs-deploy. ... steps: - run: name: "Check dependent command exists." command: | set +e for cmd in curl jq sudo do which ${cmd} > /dev/null 2>&1 if [ ! $? -eq 0 ];then wocho "Please Install ${cmd} command." exit 1 fi done ...
circleci/orb-tools
circleci/orb-tools という orbs が orb を実装するにあたって有益なので紹介させて頂きます。
https://circleci.com/orbs/registry/orb/circleci/orb-tools
orb の検証やデプロイまで支援してくれる orbs です。今回リリースした orb でも、以下のように .circleci/config.yml に書いています。
--- version: 2.1 orbs: orb-tools: circleci/orb-tools@9.1.1 workflows: lint_pack_test_publish-dev: jobs: - orb-tools/lint - orb-tools/pack: requires: - orb-tools/lint - orb-tools/test-in-builds: name: test-latest-version attach-workspace: true orb-name: ecs-deploy test-steps: - orb-tools/local-test-build: test-config-location: test/latest.yml requires: - orb-tools/pack - orb-tools/test-in-builds: name: test-specify-version attach-workspace: true orb-name: ecs-deploy test-steps: - orb-tools/local-test-build: test-config-location: test/version.yml requires: - test-latest-version - orb-tools/publish-dev: orb-name: inokappa/ecs-deploy-install requires: - test-specify-version
YAML の Lint チェックや orb.yaml の生成、circleci コマンドを使った orb.yml のローカルテストまで実行しています。orb-tools はこれ以外にもまだまだ色々と機能が提供されており、テスト以外にも orbs Registry への Publish も出来たりするようですが、今回は利用していませんでした。
以上
素敵な CircleCI orbs 生活をお過ごしください。
注意
名称として Orbs なのか Orb なのか、どちらが正しいのか判っていない為、本記事中でも Orbs と Orb の両方が書かれていますが、ご容赦ください。