# Jenkins から GitHub Actions への移行

GitHub Actions と Jenkins は複数の類似点を共有しているため、 GitHub Actions への移行は比較的簡単です。

## はじめに

Jenkins と GitHub Actions の両方を使用すると、コードを自動的にビルド、テスト、発行、リリース、デプロイするワークフローを作成できます。 Jenkins と GitHub Actions は、ワークフロー構成でいくつかの類似点を共有します。

* Jenkins は、\_\_ ワークフロー ファイルに似たGitHub Actionsを使用してワークフローを作成します。
* Jenkins では *ステージ* を使用して一連のステップを実行し、 GitHub Actions はジョブを使用して 1 つ以上のステップまたは個々のコマンドをグループ化します。
* Jenkins と GitHub Actions では、コンテナー ベースのビルドがサポートされます。 詳しくは、「[Docker コンテナーのアクションを作成する](/ja/actions/tutorials/use-containerized-services/create-a-docker-container-action)」をご覧ください。
* ステップもしくはタスクは、再利用とコミュニティとの共有が可能です。

詳しくは、「[GitHub Actionsについて](/ja/actions/get-started/understand-github-actions)」をご覧ください。

## 主要な相違点

* Jenkinsには、パイプラインの作成用の構文として、宣言的パイプラインとスクリプトパイプラインの2種類があります。
  GitHub Actions は YAML を使用してワークフローと構成ファイルを作成します。 詳しくは、「[GitHub Actions　のワークフロー構文](/ja/actions/reference/workflows-and-actions/workflow-syntax)」をご覧ください。
* Jenkinsのデプロイメントは通常セルフホストであり、ユーザが自身のデータセンター内のサーバーをメンテナンスします。
  GitHub Actions は、ジョブの実行に使用できる独自のランナーをホストし、セルフホステッド ランナーもサポートすることで、ハイブリッド クラウド アプローチを提供します。 詳しくは、「[セルフホステッド ランナー](/ja/actions/concepts/runners/self-hosted-runners)」をご覧ください。

## 機能の比較

### ビルドの配布

Jenkinsでは、ビルドを単一のビルドエージェントに送信することも、複数のエージェントに対して分配することもできます。 それらのエージェントを、オペレーティングシステムの種類などの様々な属性に従って分類することもできます。

