# GitHub Actions Importer を使用したAzure DevOpsからの移行

GitHub Actions Importer を使用して、 GitHub Actions へのAzure DevOps パイプラインの移行を自動化する方法について説明します。

## GitHub Actions Importer を使用したAzure DevOpsからの移行について

次の手順では、GitHub Actions Importer を使用して、Azure DevOps パイプラインを GitHub Actions に移行するように環境を構成する方法について説明します。

### 前提条件

* プロジェクトとパイプラインをGitHub Actionsワークフローに変換したいAzure DevOpsアカウントまたは組織。
* アカウントまたは Organization の Azure DevOps personal access tokenを作成するためのアクセス権。
* Linux ベースのコンテナーを実行し、必要なツールをインストールできる環境。
  * Docker が[インストールされていて](https://docs.docker.com/get-docker/)実行されていること。

  * [GitHub CLI](https://cli.github.com) がインストールされていること。
  > \[!NOTE]
  > GitHub Actions Importer コンテナーと CLI は、CI プラットフォームと同じサーバーにインストールする必要はありません。

### 制限事項

GitHub Actions を使って Azure DevOps から GitHub Actions Importer に移行する場合、いくつかの制限があります。

* GitHub Actions Importer には、Azure DevOps API のバージョン 5.0 が必要です。これは、Azure DevOps サービスまたは Azure DevOps Server 2019 で利用可能です。 以前のバージョンのAzure DevOps Serverには互換性がありません。
* ソース コードのチェックアウトなどの Azure DevOps パイプラインに暗黙的に追加されるタスクは、GUID 名として GitHub Actions Importer 監査に追加できます。 GUID のフレンドリ タスク名を見つけるには、URL `https://dev.azure.com/:organization/_apis/distributedtask/tasks/:guid` を使用できます。

#### 手動タスク

特定の Azure DevOps コンストラクトは、Azure DevOps から GitHub Actions 構成に手動で移行する必要があります。 具体的な内容は次のとおりです。

* 組織、リポジトリ、環境のシークレット
* OIDC Connect、GitHub Apps、personal access tokensなどのサービス接続
* 不明なタスク
* セルフホステッド エージェント (自己ホスト型エージェント)
* 環境
* デプロイ前の承認

手動移行の詳細については、「[Azure Pipelines から GitHub Actions への移行](/ja/actions/migrating-to-github-actions/manually-migrating-to-github-actions/migrating-from-azure-pipelines-to-github-actions)」を参照してください。

#### サポート対象外のタスク

GitHub Actions Importer では、次のタスクの移行はサポートされていません。

* デプロイ前ゲート
* デプロイ後のゲート
* デプロイ後の承認
* いくつかのリソース トリガー

## GitHub Actions Importer CLI 拡張機能のインストール

1. GitHub Actions Importer CLI 拡張機能のインストール

   ```bash copy
   gh extension install github/gh-actions-importer
   ```

2. 拡張機能がインストールされていることを確認します。

   ```bash
   $ gh actions-importer -h
   Options:
     -?, -h, --help  Show help and usage information

   Commands:
     update     Update to the latest version of GitHub Actions Importer.
     version    Display the version of GitHub Actions Importer.
     configure  Start an interactive prompt to configure credentials used to authenticate with your CI server(s).
     audit      Plan your CI/CD migration by analyzing your current CI/CD footprint.
     forecast   Forecast GitHub Actions usage from historical pipeline utilization.
     dry-run    Convert a pipeline to a GitHub Actions workflow and output its yaml file.
     migrate    Convert a pipeline to a GitHub Actions workflow and open a pull request with the changes.
   ```

## 資格情報の構成

```
          `configure` CLI コマンドは、Azure DevOps と GitHub Actions Importer を操作する際に、GitHub のために必要な資格情報とオプションを設定するのに使用されます。
```

1. GitHub personal access token (classic) を作成します。 詳しくは、「[個人用アクセス トークンを管理する](/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic)」をご覧ください。

   トークンには、`workflow` スコープが必要です。

   トークンは、作成後にコピーして、後で使用できるように安全な場所に保存します。

2. Azure DevOps personal access token を作成します。 詳細については、Azure DevOpsドキュメントの「[Use personal access tokens](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops\&tabs=Windows#create-a-pat)を参照してください。 トークンには次のスコープが必要です。

   * エージェント プール: `Read`
   * ビルド: `Read`
   * コード: `Read`
   * リリース: `Read`
   * サービス接続: `Read`
   * タスク グループ: `Read`
   * 変数グループ: `Read`

   トークンは、作成後にコピーして、後で使用できるように安全な場所に保存します。

3. ターミナルで、GitHub Actions Importer `configure` CLI コマンドを実行します。

   ```shell
   gh actions-importer configure
   ```

   ```
          `configure` コマンドでは、次の情報の入力が求められます。
   ```

   * \[どの CI プロバイダーを構成していますか?] で、方向キーを使用して `Azure DevOps` を選択し、<kbd>Space</kbd> キーを押して選択し、<kbd>Enter</kbd> キーを押します。
   * "GitHub の Personal access token" で、先ほど作成した personal access token (classic) の値を入力し、<kbd>Enter</kbd> キーを押します。
   * "GitHub インスタンスのベース URL"、
   * "Personal access token for Azure DevOps" には、前に作成したAzure DevOps personal access token の値を入力し、<kbd>Enter</kbd> を押します。
   * \[Azure DevOps インスタンスのベース URL] で、<kbd>Enter</kbd> キーを押して既定値 (`https://dev.azure.com`) を受け入れます。
   * \[Azure DevOps組織名] に、Azure DevOps組織の名前を入力し、<kbd>Enter</kbd> キーを押します。
   * \[Azure DevOps プロジェクト名] に、Azure DevOps プロジェクトの名前を入力し、<kbd>Enter</kbd> キーを押します。

   以下に `configure` コマンドの例を示します。

   ```shell
   $ gh actions-importer configure
   ✔ Which CI providers are you configuring?: Azure DevOps
   Enter the following values (leave empty to omit):
   ✔ Personal access token for GitHub: ***************
   ✔ Base url of the GitHub instance: https://github.com
   ✔ Personal access token for Azure DevOps: ***************
   ✔ Base url of the Azure DevOps instance: https://dev.azure.com
   ✔ Azure DevOps organization name: :organization
   ✔ Azure DevOps project name: :project
   Environment variables successfully updated.
   ```

4. ターミナルで GitHub Actions Importer `update` CLI コマンドを実行して GitHub Packages Container registryに接続し、コンテナー イメージが確実に最新バージョンに更新されるようにします。

   ```shell
   gh actions-importer update
   ```

   コマンドの出力は次のようになります。

   ```shell
   Updating ghcr.io/actions-importer/cli:latest...
   ghcr.io/actions-importer/cli:latest up-to-date
   ```

## Azure DevOpsの監査を実行する

```
          `audit` コマンドを使用すると、Azure DevOps組織内のすべてのプロジェクトの概要を確認できます。

          `audit` コマンドによって、次のステップが実行されます。
```

1. Azure DevOps組織で定義されているすべてのプロジェクトを取得します。
2. 各パイプラインを、対応する GitHub Actions ワークフローに変換します。
3. GitHub Actions Importer を使って、どの程度完全で複雑な移行が可能かをまとめたレポートを生成します。

### 監査コマンドの実行

Azure DevOps組織の監査を実行するには、ターミナルで次のコマンドを実行します。

```shell
gh actions-importer audit azure-devops --output-dir tmp/audit
```

### 監査結果の検査

監査の結果は、指定した出力ディレクトリ内のファイルに含まれます。 監査結果の概要については、`audit_summary.md` ファイルを参照してください。

監査の概要には、次のセクションがあります。

#### Pipelines

"パイプライン" セクションには、GitHub Actions Importer によって行われた変換率に関する統計情報の概要が含まれます。

以下に、"パイプライン" セクションに表示される可能性がある主な用語を示します。

* **成功**したパイプラインでは、100% のパイプライン構成と個々の項目が、同等の GitHub Actions に自動的に変換されました。
* **部分的に成功**したパイプラインは、すべてのパイプライン構成が変換されましたが、同等の GitHub Actions に自動的に変換されなかった個別項目がいくつかあります。
* **未サポート**のパイプラインは、GitHub Actions Importer でサポートされていない定義の種類です。
* **失敗**したパイプラインは、変換中に致命的なエラーが発生しました。 これは、次の 3 つの理由のいずれかで発生する可能性があります。
  * パイプラインの構成が元々正しくなかったため、有効でなかった。
  * 変換時に GitHub Actions Importer で内部エラーが発生した。
  * ネットワーク応答が失敗して、パイプラインにアクセスできなくなったが、これは多くの場合、無効な資格情報が原因である。

#### ビルド ステップ

"ビルド ステップ" セクションには、すべてのパイプラインで使われる個々のビルド ステップの概要と、GitHub Actions Importer によって自動的に変換された数が含まれます。

以下に、"ビルド ステップ" セクションに表示される可能性がある主な用語を示します。

* **既知**のビルド ステップは、同等のアクションに自動的に変換されたステップです。
* **不明**なビルド ステップは、同等のアクションに自動的に変換されなかったステップです。
* **未サポート**のビルド ステップは、次のいずれかのステップです。
  * GitHub Actions で基本的にサポートされていない。
  * GitHub Actions と互換性のない方法で構成されている。
* **アクション**は、変換されたワークフローで使われたアクションのリストです。 これは、次の場合に重要である可能性があります。
  * GitHub Enterprise Server を使う場合、インスタンスに同期するアクションのリストを収集する。
  * 使われるアクションの組織レベルの許可リストを定義する。 このアクション リストは、セキュリティ チームまたはコンプライアンス チームの確認を必要とする可能性があるアクションの包括的なリストです。

#### 手動タスク

"手動タスク" セクションには、GitHub Actions Importer で自動的に完了できず、手動で完了する必要があるタスクの概要が含まれます。

以下に、"手動タスク" セクションに表示される可能性がある主な用語を示します。

* **シークレット**は、変換されたパイプラインで使われるリポジトリまたは組織レベルのシークレットです。 これらのパイプラインが正常に機能するためには、これらのシークレットを GitHub Actions で手動で作成する必要があります。 詳しくは、「[GitHub Actions でのシークレットの使用](/ja/actions/security-guides/using-secrets-in-github-actions)」をご覧ください。
* **セルフホステッド ランナー**とは、変換されたパイプラインで参照されるランナーのラベルのうち、GitHub ホステッド ランナーではないものを指します。 これらのパイプラインを適切に機能させるには、これらのランナーを手動で定義する必要があります。

#### ファイル

監査レポートの最後のセクションには、監査中にディスクに書き込まれたすべてのファイルのマニフェストが表示されます。

各パイプライン ファイルには、次のようなさまざまなファイルが監査に含まれます。

* GitHub で定義された元のパイプライン。
* パイプラインの変換に使われたネットワーク応答のすべて。
* 変換されたワークフロー ファイル。
* 失敗したパイプライン変換のトラブルシューティングに使用できるスタック トレース。

さらに、`workflow_usage.csv` ファイルには、正常に変換された各パイプラインで使われるすべてのアクション、シークレット、ランナーのコンマ区切りのリストが含まれます。 これは、どのワークフローがどのアクション、シークレット、ランナーを使うかを判断するのに役立ち、セキュリティ レビューを実行するのに役立ちます。

## 潜在的な GitHub Actions の使用状況を予測する

```
          `forecast` コマンドを使用すると、Azure DevOpsで完了したパイプライン実行のメトリックを計算することで、GitHub Actions の潜在的な使用状況を予測できます。
```

### forecast コマンドの実行

潜在的な GitHub Actions の使用状況の予測を実行するには、ターミナルで次のコマンドを実行します。 既定では、GitHub Actions Importer による予測レポートに過去 7 日間が含まれます。

```shell
gh actions-importer forecast azure-devops --output-dir tmp/forecast_reports
```

### 予測レポートの検査

予測の結果は、指定した出力ディレクトリ内の `forecast_report.md` ファイルに含まれます。

以下に、予測レポートに表示される可能性がある主な用語を示します。

* **ジョブ数**は、完了したジョブの合計数です。
* **パイプライン数**は、使われた一意のパイプラインの数です。
* **実行時間**は、ランナーがジョブに費やした時間を表します。 このメトリックを使うと、GitHub ホステッド ランナーのコストを計画するのに役立ちます。

  このメトリックは、GitHub Actions に費やすと予想する時間と相関しています。 これは、この時間 (分) に使われるハードウェアによって異なります。
  [GitHub Actions 料金計算ツール](https://github.com/pricing/calculator)を使って、コストを見積もることができます。
* **キュー時間**メトリクスは、ランナーが実行できるようになるのを待機するためにジョブが費やした時間を表します。
* **同時実行ジョブ** メトリックは、特定の時点で実行されるジョブの量を表します。 このメトリックを使って、構成する必要があるランナーの数を定義できます。

さらに、これらのメトリックは、Azure DevOpsのランナーの各キューに対して定義されます。 これはホステッド ランナーとセルフホステッド ランナー、またはハイ スペック マシンとロー スペック マシンが混在している場合に特に有用で、異なるタイプのランナーに固有のメトリックを確認できます。

## dry-run による移行を実行する

```
          `dry-run` コマンドを使用して、Azure DevOps パイプラインを同等の GitHub Actions ワークフローに変換できます。 ドライ ランにより、指定したディレクトリに出力ファイルが作成されますが、パイプラインを移行するための pull request は開かれません。
```

不明なビルド ステップや部分的に成功したパイプラインなど、GitHub Actions Importer で自動的に変換できなかったものがある場合は、カスタム トランスフォーマーを作成して変換プロセスをさらにカスタマイズできます。 詳しくは、「[カスタム トランスフォーマーを使用した GitHub Actions Importer の拡張](/ja/actions/migrating-to-github-actions/automated-migrations/extending-github-actions-importer-with-custom-transformers)」をご覧ください。

### ビルド パイプラインの dry-run コマンドの実行

Azure DevOps ビルド パイプラインを GitHub Actions に移行するドライ ランを実行するには、ターミナルで次のコマンドを実行し、`pipeline_id`を変換するパイプラインの ID に置き換えます。

```shell
gh actions-importer dry-run azure-devops pipeline --pipeline-id :pipeline_id --output-dir tmp/dry-run
```

指定した出力ディレクトリで、ドライ ランのログと変換されたワークフロー ファイルを表示できます。

### リリース パイプラインの dry-run コマンドの実行

Azure DevOps リリース パイプラインを GitHub Actions に移行するドライ ランを実行するには、ターミナルで次のコマンドを実行し、`pipeline_id`を変換するパイプラインの ID に置き換えます。

```shell
gh actions-importer dry-run azure-devops release --pipeline-id :pipeline_id --output-dir tmp/dry-run
```

指定した出力ディレクトリで、ドライ ランのログと変換されたワークフロー ファイルを表示できます。

## 運用環境の移行を実行する

```
          `migrate` コマンドを使用して、Azure DevOps パイプラインを変換し、同等の GitHub Actions ワークフローで pull request を開くことができます。
```

### ビルド パイプラインの migrate コマンドの実行

Azure DevOpsビルド パイプラインを GitHub Actions に移行するには、ターミナルで次のコマンドを実行し、`target-url` 値を GitHub リポジトリの URL に置き換え、`pipeline_id`を変換するパイプラインの ID に置き換えます。

```shell
gh actions-importer migrate azure-devops pipeline --pipeline-id :pipeline_id --target-url https://github.com/octo-org/octo-repo --output-dir tmp/migrate
```

コマンドの出力には、変換されたワークフローをリポジトリに追加する pull request の URL が含まれます。 成功した出力の例は、次のようになります。

```shell
$ gh actions-importer migrate azure-devops pipeline --target-url https://github.com/octo-org/octo-repo --output-dir tmp/migrate --azure-devops-project my-azure-devops-project
[2022-08-20 22:08:20] Logs: 'tmp/migrate/log/actions-importer-20220916-014033.log'
[2022-08-20 22:08:20] Pull request: 'https://github.com/octo-org/octo-repo/pull/1'
```

### リリース パイプラインの migrate コマンドの実行

Azure DevOpsリリース パイプラインを GitHub Actions に移行するには、ターミナルで次のコマンドを実行し、`target-url` 値を GitHub リポジトリの URL に置き換え、`pipeline_id`を変換するパイプラインの ID に置き換えます。

```shell
gh actions-importer migrate azure-devops release --pipeline-id :pipeline_id --target-url https://github.com/octo-org/octo-repo --output-dir tmp/migrate
```

コマンドの出力には、変換されたワークフローをリポジトリに追加する pull request の URL が含まれます。 成功した出力の例は、次のようになります。

```shell
$ gh actions-importer migrate azure-devops release --target-url https://github.com/octo-org/octo-repo --output-dir tmp/migrate --azure-devops-project my-azure-devops-project
[2022-08-20 22:08:20] Logs: 'tmp/migrate/log/actions-importer-20220916-014033.log'
[2022-08-20 22:08:20] Pull request: 'https://github.com/octo-org/octo-repo/pull/1'
```

### pull request の検査

`migrate` コマンドが正常に実行された場合、出力には、変換されたワークフローをリポジトリに追加する新しい pull request へのリンクが含まれます。

pull request の重要な要素には、次のようなものがあります。

* pull request の説明の「**手動ステップ**」というセクションには、パイプラインの GitHub Actions への移行を終了する前に手動で完了する必要があるステップが列挙されています。 たとえば、このセクションでは、ワークフローで使われるシークレットを作成するように指示する場合があります。
* 変換されたワークフロー ファイル。 Pull request の **\[Files changed]** タブを選んで、GitHub リポジトリに追加されるワークフロー ファイルを表示します。

Pull request の検査が終了したら、それをマージして、ワークフローを GitHub リポジトリに追加できます。

## リファレンス

このセクションには、GitHub Actions Importer を使用してAzure DevOpsから移行する場合の環境変数、省略可能な引数、およびサポートされる構文に関する参照情報が含まれています。

### 構成環境変数

GitHub Actions Importer では、認証構成に環境変数が使われます。 これらの変数は、`configure` コマンドを使って構成プロセスに従うことで設定します。 詳細については、[資格情報の構成](#configuring-credentials)に関するセクションを参照してください。

GitHub Actions Importer は、次の環境変数を使用して、Azure DevOps インスタンスに接続します。

* `GITHUB_ACCESS_TOKEN`: 変換されたワークフローで pull request を作成するために使われる personal access token (classic) (`workflow` スコープが必要)。
* `GITHUB_INSTANCE_URL`: ターゲット GitHub インスタンスへの URL (例: `https://github.com`)。
* `AZURE_DEVOPS_ACCESS_TOKEN`: Azure DevOps インスタンスで認証するために使用する personal access token。 このトークンには、次のスコープが必要です。
  * ビルド: `Read`
  * エージェント プール: `Read`
  * コード: `Read`
  * リリース: `Read`
  * サービス接続: `Read`
  * タスク グループ: `Read`
  * 変数グループ: `Read`
* `AZURE_DEVOPS_PROJECT`: パイプラインの移行時に使うプロジェクト名または GUID。 すべてのプロジェクトに対して監査を実行する場合、これは省略可能です。
* `AZURE_DEVOPS_ORGANIZATION`: Azure DevOps インスタンスの組織名。
* `AZURE_DEVOPS_INSTANCE_URL`: `https://dev.azure.com` など、Azure DevOps インスタンスへの URL。

これらの環境変数は、実行時に GitHub Actions Importer によって読み込まれる `.env.local` ファイルに指定できます。

### 省略可能な引数。

GitHub Actions Importer サブコマンドと一緒に使って、移行をカスタマイズできる省略可能な引数があります。

#### `--source-file-path`

```
          `--source-file-path` 引数は、`forecast`、`dry-run`、または `migrate` サブコマンドと一緒に使うことができます。
```

既定では、GitHub Actions Importer はパイプラインの内容をソース管理からフェッチします。
`--source-file-path` 引数を指定して、指定したソース ファイル パスを代わりに使うように GitHub Actions Importer に指示します。

次に例を示します。

```shell
gh actions-importer dry-run azure-devops pipeline --output-dir ./output/ --source-file-path ./path/to/azure_devops/pipeline.yml
```

#### `--config-file-path`

```
          `--config-file-path` 引数は、`audit`、`dry-run`、および `migrate` サブコマンドと一緒に使うことができます。
```

既定では、GitHub Actions Importer はパイプラインの内容をソース管理からフェッチします。
`--config-file-path` 引数を指定して、指定したソース ファイルを代わりに使うように GitHub Actions Importer に指示します。

```
          `--config-file-path` 引数を使って、変換された再利用可能なワークフローまたは複合アクションを移行するリポジトリを指定することもできます。
```

##### 監査の例

この例では、GitHub Actions Importer で、指定した YAML 構成ファイルをソース ファイルとして使い、監査が実行されます。

```shell
gh actions-importer audit azure-devops pipeline --output-dir ./output/ --config-file-path ./path/to/azure_devops/config.yml
```

構成ファイルを使用してAzure DevOps インスタンスを監査するには、構成ファイルが次の形式で、各`repository_slug`が一意である必要があります。

```yaml
source_files:
  - repository_slug: azdo-project/1
    path: file.yml
  - repository_slug: azdo-project/2
    paths: path.yml
```

Azure DevOps組織名、プロジェクト名、およびパイプライン ID を組み合わせることで、パイプラインの`repository_slug`を生成できます。 たとえば、「 `my-organization-name/my-project-name/42` 」のように入力します。

##### ドライ ランの例

この例では、GitHub Actions Importer で、指定した YAML 構成ファイルをソース ファイルとして使い、ドライ ランが実行されます。

構成ファイルの `repository_slug` を `--azure-devops-organization` と `--azure-devops-project` のオプションの値に一致させてパイプラインを選びます。 次に `path` を使って、指定したソース ファイルをプルします。

```shell
gh actions-importer dry-run azure-devops pipeline --output-dir ./output/ --config-file-path ./path/to/azure_devops/config.yml
```

##### 変換された再利用可能なワークフローと複合アクションのリポジトリを指定する

GitHub Actions Importer では `--config-file-path` 引数に指定された YAML ファイルを使って、変換された再利用可能なワークフローと複合アクションが移行されるリポジトリを決定します。

まず、`--config-file-path` 引数を指定せずに監査を実行する必要があります。

```shell
gh actions-importer audit azure-devops --output-dir ./output/
```

このコマンドの出力には、`config.yml` というファイルが含まれます。これには、GitHub Actions Importer によって変換されたすべての再利用可能なワークフローと複合アクションの一覧が含まれます。 たとえば、`config.yml` ファイルの内容は次のようになります。

```yaml
reusable_workflows:
  - name: my-reusable-workflow.yml
    target_url: https://github.com/octo-org/octo-repo
    ref: main

composite_actions:
  - name: my-composite-action.yml
    target_url: https://github.com/octo-org/octo-repo
    ref: main
```

このファイルを使って、再利用可能なワークフローまたは複合アクションを追加するリポジトリと参照先を指定できます。 その後、`--config-file-path` 引数を使って GitHub Actions Importer に `config.yml` ファイルを指定できます。 たとえば、`migrate` コマンドを実行するときにこのファイルを使って、構成ファイルで定義されている一意のリポジトリごとに pull request を開くことができます。

```shell
gh actions-importer migrate azure-devops pipeline --config-file-path config.yml --target-url https://github.com/my-org/my-repo
```

### Azure DevOps パイプラインでサポートされている構文

次の表は、GitHub Actions Importer で現在変換できるプロパティの種類を示しています。

| Azure Pipelines | GitHub Actions                                                                                                                             | ステータス           |
| :-------------- | :----------------------------------------------------------------------------------------------------------------------------------------- | :-------------- |
| 条件              | <ul><li>`jobs.<job_id>.if`</li><li>`jobs.<job_id>.steps[*].if`</li></ul>                                                                   | サポートされています      |
| コンテナ            | <ul><li>`jobs.<job_id>.container`</li><li>`jobs.<job_id>.name`</li></ul>                                                                   | サポートされています      |
| 継続的インテグレーション    | <ul><li>`on.<push>.<branches>`</li><li>`on.<push>.<tags>`</li><li>`on.<push>.paths`</li></ul>                                              | サポートされています      |
| ジョブ             | <ul><li>`jobs.<job_id>`</li></ul>                                                                                                          | サポートされています      |
| プルリクエスト         | <ul><li>`on.<pull_request>.<branches>`</li><li>`on.<pull_request>.paths`</li></ul>                                                         | サポートされています      |
| ステージ            | <ul><li>`jobs`</li></ul>                                                                                                                   | サポートされています      |
| 手順              | <ul><li>`jobs.<job_id>.steps`</li></ul>                                                                                                    | サポートされています      |
| 戦略              | <ul><li>`jobs.<job_id>.strategy.fail-fast`</li><li>`jobs.<job_id>.strategy.max-parallel`</li><li>`jobs.<job_id>.strategy.matrix`</li></ul> | サポートされています      |
| タイムアウト (分)      | <ul><li>`jobs.<job_id>.timeout-minutes`</li></ul>                                                                                          | サポートされています      |
| 変数              | <ul><li>`env`</li><li>`jobs.<job_id>.env`</li><li>`jobs.<job_id>.steps.env`</li></ul>                                                      | サポートされています      |
| 手動デプロイ          | <ul><li>`jobs.<job_id>.environment`</li></ul>                                                                                              | 部分的にサポートされています。 |
| プール             | <ul><li>`runners`</li><li>`self hosted runners`</li></ul>                                                                                  | 部分的にサポートされています。 |
| サービス            | <ul><li>`jobs.<job_id>.services`</li></ul>                                                                                                 | 部分的にサポートされています。 |
| 戦略              | <ul><li>`jobs.<job_id>.strategy`</li></ul>                                                                                                 | 部分的にサポートされています。 |
| トリガー            | <ul><li>`on`</li></ul>                                                                                                                     | 部分的にサポートされています。 |
| プルリクエスト         | <ul><li>`on.<pull_request>.<tags>`</li></ul>                                                                                               | サポートされていない      |
| スケジュール          | <ul><li>`on.schedule`</li><li>`on.workflow_run`</li></ul>                                                                                  | サポートされていない      |
| トリガー            | <ul><li>`on.<event_name>.types`</li></ul>                                                                                                  | サポートされていない      |

サポートされているAzure DevOps タスクの詳細については、[`github/gh-actions-importer` リポジトリ](https://github.com/github/gh-actions-importer/blob/main/docs/azure_devops/index.md)を参照してください。

### 環境変数のマッピング

GitHub Actions Importer は、次の表のマッピングを使用して、既定のAzure DevOps環境変数を GitHub Actions で最も近いものに変換します。

| Azure Pipelines                             | GitHub Actions                                      |
| :------------------------------------------ | :-------------------------------------------------- |
| `$(Agent.BuildDirectory)`                   | `${{ runner.workspace }}`                           |
| `$(Agent.HomeDirectory)`                    | `${{ env.HOME }}`                                   |
| `$(Agent.JobName)`                          | `${{ github.job }}`                                 |
| `$(Agent.OS)`                               | `${{ runner.os }}`                                  |
| `$(Agent.ReleaseDirectory)`                 | `${{ github.workspace}}`                            |
| `$(Agent.RootDirectory)`                    | `${{ github.workspace }}`                           |
| `$(Agent.ToolsDirectory)`                   | `${{ runner.tool_cache }}`                          |
| `$(Agent.WorkFolder)`                       | `${{ github.workspace }}`                           |
| `$(Build.ArtifactStagingDirectory)`         | `${{ runner.temp }}`                                |
| `$(Build.BinariesDirectory)`                | `${{ github.workspace }}`                           |
| `$(Build.BuildId)`                          | `${{ github.run_id }}`                              |
| `$(Build.BuildNumber)`                      | `${{ github.run_number }}`                          |
| `$(Build.DefinitionId)`                     | `${{ github.workflow }}`                            |
| `$(Build.DefinitionName)`                   | `${{ github.workflow }}`                            |
| `$(Build.PullRequest.TargetBranch)`         | `${{ github.base_ref }}`                            |
| `$(Build.PullRequest.TargetBranch.Name)`    | `${{ github.base_ref }}`                            |
| `$(Build.QueuedBy)`                         | `${{ github.actor }}`                               |
| `$(Build.Reason)`                           | `${{ github.event_name }}`                          |
| `$(Build.Repository.LocalPath)`             | `${{ github.workspace }}`                           |
| `$(Build.Repository.Name)`                  | `${{ github.repository }}`                          |
| `$(Build.Repository.Provider)`              | `GitHub`                                            |
| `$(Build.Repository.Uri)`                   | `${{ github.server.url }}/${{ github.repository }}` |
| `$(Build.RequestedFor)`                     | `${{ github.actor }}`                               |
| `$(Build.SourceBranch)`                     | `${{ github.ref }}`                                 |
| `$(Build.SourceBranchName)`                 | `${{ github.ref }}`                                 |
| `$(Build.SourceVersion)`                    | `${{ github.sha }}`                                 |
| `$(Build.SourcesDirectory)`                 | `${{ github.workspace }}`                           |
| `$(Build.StagingDirectory)`                 | `${{ runner.temp }}`                                |
| `$(Pipeline.Workspace)`                     | `${{ runner.workspace }}`                           |
| `$(Release.DefinitionEnvironmentId)`        | `${{ github.job }}`                                 |
| `$(Release.DefinitionId)`                   | `${{ github.workflow }}`                            |
| `$(Release.DefinitionName)`                 | `${{ github.workflow }}`                            |
| `$(Release.Deployment.RequestedFor)`        | `${{ github.actor }}`                               |
| `$(Release.DeploymentID)`                   | `${{ github.run_id }}`                              |
| `$(Release.EnvironmentId)`                  | `${{ github.job }}`                                 |
| `$(Release.EnvironmentName)`                | `${{ github.job }}`                                 |
| `$(Release.Reason)`                         | `${{ github.event_name }}`                          |
| `$(Release.RequestedFor)`                   | `${{ github.actor }}`                               |
| `$(System.ArtifactsDirectory)`              | `${{ github.workspace }}`                           |
| `$(System.DefaultWorkingDirectory)`         | `${{ github.workspace }}`                           |
| `$(System.HostType)`                        | `build`                                             |
| `$(System.JobId)`                           | `${{ github.job }}`                                 |
| `$(System.JobName)`                         | `${{ github.job }}`                                 |
| `$(System.PullRequest.PullRequestId)`       | `${{ github.event.number }}`                        |
| `$(System.PullRequest.PullRequestNumber)`   | `${{ github.event.number }}`                        |
| `$(System.PullRequest.SourceBranch)`        | `${{ github.ref }}`                                 |
| `$(System.PullRequest.SourceRepositoryUri)` | `${{ github.server.url }}/${{ github.repository }}` |
| `$(System.PullRequest.TargetBranch)`        | `${{ github.event.base.ref }}`                      |
| `$(System.PullRequest.TargetBranchName)`    | `${{ github.event.base.ref }}`                      |
| `$(System.StageAttempt)`                    | `${{ github.run_number }}`                          |
| `$(System.TeamFoundationCollectionUri)`     | `${{ github.server.url }}/${{ github.repository }}` |
| `$(System.WorkFolder)`                      | `${{ github.workspace }}`                           |

### テンプレート

GitHub Actions Importer を使用して、Azure DevOps テンプレートを変換できます。

#### 制限事項

GitHub Actions Importer で、Azure DevOps テンプレートを変換できますが、いくつかの制限があります。

* `stages`、`deployments`、および `jobs` キーの下で使用されるAzure DevOps テンプレートは、GitHub Actions で再利用可能なワークフローに変換されます。 詳しくは、「[ワークフローを再利用する](/ja/actions/using-workflows/reusing-workflows)」をご覧ください。
* `steps` キーで使用されるAzure DevOps テンプレートは複合アクションに変換されます。 詳しくは、「[複合アクションを作成する](/ja/actions/creating-actions/creating-a-composite-action)」をご覧ください。
* 現在、他のジョブ テンプレートを参照するジョブ テンプレートがある場合、GitHub Actions Importer はテンプレートを再利用可能なワークフローに変換します。 再利用可能なワークフローは他の再利用可能なワークフローを参照できないため、GitHub Actions では、これは無効な構文です。 入れ子になった再利用可能なワークフローを手動で修正する必要があります。
* テンプレートが外部Azure DevOps組織または GitHub リポジトリを参照している場合は、`--credentials-file` オプションを使用して、このテンプレートにアクセスするための資格情報を指定する必要があります。 詳しくは、「[補助的な引数と設定](/ja/actions/migrating-to-github-actions/automated-migrations/supplemental-arguments-and-settings#using-a-credentials-file-for-authentication)」をご覧ください。
* `each` 式を使って YAML を動的に生成できますが、次の注意事項があります。
  * 入れ子になった `each` ブロックはサポートされていないため、親の `each` ブロックはサポートされません。
  * GitHub Actions ではこのスタイルの挿入がサポートされていないため、`each` とそこに含まれる `if` 条件は変換時に評価されます。
  * ```
          `elseif` ブロックはサポートされていません。 この機能が必要な場合は、手動で修正する必要があります。
    ```
  * 入れ子になった `if` ブロックはサポートされていますが、`if/elseif/else` 条件の下で入れ子になった `if` ブロックはサポートされていません。
  * 定義済みのAzure DevOps変数を使用する `if` ブロックはサポートされていません。

#### サポートされているテンプレート

GitHub Actions Importer では、次の表に示すテンプレートがサポートされています。

| Azure Pipelines                          | GitHub Actions      |           ステータス |
| :--------------------------------------- | :------------------ | --------------: |
| テンプレートからの拡張                              | `Reusable workflow` |      サポートされています |
| ジョブ テンプレート                               | `Reusable workflow` |      サポートされています |
| ステージ テンプレート                              | `Reusable workflow` |      サポートされています |
| ステップ テンプレート                              | `Composite action`  |      サポートされています |
| クラシック エディターのタスク グループ                     | 場合により異なる            |      サポートされています |
| 別のAzure DevOps組織、プロジェクト、またはリポジトリ内のテンプレート | 場合により異なる            |      サポートされています |
| GitHub リポジトリ内のテンプレート                     | 場合により異なる            |      サポートされています |
| 変数テンプレート                                 | `env`               |      サポートされています |
| 条件付きの挿入                                  | ジョブ/ステップに関する`if`条件  | 部分的にサポートされています。 |
| 反復の挿入                                    | 適用なし                | 部分的にサポートされています。 |
| パラメーターを含むテンプレート                          | 場合により異なる            | 部分的にサポートされています。 |

#### テンプレート ファイルのパス名

GitHub Actions Importer では、ファイル名に変数、パラメーター、反復式を含む相対または動的なファイル パスを含むテンプレートを抽出できます。 ただし、既定値が設定されている必要があります。

##### 変数ファイル パス名の例

```yaml
# File: azure-pipelines.yml
variables:
- template: 'templates/vars.yml'

steps:
- template: "./templates/$"
```

```yaml
# File: templates/vars.yml
variables:
  one: 'simple_step.yml'
```

##### パラメーター ファイル パス名の例

```yaml
parameters:
- name: template
  type: string
  default: simple_step.yml

steps:
- template: "./templates/${{ parameters.template }}"
```

##### イテラティブファイルパス名の例

```yaml
parameters:
- name: steps
  type: object
  default:
  - build_step
  - release_step
steps:
- ${{ each step in parameters.steps }}:
    - template: "$-variables.yml"
```

#### テンプレート パラメーター

GitHub Actions Importer では、次の表に示すパラメーターがサポートされています。

| Azure Pipelines | GitHub Actions   | ステータス      |
| :-------------- | :--------------- | :--------- |
| 文字列             | `inputs.string`  | サポートされています |
| 数値              | `inputs.number`  | サポートされています |
| boolean         | `inputs.boolean` | サポートされています |
| オブジェクト          |                  |            |

```
          `inputs.string` と`fromJSON`式  | 部分的にサポートされています。   |
```

\| ステップ                  | `step`                                      | 部分的にサポートされています。  |
\| ステップリスト              | `step`                                      | 部分的にサポートされています。  |
\| ジョブ                   | `job`                                       | 部分的にサポートされています。 |
\| ジョブリスト               | `job`                                       | 部分的にサポートされています。 |
\| デプロイ            | `job`                                       | 部分的にサポートされています。 |
\| デプロイメントリスト        | `job`                                       | 部分的にサポートされています。 |
\| ステージ                 | `job`                                       | 部分的にサポートされています。 |
\| ステージリスト             | `job`                                       | 部分的にサポートされています。 |

> \[!NOTE]
> このパラメーター型の `step` キーの下で使用されるテンプレートは、テンプレート ステップの先頭または末尾でステップが使用されている場合にのみ、複合アクションとしてシリアル化されます。 このパラメーター型の `stage`、`deployment`、`job` キーで使われるテンプレートは、再利用可能なワークフローに変換されず、代わりにスタンドアロン ワークフローとしてシリアル化されます。

## 法務上の通知

MIT ライセンスのもとで <https://github.com/github/gh-actions-importer/> から一部を引用しています。

```text
MIT License

Copyright (c) 2022 GitHub

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```