ジェンキンスとCIパイプライン
(セクション: 技術とインフラ)
概要
Jenkinsは、アプリケーションアセンブリ、コンテナ化、テスト、セキュリティ検証、アーティファクトパブリッシングを統合しています。成功はコードとしてのパイプライン(宣言/マルチブランチ)、共有ライブラリ、Kubernetesの一時的なエージェント、ハードセキュリティとシークレット、構成のGitOps管理、パフォーマンスとコストメトリクスです。
1) iGamingのJenkinsアーキテクチャ
コントローラ(LTS)+エージェント:コントローラの最小プラグイン;仕事はエージェントに転送されます。
一時的なエージェント:動的K8s/under 'jnlp'(高速起動、クリーンな環境)で実行されます。
仕事の分離:フォルダ/権利(フォルダ+ロールベースの戦略)、最小の権利のためのクレジット。
観測可能性:メトリックのエクスポート(レイテンシ、キュー)、集中ステージログ、パイプラインのトレースID。
2)配管パターン: 宣言とマルチブランチ
Declarative:標準パイプラインと均一なステージの場合、'post'ステップをクリアします。
スクリプト化された場合:まれな「カスタム」ブランチ。
マルチブランチ:各ブランチ/PRの自動パイプライン;アクティブブランチのみのポリシー。
基本的な宣言パイプライン
groovy pipeline {
agent { label 'k8s' } // или agent { kubernetes {... } }
options {
timestamps()
ansiColor('xterm')
buildDiscarder(logRotator(numToKeepStr: '50'))
timeout(time: 30, unit: 'MINUTES')
disableConcurrentBuilds()
}
environment {
REGISTRY = 'registry. example. com'
IMAGE = "${env. REGISTRY}/payments:${env. GIT_COMMIT}"
}
stages {
stage('Checkout') {
steps { checkout(scm) }
}
stage('Lint & Unit') {
parallel {
stage('Lint') { steps { sh 'make lint' } }
stage('Unit') { steps { sh 'make test' } }
}
}
stage('SCA/SAST') {
steps {
sh'make deps_audit'//SCA (dependencies)
sh'make sast '//static analysis
}
}
stage('Build Image') {
steps { sh 'docker build -t $IMAGE. && docker push $IMAGE' }
}
stage('SBOM & Sign') {
steps {
sh 'syft $IMAGE -o spdx-json > sbom. json'
sh 'cosign sign --key $COSIGN_KEY $IMAGE'
archiveArtifacts artifacts: 'sbom. json', fingerprint: true
}
}
}
post {
success { echo '+ Build OK' }
failure { echo '- Build failed'; sh 'printenv sort sed -n "1,50p"' }
always { cleanWs() }
}
}
3) Kubernetesエージェントおよびコンテナ環境
例podTemplate(宣言型)
groovy pipeline {
agent {
kubernetes {
yaml """apiVersion: v1 kind: Pod spec:
serviceAccountName: jenkins containers:
- name: build image: docker:27-dind securityContext: { privileged: true }
- name: tools image: alpine:3. 20 command: ['cat']
tty: true
"""
defaultContainer 'tools'
}
}
stages {
stage('Build in DinD') {
steps {
container('build') {
sh '''
dockerd-entrypoint. sh & sleep 5 docker build -t $IMAGE.
docker push $IMAGE
'''
}
}
}
}
}
練習:共通の'emptyDir'/リモートキャッシュを介したレイヤーキャッシュ;CPU/RAM;重いアセンブリを分離するための'nodeSelector/tains'制限。
4)共有ライブラリ: DRYおよびUniform Standards
共有ライブラリで共通の手順(Linter、 SAST、アセンブリ、パブリッシング)を実行します。
groovy
// vars/withQuality. groovy def call(Closure body) {
stage('Quality Gate') {
parallel(
"Lint": { sh 'make lint' },
"Unit": { sh 'make test' },
"SCA": { sh 'make deps_audit' }
)
}
body()
}
使用法:
groovy
@Library('ci-lib@v3') _
pipeline {
agent any stages {
stage('Pipeline') {
steps {
withQuality {
sh 'make build'
}
}
}
}
}
ヒント:ライブラリのバージョン('タグ')、ステップのユニットテストでカバー、CHANGELOGを保ちます。
5)秘密と資格情報
認証情報バインド:'usernamePassword'、 'string'、 'file'、 'sshUserPrivateKey'。
秘密のスコープ:最低の権利;適切な段階でのみ使用してください。
シークレットマネージャ:外部リポジトリ(KMS/Secrets Manager/HashiCorp Vault)のプロバイダ。
groovy withCredentials([string(credentialsId: 'cosign-key', variable: 'COSIGN_KEY')]) {
sh 'cosign sign --key $COSIGN_KEY $IMAGE'
}
6)並行、行列、キャッシュ
マトリックスアセンブリ
groovy stage('Test Matrix') {
matrix {
axes {
axis { name 'PY'; values '3. 10', '3. 12' }
axis { name 'DB'; values 'mysql', 'postgres' }
}
stages {
stage('Run') { steps { sh 'pytest -q' } }
}
post { always { junit 'reports/.xml' } }
}
}
キャッシュ:Dockerレイヤーキャッシュ、依存性キャッシュ('~/。m2'、 '~/。cache/pip')ボリューム上;ステージ間のアーティファクト-'stash/unstash'またはアーティファクトストレージ。
7)安全点検および承諾
SCA/SAST/Secret-scan in CI、 DASTを別の環境で実行します。
SBOM (Syft/CycloneDX)、 artifact signature (cosign)、 unsigned-no deploy policy。
ポリシーゲート:重要なCVEのパイプラインを停止します。PRのレポート。
PII輪郭:機密情報、マスク変数、機密アセンブリの個別エージェントを記録しないでください。
8)アーティファクトの発行とCDの統合
レジストリ:Docker/OCIと保持ポリシー、免疫タグ。
パッケージリポジトリ:Maven/NPM/PyPIプロキシ+キャッシュ。
CDトリガー:Argo CD/Flaggerにイベントを送信するか、GitOpsマニフェストリポジトリでPRを作成します。
9)コードとしてのJenkinsの設定(JCasC)
コントローラの設定をコードとして保持します:テンプレートジョブ、クレジット(リンク)、RBAC、エージェント。
yaml jenkins:
systemMessage: "Jenkins (iGaming CI)"
numExecutors: 0 authorizationStrategy:
roleBased:
roles:
global:
- name: "readers"
pattern: "."
permissions: ["Overall/Read"]
nodes:
- permanent:
name: "edge-builder"
remoteFS: "/home/jenkins"
labels: "docker"
unclassified:
location:
url: "https://ci. example. com/"
credentials:
system:
domainCredentials:
- credentials:
- string:
id: "cosign-key"
description: "Cosign key ref"
secret: "${COSIGN_KEY_FROM_ENV}"
練習:config-Git、 PRレビュー、dev→stage→prod promotion;秘密-変数/外部マネージャを介して。
10)観察可能性、信頼性および費用
メトリクス:キュー、ステージの期間、再起動率、エージェントのスループット。
失敗:'retry'、 'timeout'、 'stable' marking of flaky tests、 notifications in ChatOps。
FinOps:アイドルエージェントの自動シャットダウン、同時アセンブリ制限、フォルダ/コマンドクォータ。
11)異なった仕事のためのパイプライン
バックエンド/Webサービス
Lint/Units→SAST/SCA→Build→SBOM/Sign→Publish→(CDトリガー)。
データ/ETL
dbt test→generate artifacts→static SQL analysis→publish models and documentation。
ML/LLM
データ/ライセンス検証→スポットエージェントでのトレーニング→ONNX/TensorRTエクスポート→perfテスト(レイテンシ/トークン/s)→モデル署名とパブリッシング。
12) Runabooks(典型的な事件)
キューは成長しています:エージェントの追加、「中断」パイプラインのチェック、並行限界。
アセンブリフロート:エージェントコンテナ内のツールのキックバージョン。共有ワークスペースを無効にします。
秘密はログに「漏れました」:ビルドログを削除し、クレジットを交換し、監査を行います。マスキングを追加します。
コントローラドロップ:バックアップJCasC+ジョブ/プラグインストレージからのリカバリがバージョン管理されます。
13)実装チェックリスト
1.プラグインの最小セットでJenkins LTS;他の全ては捜査官にある。
2.一時的なK8sエージェント、リソース制限、レイヤーキャッシュ。
3.宣言/マルチブランチ、PR検証、'post {always {cleanWs()}}'。
4.バージョン管理機能を備えた共有ライブラリ;均一な質/安全ステップ。
5.認証情報バインディング+外部シークレット;最小限のスコープ。
6.SCA/SAST/シークレットスキャン/DAST、 SBOM、画像署名。
7.JCasCおよびGitOps構成管理;変更のPRレビュー。
8.メトリック/アラート/ChatOps;リトリート/タイムアウト;アーティファクトとジャーナル。
9.ストレージ/保持ポリシー、ワークスペースの自動衛生。
10.文書化されたrunabooksおよび規則的なゲーム日。
14) Antipatterns
コントローラー「すべてのサーバーのように」:重いアセンブリとその上のプラグイン。
バージョン管理とコードレビューなしでスクリプト化されたジョブ。
秘密とログを混合します。広い権利の貸付け金。
エージェントは数少ない/それらは一定の→ドリフト環境、薄板なテストです。
SBOMの不在/CVEによるアーティファクトとゲートの署名。
「手動」設定制御、JCasC/GitOpsなし。
概要
Jenkinsは依然として強力で柔軟なCIコアです。構成をコード(JCasC)に変換し、共有ライブラリのステップを標準化し、一時的なK8sエージェント上でビルドを実行し、セキュリティ/署名/SBOMをパイプラインに直接埋め込むことで、予測可能なリリース、制御コスト、iGamingのピーク負荷回復力が得られます。