CircleCI には、すばやく起動して実行できるように設計された Orbs と呼ばれる製品があり、CircleCI のテクノロジー パートナーが提供する信頼性の高い Orbs と DevOps ツールを簡単に統合できます。

この記事では、AWS ECR Orb をデモおよび説明し、CircleCI のコンフィグファイルでこの Orb を使用する方法を説明しま す。ここでは、CircleCI Workflows を活用し、Docker Hub および指定された AWS ECR にイメージをプッシュします。

CircleCI Orbs とは?

Orbs は、プロジェクト間で共有できる CircleCI コンフィグのパッ ケージです。Orbs を使用すると、ジョブ、コマンド、および Executor から構成される単一のバンドルを作成して、相互に参照した り、CircleCI ビルドコンフィグにインポートして独自のネームスペー スで呼び出したりすることができます。Orbs は CircleCI で登録さ れ、リビジョンは semver パターンを使用して表されます。CircleCI Orbs は、CircleCI Orbs の中央リポジトリである CircleCI Orbs オ ーブレジストリでホスティングおよび管理されます。

前提条件

Orbs の使用を始める前に、次のものが必要です。

すべての前提条件を完了したら、次のセクションに進みましょう。

CircleCI プロジェクトの環境変数の構成

プロジェクトの CI/CD パイプラインは、Docker イメージを複数のコンテナリポジトリにデプロイするため、CircleCI プロジェクト設定でいくつかの環境変数を設定する必要があり

  • 左側のメニューの CircleCI ダッシュボードで Add Project をクリックします。
  • プロジェクトリストで必要なプロジェクト名を見つけてクリックし、右側で Set Up Project をクリックします。
  • 右上の領域にある CircleCI ダッシュボードの Project cog ボタンをクリックします。
  • Build Settings セクションで、Environment Variables をクリックします。
  • Add Variable をクリックします。

Add an Environment Variable ダイアログボックスで、このビルドに必要ないくつかの環境変数を定義します。 定義する必要がある環境変数のリストを以下に示します。

  • 名前: AWS_ECR_ACCOUNT_URL 値: AWS ECR レジストリの URL
  • 名前: AWS_ACCESS_KEY_ID 値: AWS IAM アカウントのアクセスキー ID
  • 名前: AWS_SECRET_ACCESS_KEY 値: AWS IAM アカウントのシークレットをアクセスキー
  • 名前: DOCKER_LOGIN 値: Docker Hub のユーザー名
  • 名前: Docker_PWD 値: Docker Hub のユーザー名

ビルドを正常に完了するためには、これらの環境変数を正しく設定することが重要です。次のセクションに進む前に、これらの変数とその値が適切に設定されていることを確認してください。

CircleCI AWS ECR Orb の使用

以下は、このプロジェクトのパイプラインを定義する config.yml ファイルです。次のセクションでは、この config.yml ファイルのさまざまな要素について説明します。

version: 2.1

orbs:
  aws-ecr: circleci/aws-ecr@0.0.4

workflows:
  build_test_deploy:
    jobs:
      - build_test
      - docker_hub_build_push_image:
          requires:
            - build_test
      - aws-ecr/build_and_push_image:
          region: us-east-1
          account-url: ${AWS_ECR_ACCOUNT_URL}
          repo: ${CIRCLE_PROJECT_REPONAME}
          tag: ${CIRCLE_BUILD_NUM}
          requires:
            - build_test
jobs:
  build_test:
    docker:
      - image: circleci/python:2.7.14
    steps:
      - checkout
      - run:
          name: Setup VirtualEnv
          command: |
            virtualenv helloworld
            . helloworld/bin/activate
            pip install --no-cache-dir -r requirements.txt
      - run:
          name: Run Tests
          command: |
            . helloworld/bin/activate
            python test_hello_world.py
  docker_hub_build_push_image:
    docker:
      - image: circleci/python:2.7.14
    steps:
      - checkout
      - setup_remote_docker:
          docker_layer_caching: false
      - run:
          name: Build and push Docker image to Docker Hub
          command: |
            echo 'export TAG=0.1.${CIRCLE_BUILD_NUM}' >> ${BASH_ENV}
            echo 'export IMAGE_NAME=${CIRCLE_PROJECT_REPONAME}' >> ${BASH_ENV}
            source ${BASH_ENV}
            docker build -t ${DOCKER_LOGIN}/${IMAGE_NAME} -t ${DOCKER_LOGIN}/${IMAGE_NAME}:${TAG} .
            echo ${DOCKER_PWD} | docker login -u ${DOCKER_LOGIN} --password-stdin
            docker push ${DOCKER_LOGIN}/${IMAGE_NAME}

Workflows と Orbs の指定

orbs:
  aws-ecr: circleci/aws-ecr@0.0.4

orbs: キーは、このパイプラインで Orb が使用されることを指定します。aws-ecr: キーは、コンフィグで使用される内部名を定義します。 circleci/aws-ecr@0.0.4 の値は、aws-ecr: キーによって使用および参照される実際の Orb を指定して関連付けます。これらの Orb ステートメントは、他の言語およびフレームワークのインポートステートメントのようなものですす。

workflows:
  build_test_deploy:
    jobs:
      - build_test
      - docker_hub_build_push_image:
          requires:
            - build_test
      - aws-ecr/build_and_push_image:
          region: us-east-1
          account-url: ${AWS_ECR_ACCOUNT_URL}
          repo: ${CIRCLE_PROJECT_REPONAME}
          tag: ${CIRCLE_BUILD_NUM}
          requires:
            - build_test

