はじめに
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のディレクティブ | GitHub Actions |
|---|---|
environment | jobs.<job_id>.env jobs.<job_id>.steps[*].env |
options | jobs.<job_id>.strategy jobs.<job_id>.strategy.fail-fast jobs.<job_id>.timeout-minutes |
parameters | inputs outputs |
triggers | on on.<event_name>.types on.<push>.<branches|tags> on.<pull_request>.<branches> on.<push|pull_request>.paths |
triggers { upstreamprojects() } | jobs.<job_id>.needs |
| Jenkins の cron 構文 | on.schedule |
stage | jobs.<job_id> jobs.<job_id>.name |
tools | |
| [ | |
| GitHub ホステッド ランナーの仕様](/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software) | |
input | inputs |
when | jobs.<job_id>.if |
連続段階の利用
並列なジョブの処理
Jenkins では、 stages と steps を並列で実行できます。
GitHub Actions はジョブを並列で実行し、ステップ レベルの構文を使用してジョブ内で同時にステップを実行することもできます。 詳細については、「 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 は steps で stages をグループ化します。 それらの各ステップは、スクリプト、関数、コマンドなどです。 同様に、 GitHub Actions では、 jobs を使用して特定のグループの stepsを実行します。
| Jenkins | GitHub Actions |
|---|---|
steps | jobs.<job_id>.steps |
一般的なタスクの例
cron で実行するパイプラインのスケジュール設定
cron を含む Jenkins パイプライン
pipeline {
agent any
triggers {
cron('H/15 * * * 1-5')
}
}
GitHub Actionscron を使用したワークフロー
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@v6
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm install -g bats
- run: bats tests
working-directory: ./scripts/myapp