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峰值负载的抵抗力。