はじめに
JenkinsとGitHub Actionsは、どちらも自動的にコードのビルド、テスト、公開、リリース、デプロイを行うワークフローを作成できます。 JenkinsとGitHub Actionsは、ワークフローの設定において似ているところがあります。
- Jenkins では 宣言的パイプライン を使ってワークフローが作成されます。これは GitHub Actions のワークフロー ファイルに似ています。
- Jenkins では ステージ を使ってステップの集合が実行されますが、GitHub Actions では 1 つ以上のステップまたは個別のコマンドをグループ化するのにジョブを使います。
- JenkinsとGitHub Actionsはコンテナベースのビルドをサポートします。 詳しくは、「Docker コンテナーのアクションを作成する」をご覧ください。
- ステップもしくはタスクは、再利用とコミュニティとの共有が可能です。
詳しくは、「GitHub Actions を理解する」をご覧ください。
主要な相違点
- Jenkinsには、パイプラインの作成用の構文として、宣言的パイプラインとスクリプトパイプラインの2種類があります。 GitHub Actionsは、ワークフローと設定ファイルの作成にYAMLを使います。 詳しくは、「GitHub Actions のワークフロー構文」をご覧ください。
- Jenkinsのデプロイメントは通常セルフホストであり、ユーザが自身のデータセンター内のサーバーをメンテナンスします。 GitHub Actionsは、ジョブの実行に利用できる独自のランナーをホストするハイブリッドクラウドのアプローチを提供しながら、セルフホストランナーもサポートします。 詳しくは、「セルフホステッド ランナー」をご覧ください。
機能の比較
ビルドの分配
Jenkinsでは、ビルドを単一のビルドエージェントに送信することも、複数のエージェントに対して分配することもできます。 それらのエージェントを、オペレーティングシステムの種類などの様々な属性に従って分類することもできます。
同様に、GitHub Actions はジョブを GitHub ホストまたはセルフホストランナーに送信でき、ラベルを使用してさまざまな属性に従ってランナーを分類できます。 詳細については、「GitHub Actions を理解する」および「セルフホステッド ランナー」を参照してください。
セクションを利用したパイプラインの整理
Jenkinsは、宣言的パイプラインを複数のセクションに分割します。 同様に、GitHub Actions はワークフローを個別のセクションに編成します。 以下の表は、JenkinsのセクションをGitHub Actionsのワークフローと比較しています。
| Jenkinsのディレクティブ | GitHub Actions | 
|---|---|
| agent | jobs.<job_id>.runs-onjobs.<job_id>.container | 
| post | なし | 
| stages | jobs | 
| steps | jobs.<job_id>.steps | 
ディレクティブの使用
Jenkins では、宣言的パイプライン を管理するためにディレクティブを使います。 それらのディレクティブは、ワークフローの特徴と、その実行方法を定義します。 以下の表は、それらのディレクティブがGitHub Actionsの概念とどのように対応するかを示しています。
シーケンシャルなステージの利用
並列なジョブの処理
Jenkins は stages と steps を並列に実行できますが、GitHub Actions が並列に実行できるのは現時点ではジョブだけです。
| Jenkinsの並列処理 | GitHub Actions | 
|---|---|
| parallel | jobs.<job_id>.strategy.max-parallel | 
Matrix
GitHub Actions と Jenkins はどちらも、マトリックスを使ってさまざまなシステムの組み合わせを定義できます。
| Jenkins | GitHub Actions | 
|---|---|
| axis | strategy/matrixcontext | 
| stages | steps-context | 
| excludes | なし | 
ステップを使ったタスクの実行
Jenkins は stages で steps をグループ化します。 それらの各ステップは、スクリプト、関数、コマンドなどです。 同様に、GitHub Actions は jobs を使って steps の特定のグループを実行します。
| Jenkins | GitHub Actions | 
|---|---|
| steps | jobs.<job_id>.steps | 
一般的なタスクの例
cron で実行するパイプラインのスケジュール設定
cron を含む Jenkins パイプライン
pipeline {
  agent any
  triggers {
    cron('H/15 * * * 1-5')
  }
}
cron を含む GitHub Actions ワークフロー
on:
  schedule:
    - cron: '*/15 * * * 1-5'
schedule イベントと使用できる cron 構文の詳細については、「ワークフローをトリガーするイベント」を参照してください。
パイプライン中での環境変数の設定
環境変数を含む Jenkins パイプライン
pipeline {
  agent any
  environment {
    MAVEN_PATH = '/usr/local/maven'
  }
}
環境変数を含む GitHub Actions ワークフロー
jobs:
  maven-build:
    env:
      MAVEN_PATH: '/usr/local/maven'
上流のプロジェクトからのビルド
上流のプロジェクトからビルドされる Jenkins パイプライン
pipeline {
  triggers {
    upstream(
      upstreamProjects: 'job1,job2',
      threshold: hudson.model.Result.SUCCESS
    )
  }
}
上流のプロジェクトからビルドされる GitHub Actions ワークフロー
jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]
複数のオペレーティングシステムでのビルド
複数のオペレーティング システムでビルドされる Jenkins パイプライン
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 ワークフロー
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