Workflow の定義

workflows: キーは、ビルドジョブと Orbs で構成される Workflows のリストを指定します。このセグメントは、build_test_deploy: いう Workflow を指定します。

jobs:
  - build_test
  - docker_hub_build_push_image:
      requires:
        - build_test

このセグメントでは、jobs: キーが指定され、このパイプライン内で実行されるすべてのジョブと Orbs が記述します。このリストの最初のジョブは build_test であり、ジョブの依存関係はありません。

Orb の定義

Workflow リストの次のジョブである docker_hub_build_push_image: は、 後で説明するジョブを指していまが、docker_hub_build_push_image: ジョブが build_test ジョブの成功に依存することを指定する requires: キーに注目してください。そうしないと、ビルド全体が失敗し、Workflow の残りのジョブは実行されなくなります。

- aws-ecr/build_and_push_image:
    region: us-east-1
    account-url: ${AWS_ECR_ACCOUNT_URL}
    repo: ${CIRCLE_PROJECT_REPONAME}
    tag: ${CIRCLE_BUILD_NUM}
    requires:
      - build_test

上記のセグメントは、AWS ECR Orb の実行を指定する aws-ecr/build_and_push_image: キーを示しています。AWS ECR Orb には、この例の組み込み環境変数に割り当てられる値を必要とするパラメーターが設定されます。この Orb の詳細については、AWS ECR Orb のドキュメントを参照してください。この特定の AWS ERC Orb は、この Orb の build_and_push_image メソッドを実行する前に、build_test: ジョブが正常に完了することに依存します。

Job の定義

このコンフィグのプライマリ jobs: 要素で定義されるジョブで参照される、コンフィグの workflows: および orbs: 要素について説明してきました。次のコードのセグメントは、このコンフィグ構文で定義されるすべてのジョブを示しています。

jobs:
  build_test:
    docker:
      - image: circleci/python:2.7.14
    steps:
      - checkout
      - run:
          name: Setup VirtualEnv
          command: |
            virtualenv helloworld
            . helloworld/bin/activate
            pip install --no-cache-dir -r requirements.txt
      - run:
          name: Run Tests
          command: |
            . helloworld/bin/activate
            python test_hello_world.py
  docker_hub_build_push_image:
    docker:
      - image: circleci/python:2.7.14
    steps:
      - checkout
      - setup_remote_docker:
          docker_layer_caching: false
      - run:
          name: Build and push Docker image to Docker Hub
          command: |
            echo 'export TAG=0.1.${CIRCLE_BUILD_NUM}' >> ${BASH_ENV}
            echo 'export IMAGE_NAME=${CIRCLE_PROJECT_REPONAME}' >> ${BASH_ENV}
            source ${BASH_ENV}
            docker build -t ${DOCKER_LOGIN}/${IMAGE_NAME} -t ${DOCKER_LOGIN}/${IMAGE_NAME}:${TAG} .
            echo ${DOCKER_PWD} | docker login -u ${DOCKER_LOGIN} --password-stdin
            docker push ${DOCKER_LOGIN}/${IMAGE_NAME}

上 記のセグメントでは、build_test:docker_hub_build_push-image: の2つのジョブが定義されています。これは、元のコンフィグ構文を示しています。 build_test: ジョブは Python コンテナをインスタンス化し、アプリの依存関係をインストールし、アプリの単体テストを実行します。

docker_hub_build_push_image: ジョブは、イメージの命名とタグ付けに使用される環境変数を設定し、Dockerfile に基づいて Docker イメージをビルドし、ビルドされたイメージを Docker Hub にプッシュします。

このコンフィグ全体は、コンフィグ構文で堅牢で強力な機能を提供する Workflows、Orbs、およびジョブを定義および実装する方法を示しています。このパイプラインを正常に実行できたら、Docker Hub と AWS ECR リポジトリで Docker イメージのテストを完了できます。

まとめ

見ていただいたように、jobs: セグメントは AWS ECR Orb の定義に比べて少し冗長になっています。Orbs は、機能をカプセル化し、一貫性を確保し、パイプラインコンフィグで繰り返し実行されるコードを減らすように設計されており、簡潔なコンフィグ構文にすることが可能になります。

Orbs を使用すると、チームやプロジェクト間で優先して使用する CI/CD 設定を共有でき、わずか数行でツールとサードパーティのソリューションを簡単に統合できます。開発コミュニティのメンバーは、Orbs を記述して、一般的な問題を解決し、コンフィグを容易に管理できます。一般的なユースケースで Orbs を共有して再利用できるようになると、チームの時間が解放され、ビジネスを差別化するための重要な課題を解決するために多くの時間を費やすことが可能になります。また、コミュニティの他のユーザーには、CI/CD のワークフローを加速するソリューションを提 供できます。

Orbs の開発がさらに推進され、Orbs が CI/CD パイプラインを合理化する優れた機能をもたらすことを期待しています。Orb レジストリを参照しても、必要とする機能を提供する Orb が見つからない場合は、独自のカスタム Orb を作成することをお勧めします。現在、CircleCI Orb レジストリでホストされているすべての Orb は公開されており、一般に利用することが可能です。現在、プライベート Orbs はこのレジストリでサポートされていませんが、この機能は Orb のロードマップにあり、今後利用可能になる予定です。

References

To learn more about orbs, workflows, and CircleCI use the references listed below: