Jenkins Pipeline の詳細解説と実践ガイド

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}"
    }
}

タグ: Jenkins CI/CD Groovy pipeline DevOps

10月30日 07:40 投稿