A human and robot hand drawing each other

GitHub Actions での高度なワークフローの構成

Bekah Whittle
Bekah Whittle // Director, Field Services // GitHub

このガイドでは、ワークフローの同時実行の管理、条件付きステートメントの実行、社内スクリプトを使用したワークフローの拡張など、GitHub Actions のワークフローを最適化する高度な技術について詳しく説明します。これらはすべて、開発パイプラインを効率化し、加速させることを目的としています。このガイドでは、Volkswagen グループの子会社で、車載用ソフトウェア開発会社である Cariad 社に参加してもらい、GitHub Actions での成功体験について話を伺います。


このガイドの学習内容

  • ワークフローのコンカレンシーを管理する方法

  • 条件文を活用して拡張性を向上させる方法

  • スクリプトを使用してワークフローを拡張し、インナーソース戦略を加速する方法


ワークフローの優先順位付けとキャンセルを管理する

開発環境が拡大するにつれて、複数のワークフローを効率的に管理する必要性が高まります。GitHub Actions には、これを制御するための機能として concurrencyがあります。この設定では、特定のワークフロー実行を他のワークフロー実行よりも優先させることができるため、リソースの割り当てを制御し、最終的に開発プロセスを高速化できます。

優先順位付け

[GitHub Actions] で、特定の concurrency グループを定義し、あるワークフローを他のワークフローよりも優先させることができます。これにより、指定したワークフローのどれが自動的に実行キューの先頭に移動され、優先的に処理されるかを明確にできます。

concurrency グループの設定方法は以下のとおりです。

concurrency: 
  group: 'my-concurrency-group'

弊社のセットアップでは、特定のワークフローを他より優先する必要はありません。その代わりに、業務に矛盾や不整合を生じさせる可能性がある、ワークフローの同時実行や並列実行を防ぐことに重点を置いています。 同時実行グループは、これを防ぐために使用しています。これらのグループはワークフローの実行を規制するメカニズムとして機能し、ワークフローの並行実行を防ぐことができます。この戦略は競合の回避に役立つだけでなく、デプロイの一貫性と整合性を維持します。並行実行を規制できないと、複雑で望ましくないシナリオにつながる恐れがあるため、このグループは当社にとってとりわけ重要です。

Andre Hacke
Andre Hacke // Senior Product Owner // CARIAD

進行中の実行をキャンセルする

concurrencyを使用して cancel-in-progresstrue に設定すると同じ concurrency グループ内で進行中の他の実行がキャンセルされ、最近のワークフローのみが実行されるようにできます。

concurrency: 
  group: 'my-concurrency-group'
  cancel-in-progress: true

これは、キュー内に複数の実行がある場合に特に便利です。これにより、最新のコミットがテスト対象となり、古い冗長な実行によって貴重なリソースが消費されるのを防ぎます。

ワークフロー実行の精度を向上する

GitHub Actions では条件付きロジックも使用できるため、組織の複雑化に応じてワークフローの実行を管理できます。たとえば、ジョブまたはステップが実行される条件を正確に設定することによって、より優れた制御と適応性を実現できます。

条件文の仕組み

GitHub Actions では、条件文は if キーワードを使用して定義されます。これらの条件によって、ジョブを実行するかスキップするかが決まります。

サンプルのスニペットを以下に示します。

jobs:
  build:
    if: github.repository == 'docs-internal' || github.repository == 'GitHub-docs'

この例では、GitHub リポジトリが次のいずれかの場合のみジョブが実行されます。docs-internal または GitHub-docs.

条件文とシークレットを組み合わせる

条件文をシークレットと組み合わせて、さらに細かい制御を行うこともできます。たとえば、シークレット値が特定の文字列と一致する場合にのみジョブを実行する条件を設定できます。

jobs:
  deploy:
    if: secrets.ENVIRONMENT == 'production'

その場合、ジョブは ENVIRONMENT シークレットが に設定された場合にのみ実行され、productionワークフローにセキュリティと制御のレイヤーが追加されます。

条件文を使用すると、ワークフローをより細かく制御できるだけでなく、特定のプロジェクトやセキュリティのニーズに合わせてアクションをカスタマイズすることもできます。これは特に、リソースを効果的に管理し、開発プロセスの整合性を維持するのに役立ちます。

スクリプトでワークフローを強化する

スクリプトを使用すると、GitHub Actions の複雑性の管理が簡単になります。ワークフローにスクリプトを組み込むことによって、メインのワークフロー ファイルから特定の操作をオフロードできます。これによりモジュール性が向上し、ワークフロー ファイルが読みやすくなるため、再利用性とメンテナンス性が向上します。 

スクリプトはコードを区分するだけではありません。さまざまなワークフローに簡単に組み込める、再利用可能で保守可能なコンポーネントを作成し、より効率的なインナーソーシング モデルを実現します。

ワークフローにスクリプトを組み込む方法

GitHub Actions ワークフロー内でスクリプトを呼び出すには、YAML ファイルの実行セクションでスクリプトへのパスを指定します。以下に例を示します。

jobs:
  build:
    steps:
      - name: Execute custom script
        run: ./path/to/your/script.sh

組織が成長するにつれて、同時実行性、条件文、スクリプトといった高度な戦術が不可欠になります。

次の内容: 最初のカスタム GitHub Actions を構築する

次のガイドでは、カスタム アクションに焦点を当て、構成に action.yml を使用し、ロジックに JavaJavaScript を使用してカスタム アクションを構築する方法を説明します。これにより、GitHub でワークフローを効果的に自動化できるようになります。