# ワークフロー構成の再利用

ワークフローを作成するときに重複を避ける方法について説明します。

## 再利用可能なワークフロー

あるワークフローから別のワークフローにコピーして貼り付けるのではなく、ワークフローを再利用できます。 再利用可能なワークフローにアクセスできるユーザーは誰でも、別のワークフローから再利用可能なワークフローを呼び出すことができます。

ワークフローを再利用すると、重複が回避されます。 これにより、ワークフローの管理が容易になり、アクションと同様に、他のユーザーの作業を基にして新しいワークフローをより迅速に作成できます。 また、ワークフローを再利用すると、適切に設計され、既にテスト済みで、効果的であることが証明されているワークフローを使用でき、ベスト プラクティスが促進されます。 Organization では、一元的に管理できる再利用可能なワークフローのライブラリを構築できます。

次の図は、再利用可能なワークフローを使用する進行中のワークフロー実行を示しています。

* 図の左側にある 3 つのビルド ジョブが正常に完了すると、"Deploy" という依存ジョブが実行されます。
* "Deploy" ジョブによって、"Staging"、"Review"、"Production" の 3 つのジョブを含む再利用可能なワークフローが呼び出されます。
* "Production" デプロイ ジョブは、"Staging" ジョブが正常に完了した後にのみ実行されます。
* ジョブが環境を対象とする場合、ワークフロー実行には、ジョブ内のステップ数を示す進行状況バーが表示されます。 次の図では、"Production" ジョブには 8 つのステップが含まれており、ステップ 6 が現在処理中です。
* 再利用可能なワークフローを使用してデプロイ ジョブを実行すると、ワークフロー内のコードを複製することなく、ビルドごとにそれらのジョブを実行できます。

![再利用できるワークフローを呼び出すワークフローの図。](/assets/images/help/actions/reusable-workflows-ci-cd.png)

別のワークフローを使用するワークフローは、"呼び出し元" ワークフローと呼ばれます。 再利用可能なワークフローは、"呼び出し先" ワークフローです。 1 つの呼び出し元ワークフローで、複数の呼び出し先ワークフローを使用できます。 各呼び出し先ワークフローは、1 行で参照されます。 その結果、呼び出し元のワークフロー ファイルに含まれるのは数行の YAML だけでも、実行時に多数のタスクが実行される可能性があります。 ワークフローを再利用すると、呼び出し先ワークフロー全体が、呼び出し元ワークフローの一部であるかのように使用されます。

別のリポジトリのワークフローを再利用する場合、呼び出し先ワークフロー内のすべてのアクションは、呼び出し元ワークフローの一部であるかのように実行されます。 たとえば、呼び出し先ワークフローで `actions/checkout` を使用する場合、アクションでは、呼び出し先ワークフローではなく、呼び出し元ワークフローがホストされるリポジトリの内容をチェックアウトします。

GitHub Actions ワークフローで参照されている再利用されたワークフローは、ワークフローを含むリポジトリの依存関係グラフの依存関係として表示できます。 詳細については、「[依存関係グラフについて](/ja/enterprise-server@3.22/code-security/concepts/supply-chain-security/dependency-graph)」を参照してください。

### 再利用可能なワークフローと複合アクション

再利用可能なワークフローと複合アクションは、どちらもワークフロー コンテンツの重複を回避するのに役立ちます。 再利用可能なワークフローを使用すると、ワークフロー全体を複数のジョブとステップで再利用できますが、複合アクションでは、複数のステップを組み合わせることができるので、他のアクションと同様に、複数のステップをジョブ ステップ内で実行できます。

各ソリューションのいくつかの側面を比較してみましょう:

* **ワークフロー ジョブ** - 複合アクションには、呼び出し元ワークフロー内でシングル ステップとして実行される一連のステップが含まれています。 再利用可能なワークフローとは異なり、ジョブを含めることはできません。
* **ログ** - 複合アクションが実行されると、複合アクション内の個々のステップではなく、複合アクションを実行した呼び出し元ワークフローのステップだけがログに表示されます。 再利用可能なワークフローでは、すべてのジョブとステップが個別にログに記録されます。
* **ランナーの指定** - 再利用可能なワークフローには、1 つ以上のジョブが含まれます。 すべてのワークフロー ジョブと同様に、再利用可能なワークフロー内のジョブは、ジョブを実行するマシンの種類を指定します。 そのため、呼び出し元のワークフロー ジョブ用に選択したマシンとは異なる可能性があるマシンの種類でステップを実行する必要がある場合は、複合アクションではなく再利用可能なワークフローを使用する必要があります。
* **ステップへの出力の受け渡し** - 複合アクションはワークフロー ジョブ内のステップとして実行され、複合アクションを実行するステップの前または後に複数のステップを持つことができます。 再利用可能なワークフローは、ジョブ ステップ内からではなく、ジョブ内で直接呼び出されます。 再利用可能なワークフローを呼び出した後でジョブにステップを追加することはできません。そのため、呼び出し元ワークフローの後続のジョブ ステップに値を渡すために `GITHUB_ENV` を使用することはできません。

