Jenkins はジョブと Pipeline としてデリバリー作業を調整します。ビルドロジック、アプリケーションコード、ツールのバージョンは
同じレビュープロセスで変更すべきであるため、Pipeline はバージョン管理された Jenkinsfile に保存します。
コントローラー、エージェント、ワークスペース #
コントローラーは設定とビルド記録を保存し、スケジューリング判断を評価し、ユーザーインターフェースを提供し、エージェントを調整します。
ビルドをコントローラー上で実行してはいけません。エージェントは 1 つ以上の executor を提供し、
各 executor は一度に 1 つの Pipeline タスクを占有できます。ラベルは
linux、arm64、docker などの能力を表し、Pipeline の agent 選択はワークスペースの割り当て先を制約します。
ワークスペースは変更可能なチェックアウトとビルド状態であり、アーティファクトリポジトリではありません。
並行ビルドには異なるワークスペースパスが割り当てられることがあり、エフェメラルなエージェントはステージ後に消える可能性があります。
出力は archiveArtifacts で公開し、小さなファイルは stash と unstash でステージ間転送し、
リリースアーティファクトは専用リポジトリへアップロードします。前回のビルドが残したファイルに依存してはいけません。
エージェントには、ラベルが要求するツール、ネットワークパス、資格情報だけを持たせます。 エフェメラルなエージェントはビルド間の汚染を減らしますが、再現可能なビルドには固定されたコンテナイメージ、 ツールチェーン、プラグイン、依存関係入力が依然として必要です。
Declarative Pipeline と Scripted Pipeline #
Declarative Pipeline は pipeline、agent、stages、steps、environment、options、post の周囲に
検証済みの構造を提供します。Scripted Pipeline は node やその他の Pipeline ステップ内で Groovy の制御フローを使います。
Declarative の script { ... } には命令的なセクションを含められますが、スクリプト領域が大きいと宣言的検証とステージ意味論が失われます。
再利用可能なポリシーはリポジトリ間で Groovy をコピーせず、バージョン管理された Shared Library に置きます。
pipeline {
agent { label 'linux && container' }
options {
timeout(time: 20, unit: 'MINUTES')
disableConcurrentBuilds()
}
stages {
stage('Test') {
steps {
retry(2) {
sh './mvnw --batch-mode verify'
}
}
post {
always { junit 'target/surefire-reports/*.xml' }
}
}
stage('Package') {
steps {
sh './mvnw --batch-mode package -DskipTests'
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
}
}
}
post {
always { deleteDir() }
}
}Pipeline ステップは実行状態を永続化するため、耐久タスクはコントローラー再起動後も継続できますが、
外部コマンドは再起動に安全でなければなりません。停止した処理には timeout で上限を設け、
retry はべき等だと分かっている操作にだけ使います。デプロイの再試行は副作用を重複させる可能性があります。
ブランチが同じワークスペースや外部リソースを変更しない場合、parallel はレイテンシーを削減します。
分離が必要なら別のワークスペースまたはエージェントを使います。
資格情報と最小権限 #
シークレットは Jenkins credentials に保存し、可能な限り小さいスコープでバインドします。
withCredentials([file(credentialsId: 'registry-token-file',
variable: 'REGISTRY_TOKEN_FILE')]) {
sh 'registry-client --token-file "$REGISTRY_TOKEN_FILE"'
}マスキングはログへの偶発的な開示を減らしますが、同じスコープで動く信頼できないビルドコードからシークレットを保護できません。 文字列シークレットの Groovy 補間は、マスキング前に値がプロセス引数や Jenkins 生成スクリプトへ入る可能性があるため避けます。 ファイル資格情報は一時的な保護ファイルを提供しますが、同じビルドコンテキストの信頼できないコードはそれを読めます。 フォルダーごとに credential ID を制限し、信頼できない pull request をデプロイジョブから分離し、 エージェントには 1 つの環境向けの短命資格情報を与えます。
Pipeline の運用 #
multibranch ジョブまたは信頼できる webhook を使い、実行を正確なコミットに関連付けます。
保持ポリシーに従ってテストレポートと不変アーティファクトを保存します。ステージが失敗してもクリーンアップと通知が行われるよう post アクションを設定します。
認証と認可でコントローラーを保護し、プラグイン更新をコントローラーコードとしてレビューし、
JENKINS_HOME をバックアップし、ビルドエージェントをコントローラーの信頼境界の外に置きます。
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)