はじめに
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-on jobs.<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/matrix context |
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'
パイプライン中での環境変数の設定
環境変数を含む 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-16" }
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@v4
- uses: actions/setup-node@v4
with:
node-version: 16
- run: npm install -g bats
- run: bats tests
working-directory: ./scripts/myapp