Jenkinsにおけるパイプラインは、連続的なデリバリープロセスをコードとして定義する強力な機能です。現在、Jenkinsでは「宣言型パイプライン(Declarative Pipeline)」と「スクリプト型パイプライン(Scripted Pipeline)」の2種類が利用可能ですが、可読性とメンテナンス性の観点から、最新バージョンでは宣言型パイプラインの使用が推奨されています。
1. パイプラインの基本構成
宣言型パイプライン (Declarative Pipeline)
すべての処理を pipeline { } ブロック内に記述します。構造が厳格に定義されているため、構文エラーの検知が容易です。
pipeline {
agent any
stages {
stage('ソース取得') {
steps {
echo 'GitHubからコードをクローンしています...'
}
}
stage('ビルド') {
steps {
echo 'Mavenを実行中...'
}
}
stage('デプロイ') {
steps {
echo '本番環境へ配布中...'
}
}
}
}
スクリプト型パイプライン (Scripted Pipeline)
Groovy言語の柔軟性を最大限に活かせる形式ですが、複雑になりやすい傾向があります。
node {
stage('Preparation') {
echo '準備フェーズ'
}
stage('Execution') {
echo '実行フェーズ'
}
}
2. 宣言型パイプラインの構成要素(Sections)
Agent(エージェント)
ジョブを実行する場所を指定します。パイプライン全体、または各ステージごとに設定可能です。
- any: 利用可能な任意のエージェントで実行。
- none: 全体のエージェント設定を無効化し、ステージごとに個別の
agent設定を必須にする。 - label: 特定のラベル(例: 'linux-node')が付与されたノードを指定。
- docker: 指定したコンテナイメージ内で実行。
pipeline {
agent {
docker {
image 'node:18-alpine'
label 'docker-executor'
args '-v /tmp:/tmp'
}
}
stages {
stage('Init') {
steps {
sh 'node -v'
}
}
}
}
Post(実行後の処理)
ビルドの結果に応じて実行されるアクションを定義します。
- always: 状態に関わらず必ず実行。
- success: 成功時のみ実行。
- failure: 失敗時のみ実行。
- cleanup: 他のポスト処理が終わった後に実行。
post {
success {
echo 'ビルドに成功しました!通知を送信します。'
}
failure {
echo 'ビルドが失敗しました。ログを確認してください。'
}
}
3. 指示文(Directives)と条件分岐
Environment(環境変数)
変数や認証情報を定義します。credentials() メソッドを使って、Jenkinsに保存された機密情報にアクセスできます。
pipeline {
agent any
environment {
APP_VERSION = '2.1.0'
DB_AUTH = credentials('database-login-id')
}
stages {
stage('Env Check') {
steps {
sh "echo バージョン: ${APP_VERSION}"
sh "echo ユーザー: ${DB_AUTH_USR}"
}
}
}
}
Options(オプション)
パイプラインの動作をカスタマイズします。
- timeout: タイムアウト時間を設定。
- retry: 失敗時の再試行回数。
- timestamps: コンソールログに時刻を表示。
- buildDiscarder: 古いビルド履歴の保持件数を制限。
Parameters(パラメータ)
実行時にユーザーが入力を提供できるようにします。
parameters {
string(name: 'DEPLOY_TAG', defaultValue: 'latest', description: 'デプロイするタグ')
choice(name: 'ENV_SELECT', choices: ['dev', 'stg', 'prod'], description: '対象環境')
booleanParam(name: 'SKIP_TESTS', defaultValue: false, description: 'テストをスキップするか')
}
When(実行条件)
特定の条件が満たされた場合のみ、そのステージを実行します。
stage('Release') {
when {
expression { return params.ENV_SELECT == 'prod' }
}
steps {
echo '本番環境へのリリースを実行します。'
}
}
4. 並列実行 (Parallel)
複数の処理を同時に実行することで、ビルド時間を短縮できます。
stage('Parallel Tests') {
parallel {
stage('Unit Tests') {
steps { echo 'ユニットテスト中...' }
}
stage('Integration Tests') {
steps { echo '統合テスト中...' }
}
}
}
5. Jenkinsfile での環境変数の活用
Jenkinsには、ビルド情報を含む組み込み変数が多数用意されています。
BUILD_NUMBER: 現在のビルド番号。JOB_NAME: ジョブの名称。WORKSPACE: ジョブの実行ディレクトリ。
また、コマンドの実行結果を動的に変数に格納することも可能です。
environment {
GIT_COMMIT_HASH = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()
EXIT_CODE = sh(script: 'ls /nonexistent', returnStatus: true)
}
6. 認証情報の取り扱い
Jenkins Pipeline では、安全にパスワードやトークンを扱えます。
- Secret Text: 単一の文字列。
- Username with Password: ユーザー名(変数名_USR)とパスワード(変数名_PSW)に分解されます。
- Secret File: ファイルへのパスが変数に格納されます。
stage('Auth Example') {
environment {
DOCKER_CREDS = credentials('docker-hub-account')
}
steps {
sh "docker login -u ${DOCKER_CREDS_USR} -p ${DOCKER_CREDS_PSW}"
}
}