ようへいの日々精進XP

よかろうもん

ecs-deploy をインストールする CircleCI orbs をリリースしていました 〜誰も使ってないけど〜

この記事は

YAMAP エンジニア Advent Calendar 2020 の 17 日目になる予定です。

qiita.com

頑張るぞ。

tl;dr

ECS にアプリケーションのデプロイする際に利用している ecs-deploy というコマンドラインツールをインストールする CircleCI orbs を作ったので共有させて頂きます。

ecs-deploy とは

ECS のタスク定義を作成して、サービスを更新するコマンドラインツールです。AWS CLI が必要になります。

github.com

ecs-deploy は色々なプロジェクトで利用していますが、各プロジェクトにて、ecs-deploy の最新のバージョンに追従出来ていないという課題を抱えています。

CircleCI orbs とは

CircleCI のワークフローで実行する各種ジョブをまとめて再利用出来るようにしたものです。

circleci.com

作ったもの

そして、リリースした orbs は以下の通りです。

github.com

以下のように利用します。

---
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 が少しだけシンプルになりました。

デモ

以下のようにインストールされていることを確認出来ました。

f:id:inokara:20201216093621p:plain

f:id:inokara:20201216093640p:plain

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 の両方が書かれていますが、ご容赦ください。