同様に、 GitHub Actions は GitHubホスト型ランナーまたはセルフホステッド ランナーにジョブを送信でき、ラベルを使用してさまざまな属性に従ってランナーを分類できます。 詳細については、「[GitHub Actionsについて](/ja/actions/get-started/understand-github-actions#runners)」および「[セルフホステッド ランナー](/ja/actions/concepts/runners/self-hosted-runners)」を参照してください。

### セクションによるパイプラインの整理

Jenkinsは、宣言的パイプラインを複数のセクションに分割します。 同様に、 GitHub Actions はワークフローを別々のセクションに編成します。 次の表は、Jenkins セクションと GitHub Actions ワークフローを比較したものです。

| Jenkinsのディレクティブ                                                 | GitHub Actions                                                                                                                                                                                                             |
| --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`agent`](https://jenkins.io/doc/book/pipeline/syntax/#agent)   | [`jobs.<job_id>.runs-on`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idruns-on) <br> [`jobs.<job_id>.container`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idcontainer) |
| [`post`](https://jenkins.io/doc/book/pipeline/syntax/#post)     | なし                                                                                                                                                                                                                         |
| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#stages) | [`jobs`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobs)                                                                                                                                                 |
| [`steps`](https://jenkins.io/doc/book/pipeline/syntax/#steps)   | [`jobs.<job_id>.steps`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idsteps)                                                                                                                       |

## ディレクティブの使用

Jenkins では、*宣言的パイプライン* を管理するためにディレクティブを使います。 それらのディレクティブは、ワークフローの特徴と、その実行方法を定義します。 次の表は、これらのディレクティブが GitHub Actions内の概念にどのようにマップされるかを示しています。

| Jenkinsのディレクティブ                                                                                                       | GitHub Actions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`environment`](https://jenkins.io/doc/book/pipeline/syntax/#environment)                                             | [`jobs.<job_id>.env`](/ja/actions/reference/workflows-and-actions/workflow-syntax#env) <br> [`jobs.<job_id>.steps[*].env`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsenv)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| [`options`](https://jenkins.io/doc/book/pipeline/syntax/#options)                                                     | [`jobs.<job_id>.strategy`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategy) <br> [`jobs.<job_id>.strategy.fail-fast`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategyfail-fast) <br> [`jobs.<job_id>.timeout-minutes`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idtimeout-minutes)                                                                                                                                                                                                                                                                                                                       |
| [`parameters`](https://jenkins.io/doc/book/pipeline/syntax/#options)                                                  | [`inputs`](/ja/actions/reference/workflows-and-actions/metadata-syntax#inputs) <br> [`outputs`](/ja/actions/reference/workflows-and-actions/metadata-syntax#outputs-for-docker-container-and-javascript-actions)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| [`triggers`](https://jenkins.io/doc/book/pipeline/syntax/#triggers)                                                   | [`on`](/ja/actions/reference/workflows-and-actions/workflow-syntax#on) <br> [`on.<event_name>.types`](/ja/actions/reference/workflows-and-actions/workflow-syntax#onevent_nametypes) <br> [<code>on.\<push>.\<branches\|tags></code>](/ja/actions/reference/workflows-and-actions/workflow-syntax#onpushbranchestagsbranches-ignoretags-ignore) <br> [<code>on.\<pull\_request>.\<branches></code>](/ja/actions/reference/workflows-and-actions/workflow-syntax#onpull_requestpull_request_targetbranchesbranches-ignore) <br> [<code>on.\<push\|pull\_request>.paths</code>](/ja/actions/reference/workflows-and-actions/workflow-syntax#onpushpull_requestpull_request_targetpathspaths-ignore) |
| [`triggers { upstreamprojects() }`](https://jenkins.io/doc/book/pipeline/syntax/#triggers)                            | [`jobs.<job_id>.needs`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| [Jenkins の cron 構文](https://jenkins.io/doc/book/pipeline/syntax/#cron-syntax)                                         | [`on.schedule`](/ja/actions/reference/workflows-and-actions/workflow-syntax#onschedule)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| [`stage`](https://jenkins.io/doc/book/pipeline/syntax/#stage)                                                         | [`jobs.<job_id>`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_id) <br> [`jobs.<job_id>.name`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idname)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| [`tools`](https://jenkins.io/doc/book/pipeline/syntax/#tools)                                                         |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| \[                                                                                                                    |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| GitHub ホステッド ランナーの仕様]\(/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images) |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| [`input`](https://jenkins.io/doc/book/pipeline/syntax/#input)                                                         | [`inputs`](/ja/actions/reference/workflows-and-actions/metadata-syntax#inputs)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| [`when`](https://jenkins.io/doc/book/pipeline/syntax/#when)                                                           | [`jobs.<job_id>.if`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idif)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |

## 連続段階の利用

### 並列なジョブの処理

Jenkins では、 `stages` と `steps` を並列で実行できます。
GitHub Actions はジョブを並列で実行し、ステップ レベルの構文を使用してジョブ内で同時にステップを実行することもできます。 詳細については、「 [GitHub Actions　のワークフロー構文](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsbackground).

| Jenkinsの並列処理                                                        | GitHub Actions                                                                                                                      |
| ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| [`parallel`](https://jenkins.io/doc/book/pipeline/syntax/#parallel) | [`jobs.<job_id>.strategy.max-parallel`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategymax-parallel) |

### Matrix

GitHub Actionsと Jenkins の両方で、マトリックスを使用してさまざまなシステムの組み合わせを定義できます。

| Jenkins                                                                  | GitHub Actions                                                                                                                                                                                      |
| ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`axis`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-axes)       | [`strategy/matrix`](/ja/actions/how-tos/write-workflows/choose-what-workflows-do/run-job-variations#about-matrix-strategies) <br> [`context`](/ja/actions/reference/workflows-and-actions/contexts) |
| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages)   | [`steps-context`](/ja/actions/reference/workflows-and-actions/contexts#steps-context)                                                                                                               |
| [`excludes`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages) | なし                                                                                                                                                                                                  |

### ステップを使ったタスクの実行

Jenkins は `steps` で `stages` をグループ化します。 それらの各ステップは、スクリプト、関数、コマンドなどです。 同様に、 GitHub Actions では、 `jobs` を使用して特定のグループの `steps`を実行します。

| Jenkins                                                       | GitHub Actions                                                                                       |
| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| [`steps`](https://jenkins.io/doc/book/pipeline/syntax/#steps) | [`jobs.<job_id>.steps`](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idsteps) |

## 一般的なタスクの例

### `cron` で実行するパイプラインのスケジュール設定

#### `cron` を含む Jenkins パイプライン

```yaml
pipeline {
  agent any
  triggers {
    cron('H/15 * * * 1-5')
  }
}
```

#### GitHub Actions`cron` を使用したワークフロー

```yaml
on:
  schedule:
    - cron: '*/15 * * * 1-5'
```

`schedule` イベントと使用できる cron 構文の詳細については、「[ワークフローをトリガーするイベント](/ja/actions/reference/workflows-and-actions/events-that-trigger-workflows#schedule)」を参照してください。

### パイプライン中での環境変数の設定

#### 環境変数を含む Jenkins パイプライン

```yaml
pipeline {
  agent any
  environment {
    MAVEN_PATH = '/usr/local/maven'
  }
}
```

#### GitHub Actions 環境変数を含むワークフロー

```yaml
jobs:
  maven-build:
    env:
      MAVEN_PATH: '/usr/local/maven'
```

### 上流プロジェクトからの構築

#### 上流のプロジェクトからビルドされる Jenkins パイプライン

```yaml
pipeline {
  triggers {
    upstream(
      upstreamProjects: 'job1,job2',
      threshold: hudson.model.Result.SUCCESS
    )
  }
}
```

#### GitHub Actions アップストリーム プロジェクトからビルドするワークフロー

```yaml
jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]
```

### 複数のオペレーティングシステムでのビルド

#### 複数のオペレーティング システムでビルドされる Jenkins パイプライン

```yaml
pipeline {
  agent none
  stages {
    stage('Run Tests') {
      matrix {
        axes {
          axis {
            name: 'PLATFORM'
            values: 'macos', 'linux'
          }
        }
        agent { label "${PLATFORM}" }
        stages {
          stage('test') {
            tools { nodejs "node-20" }
            steps {
              dir("scripts/myapp") {
                sh(script: "npm install -g bats")
                sh(script: "bats tests")
              }
            }
          }
        }
      }
    }
  }
}
```

#### GitHub Actions 複数のオペレーティング システムを使用してビルドするワークフロー

```yaml
name: demo-workflow
on:
  push:
jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, ubuntu-latest]
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v7
        with:
          node-version: 20
      - run: npm install -g bats
      - run: bats tests
        working-directory: ./scripts/myapp
```