### 再利用可能なワークフローと複合アクションの主な違い

| 再利用可能なワークフロー                                                    | 複合アクション                                                          |
| --------------------------------------------------------------- | ---------------------------------------------------------------- |
| 任意の標準ワークフロー ファイルによく似た YAML ファイル                                 | ワークフロー ステップのバンドルを含むアクション                                         |
| 再利用可能な各ワークフローは、リポジトリの `.github/workflows` ディレクトリにある 1 つのファイルである | 各複合アクションは個別のリポジトリまたはディレクトリで、`action.yml` ファイルと、必要に応じてその他のファイルも含む |
| 特定の YAML ファイルを参照することで呼び出される                                     | アクションが定義されているリポジトリまたはディレクトリを参照することで呼び出される                        |
| ステップからではなく、ジョブ内で直接呼び出される                                        | ジョブ内でステップとして実行する                                                 |
| 複数のジョブを含めることができる                                                | ジョブを含まない                                                         |
| 各ステップはリアルタイムで記録される                                              | 複数のステップが含まれている場合でも、1 つのステップとしてログに記録される                           |
| 最大4ワークフローのレベルまで接続できます                                           | 1 つのワークフローで最大 10 個の複合アクションを入れ子にすることができる                          |
| シークレットが使用できる                                                    | シークレットが使用できない                                                    |
| [マーケットプレース](https://github.com/marketplace?type=actions)に発行できない |                                                                  |
| [マーケットプレース](https://github.com/marketplace?type=actions)に発行できる  |                                                                  |

## ワークフロー テンプレート

ワークフロー テンプレートを使用すると、ワークフローを作成するアクセス許可を持つ Organization 内のすべての人が、より迅速かつ簡単にワークフローを作成できます。 新しいワークフローを作成する場合は、ワークフロー テンプレートを選択すると、ワークフローを作成する作業の一部またはすべてが自動的に行われます。 ワークフロー テンプレート内では、再利用可能なワークフローを参照して、一元管理されたワークフロー コードを再利用するメリットを簡単に得ることもできます。

再利用可能なワークフローを参照するときにコミット SHA を使うと、そのワークフローを再利用するすべてのユーザーが必ず同じ YAML コードを使用するようにできます。 ただし、タグまたはブランチを使用して再利用可能なワークフローを参照する場合は、そのバージョンのワークフローを信頼できることを確認してください。 詳しくは、「[セキュリティで保護された使用に関するリファレンス](/ja/enterprise-server@3.22/actions/reference/security/secure-use#reusing-third-party-workflows)」をご覧ください。

GitHub には、さまざまな言語とツール用のワークフロー テンプレートが用意されています。 リポジトリにワークフローを設定すると、 GitHub はリポジトリ内のコードを分析し、リポジトリ内の言語とフレームワークに基づいてワークフローを推奨します。 たとえば、Node.jsを使用する場合、 GitHub は、Node.js パッケージをインストールしてテストを実行するワークフロー テンプレート ファイルを提案します。 検索とフィルタリングを行って、関連するワークフロー テンプレートを見つけることができます。

GitHub には、次の大まかなカテゴリに対応したすぐに使用できるワークフロー テンプレートが用意されています。

* **デプロイ (CD)**。 詳しくは、「[継続的なデプロイ](/ja/enterprise-server@3.22/actions/get-started/continuous-deployment)」をご覧ください。

* **継続的インテグレーション (CI)** 。 詳しくは、「[継続的インテグレーション](/ja/enterprise-server@3.22/actions/get-started/continuous-integration)」をご覧ください。

* **オートメーション**。 Automation ワークフロー テンプレートには、pull request のトリアージや、pull request で変更されたパスに基づくラベルの適用、リポジトリに初めて投稿する人へのあいさつなど、ワークフローを自動化するためのソリューションが用意されています。

これらのワークフローを、カスタム ワークフローの構築の出発点として使用するか、そのまま利用します。 ワークフロー テンプレートの詳細な一覧は、[actions/starter-workflows](https://github.com/actions/starter-workflows) リポジトリで参照できます。

詳しくは、「[組織のワークフロー テンプレートを作成する](/ja/enterprise-server@3.22/actions/how-tos/reuse-automations/create-workflow-templates)」をご覧ください。

## 次のステップ

ワークフローの再利用を開始するには、「[ワークフローを再利用する](/ja/enterprise-server@3.22/actions/how-tos/reuse-automations/reuse-workflows)」を参照してください。

ワークフローの再利用の複雑さの詳細については、「[ワークフロー構成の再利用](/ja/enterprise-server@3.22/actions/reference/workflows-and-actions/reusing-workflow-configurations)」を参照してください。