Traffine I/O

日本語

2023-03-04

CircleCI Workflows

ワークフローとは

ワークフローは、CircleCIパイプライン内の複数のジョブをオーケストレーションし、調整する方法です。ワークフローは、ジョブの順序と依存関係を定義する柔軟で構成可能な構造を提供し、並列実行、条件付きステップ、およびファンイン/ファンアウトパターンを使用したより高度なパイプラインを開発者が作成できるようにします。

主要コンポーネント

CircleCIのワークフローには3つの主要コンポーネントがあります。

  • ジョブ: ビルド、テスト、コードのデプロイなど、特定の操作を実行する独立したタスク。
  • ワークフロー: パイプライン内のジョブの順序と依存関係を定義するルールのセット。
  • コンフィグ: ジョブとワークフローの定義を含むパイプライン構成のYAMLファイル(.circleci/config.yml)。

シンプルなワークフローの作成

まず、ビルド、テスト、デプロイの3つのジョブで構成されるシンプルなワークフローを作成します。

CircleCIプロジェクトの構成

  1. CircleCIアカウントにサインアップするか、すでに持っている場合はログイン
  2. バージョン管理システム(GitHubまたはBitbucket)をCircleCIに接続
  3. リポジトリのリストからプロジェクトを選択して、CircleCIにプロジェクトを追加

基本的なワークフローの定義

プロジェクトのリポジトリ内に、.circleciディレクトリとその内部にconfig.ymlファイルを作成します。このファイルには、ジョブとワークフローの定義を含むパイプラインの構成が含まれます。

.circleci/config.yaml
version: 2.1
jobs:
  build:
    # Job configuration for the "build" job
  test:
    # Job configuration for the "test" job
  deploy:
    # Job configuration for the "deploy" job

workflows:
  version: 2
  my_workflow:
    jobs:
      - build
      - test:
          requires:
            - build
      - deploy:
          requires:
          - test

ワークフローの実行と監視

  1. 変更内容をリポジトリにプッシュ
  2. CircleCIは新しい構成を自動的に検出し、ワークフローの実行を開始

ワークフローの進行状況を監視するには、CircleCIダッシュボードに移動してプロジェクトを選択します。各ジョブのステータスを含むパイプラインの実行概要が表示されます。

並列実行とファンイン/ファンアウト

CircleCIのワークフローでは、並列実行とファンイン/ファンアウトパターンを利用して、CI/CDパイプラインの実行時間を最適化できます。

並列実行によるビルドの加速

CircleCIの並列実行には、タスクをより速く処理するために、同時に複数のジョブインスタンスを実行することが含まれます。各ジョブの並列度をparallelismキーを使用して構成することができます。

例えば、テストを実行するジョブがある場合、テストスイートを4つの並列タスクに分割したい場合は、parallelismキーを4に設定することができます。

.circleci/config.yaml
jobs:
  test:
    parallelism: 4
    # Job configuration for the "test" job

ファンインとファンアウトの理解

ファンアウトとは、単一のジョブが複数のダウンストリームジョブをトリガーするパターンです。一方、ファンインは、複数のジョブが単一のダウンストリームジョブに収束するパターンです。これらのパターンを使用することで、必要に応じて結果を統合しつつ、ジョブを並列実行することでCI/CDパイプラインを最適化することができます。

ワークフローでの並列実行、ファンイン、ファンアウトの実装

ワークフローで並列実行、ファンイン、ファンアウトを実装するには、requiresキーを使用してジョブの依存関係を定義することができます。特定のジョブが実行される前に完了する必要があるジョブを指定することで、パイプラインの実行を最適化する複雑なワークフローを作成することができます。

例えば、次のジョブがあるワークフローを考えてみます。

  • build
  • test_atest_btest_c(並列実行)
  • deploy

このワークフローを次のように定義できます。

.circleci/config.yaml
workflows:
  version: 2
  my_workflow:
    jobs:
      - build
      - test_a:
          requires:
            - build
      - test_b:
          requires:
            - build
      - test_c:
          requires:
            - build
      - deploy:
          requires:
            - test_a
            - test_b
            - test_c

条件付きワークフローと承認

CircleCIのワークフローでは、条件付き実行とマニュアル承認をサポートしているため、パイプラインに対するより細かい制御が可能です。

条件付きワークフローの定義

whenキーとunlessキーを使用して、事前に定義された条件やカスタムロジックと共に条件付きワークフローを作成することができます。例えば、特定のブランチがプッシュされた場合にのみジョブを実行することができます。

.circleci/config.yaml
workflows:
  version: 2
  my_workflow:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only: /^release-.*/

承認ステップの実装

CircleCIのマニュアル承認ステップを使用すると、ワークフローを一時停止して、ユーザーの承認待ち状態にすることができます。承認ステップをワークフローに追加するには、type: approvalキーを使用します。

.circleci/config.yaml
workflows:
  version: 2
  my_workflow:
    jobs:
      - build
      - test
      - hold_for_approval:
          type: approval
          requires:
            - test
      - deploy:
          requires:
            - hold_for_approval

複雑な条件付きワークフロー

CircleCIのパイプラインパラメータとカスタムロジックを使用して、複雑な条件付きワークフローを作成することもできます。パイプラインパラメータは、キーと値のペアであり、構成ファイルに渡すことができ、ワークフローの条件付きロジックを定義するために使用することができます。パイプラインパラメータを作成するには、config.ymlファイル内のversionキーの下にparametersキーを追加してください。

.circleci/config.yaml
version: 2.1
parameters:
  deploy_production:
    type: boolean
    default: false

jobs:
  # Job definitions

workflows:
  version: 2
  my_workflow:
    jobs:
      - build
      - test
      - deploy_staging
      - hold_for_approval:
          type: approval
          requires:
            - deploy_staging
      - deploy_production:
          requires:
            - hold_for_approval
          when: << pipeline.parameters.deploy_production >>

この例では、deploy_productionパイプラインパラメータがtrueに設定されている場合にのみ、deploy_productionジョブが実行されます。このパラメータは、CircleCI APIを介してパイプラインをトリガーする際に渡すことができます。

参考

https://circleci.com/docs/workflows/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!