Jenkins和CI piplines
(部分: 技術和基礎設施)
簡短摘要
Jenkins仍然是iGaming混合基礎設施中的通用CI「引擎」:它結合了應用程序組裝,容器化,測試,安全檢查和人工制品發布。成功是作為代碼(Declarative/Multibranch),共享圖書館,Kubernetes的臨時代理商,嚴格的安全和秘密,GitOps密碼管理以及性能和成本指標的管道。
1)在iGaming下的Jenkins架構
控制器(LTS)+代理:控制器上的插件最少;工作被轉移到代理上。
臨時代理:在K8s/動態 「jnlp」下發射(快速啟動,清潔環境)。
工作隔離:文件夾/權利(Folders+Role-Based Strategy),最小權限的授權。
觀察: 導出度量(latency,隊列),集中階段日誌,piplines中的trace-ID.
2)piplines模式: declarative和Multibranch
當Declarative:具有均勻步驟的標準輸送機時,清晰的「後」陰影。
當腳本:罕見的「非標準」分支。
Multibranch:每個分支/PR的自動管道;「只有活躍分支」政策。
基本Declarative風格
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示例(Declarative)
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/taints」分離重型組件。
4)共享圖書館: DRY和統一標準
在Shared Library中執行一般步驟(linters, 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'
}
}
}
}
}
提示:復習庫(「tags」),覆蓋單元步驟測試,管理CHANGELOG。
5)秘密和憑證
Credentials Binding: `usernamePassword`, `string`, `file`, `sshUserPrivateKey`.
Secret scopes:最低限度;僅在所需階段使用。
保密管理器:外部存儲提供商(KMS/Secrets Manager/HashiCorp Vault)。
groovy withCredentials([string(credentialsId: 'cosign-key', variable: 'COSIGN_KEY')]) {
sh 'cosign sign --key $COSIGN_KEY $IMAGE'
}
6)並發,矩陣,緩存
Matrix組件
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)安全檢查和合規性
DAST CI的SCA/SAST/秘密掃描在一個單獨的環境中。
SBOM (Syft/CycloneDX)、工件簽名(cosign)、「無簽名-不丟棄」策略。
策略門:在關鍵CVE時停止管道;公關報告。
PII路徑:不為敏感裝配編寫秘密、掩蓋變量、單獨代理。
8)發布人工制品並與CD整合
Registry: Docker/OCI具有重新定義的策略,即標簽的可變性。
Package Repos: Maven/NPM/PyPI proxy+cache.
CD觸發器:將事件發送到Argo CD/Flagger或在GitOps清單存儲庫中創建PR。
9) Jenkins Configuration as Code (JCasC) и GitOps
將控制器的config保持為代碼:jobs template, credenschles(鏈接),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 review,促銷dev→stage→prod中;秘密-通過變量/外部管理器。
10)可觀察性、可靠性和成本
度量標準:隊列、階段持續時間、重新啟動百分比、代理帶寬。
故障:「retry」、「timeout」、「stable」標記flaky測試、ChatOps通知。
FinOps:自動關閉閑置代理、並行裝配限制、文件夾/命令配額。
11) piplines在不同的任務
Backend/Web服務
Lint/units → SAST/SCA → Build → SBOM/Sign → Publish →(CD觸發器)。
Data/ETL
模式驗證(dbt測試)→工件生成→靜態SQL分析→模型和文檔發布。
ML/LLM
數據檢查/許可證→現場代理培訓→導出ONNX/TensorRT → perf測試(latency/tokens/s)→簽名和發布模型。
12)Runabuki(典型事件)
隊列正在增長:添加代理,檢查「下垂」的管線和限制。
遊動裝配:在代理容器中踢工具版本;禁用共享工作區。
Logs中的「鴨子」密碼:刪除構建標記,替換credenschle,進行審計;添加掩碼。
控制器衰減:從backup JCasC+中恢復復制job/插件存儲。
13)實施支票
1.具有最小插件集的Jenkins LTS;其他一切都是代理。
2.短暫的K8s代理、資源限制、層緩存。
3.Declarative/Multibranch, PR驗證,「post {always {cleanWs()}」.
4.共享圖書館並進行翻新;統一的質量/安全步驟。
5.Credentials Binding+外部秘密;最小的漏洞。
6.SCA/SAST/Secret-scan/DAST,SBOM和圖像簽名。
7.JCasC和GitOps配對控制;公關評論變化。
8.度量/alerta/ChatOps;retrai/taymauts;文物和雜誌。
9.存儲/回避政策,工作場所的自動衛生。
10.記錄的runabooks和常規遊戲日。
14)反模式
控制器「像萬物服務器一樣」:重型裝配和插件。
Scripted jobs,無翻轉和代碼評論。
混合秘密和邏輯;具有廣泛權利的credenschles。
代理很少/它們是恒定的→環境漂移,flaky測試。
CVE上沒有SBOM/工件和門簽名。
「手動」配對控制,沒有JCasC/GitOps。
結果
詹金斯仍然是強大而靈活的CI核心。通過將配置轉換為代碼(JCasC),通過在Shared Libraries中標準化步驟,在短期K8s代理上啟動構建,並將安全/簽名/SBOM直接嵌入到管道中,您將獲得可預測的版本、可控制的成本以及對iGaming峰值負載的抵抗力。