# 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/creating-actions/creating-a-docker-container-action)」をご覧ください。
* ステップもしくはタスクは、再利用とコミュニティとの共有が可能です。

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

## 主要な相違点

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

## 機能の比較

### ビルドの配布

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

同様に、GitHub Actions はジョブを GitHub ホストまたはセルフホストランナーに送信でき、ラベルを使用してさまざまな属性に従ってランナーを分類できます。 詳細については、「[GitHub Actionsについて](/ja/actions/learn-github-actions/understanding-github-actions#runners)」および「[セルフホステッド ランナー](/ja/actions/hosting-your-own-runners/managing-self-hosted-runners/about-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/using-workflows/workflow-syntax-for-github-actions#jobsjob_idruns-on) <br> [`jobs.<job_id>.container`](/ja/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idcontainer) |
| [`post`](https://jenkins.io/doc/book/pipeline/syntax/#post)     | なし                                                                                                                                                                                                                               |
| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#stages) | [`jobs`](/ja/actions/using-workflows/workflow-syntax-for-github-actions#jobs)                                                                                                                                                    |
| [`steps`](https://jenkins.io/doc/book/pipeline/syntax/#steps)   | [`jobs.<job_id>.steps`](/ja/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsteps)                                                                                                                          |

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

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

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

## 連続段階の利用

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

Jenkins は `stages` と `steps` を並列に実行できますが、GitHub Actions が並列に実行できるのは現時点ではジョブだけです。

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

### Matrix

GitHub Actions と Jenkins はどちらも、マトリックスを使ってさまざまなシステムの組み合わせを定義できます。

| Jenkins                                                                  | GitHub Actions                                                                                                                                    |
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`axis`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-axes)       | [`strategy/matrix`](/ja/actions/using-workflows/about-workflows#using-a-build-matrix) <br> [`context`](/ja/actions/learn-github-actions/contexts) |
| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages)   | [`steps-context`](/ja/actions/learn-github-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/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsteps) |

## 一般的なタスクの例

###

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

####

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

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

####

```
          `cron` を含む GitHub Actions ワークフロー
```

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

```
          `schedule` イベントと使用できる cron 構文の詳細については、「[AUTOTITLE](/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@v5
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm install -g bats
      - run: bats tests
        working-directory: ./scripts/myapp
```