Jenkins 最佳实践
绝对不要让 Jenkins Master 执行构建任务。
Master 只做:
- Web UI
- Pipeline 调度
- Queue 管理
- 插件管理
- 安全控制
- 隐式脚本编译(Groovy)
Master 不允许任何 job 使用 agent any,否则会污染 Master。
-> 使用:
agent { label 'linux' }
Agent 设计原则:
- 构建环境隔离
- 可丢弃
- 自动扩容
- 不污染系统
- 最小化依赖
- 每次构建创建一个 pod
- 构建结束 pod 自动销毁
- 构建环境永远干净
- 微服务项目一一隔离
- 无限扩缩容
- 成本最低
- 本地构建环境容器化
- 不污染主机
- 版本可控
- 非容器化环境
- 适合固定环境(如老项目)
Pipeline = DevOps as Code
统一规范、可追溯、可 review、可复用。
坏例子 ❌
def x = []
for(i=0;i<1000;i++){
x.add(i*i)
}
推荐:将逻辑写成 shell / python 脚本
保持 Jenkinsfile 简洁。
推荐结构:
Checkout
Build
Unit Test
Lint
Security Scan
Docker Build
Push Image
Deploy (K8s)
Notify
stage('Test') {
parallel {
ui: { sh 'npm run test:ui' }
api: { sh 'pytest' }
}
}
withCredentials([string(credentialsId: 'gh-token', variable: 'TOKEN')]) {
sh "curl -H 'token: $TOKEN' https://api.github.com"
}
即:
myproject/
├── Jenkinsfile
├── src/
├── tests/
Jenkinsfile.dev
Jenkinsfile.staging
Jenkinsfile.prod
插件越多 = 越不稳定
企业经验:插件控制在 ≤ 40 个(否则升级风险巨大)
必装插件清单(最小稳定集)
| 分类 | 插件 |
|---|---|
| Pipeline 主体 | pipeline、workflow-aggregator |
| Git | git、github branch source |
| Credential | credentials-binding |
| Docker | docker、docker pipeline |
| Kubernetes | kubernetes |
| UI | blue ocean(可选) |
| 通知 | email-ext、dingding/slack |
禁装插件:
- Publish Over SSH(极不稳定)
- All-in-One Testing 插件(不可控)
- 古老插件(很多 2020 前的插件基本废弃)
Manage Jenkins -> Security
推荐:
- LDAP / AD
- GitHub OAuth
- OIDC(Keycloak)
- ssh-key
- secret-text
- username/password
即禁止:
echo "token: ${TOKEN}"
用:
echo "Using secret token"
/etc/default/jenkins
-Xms1g
-Xmx4g
-XX:+UseG1GC
避免卡顿、queue 堆积。
全部构建:只保留 20 次
日志:只保留 14 天
在 job 结束时加入:
cleanWs()
使用:
- DingTalk(钉钉)
- Feishu(飞书)
- Slack
- 企业微信
示例:
post {
always {
dingTalk(accessToken: CRED, message: "构建完成")
}
}
如你使用 Kubernetes(强烈推荐):
🌟 必须使用:
- kubectl rollout restart
- rollout status
- image digest(避免 latest)
示例:
sh """
kubectl set image deploy/myapi app=myapi:${BUILD_NUMBER}
kubectl rollout status deploy/myapi
"""
启用 Metrics Plugin
配合:
- Prometheus
- Grafana
监控指标:
| 指标 | 说明 |
|---|---|
| queue_length | 构建排队数量 |
| executor_usage | Agent 使用率 |
| build_duration | 构建耗时 |
| failed_builds | 失败率 |
| webhook_latency | Git 推送延迟 |
Kubernetes + StatefulSet + PVC + Velero + CronJob
Jenkins 备份内容
/var/jenkins_home
├── jobs
├── credentials.xml
├── users
├── secrets
└── plugins
备份方式:
- NFS
- S3
- Velero
- restic 快照
如果你要,我可以一键产出:
- Python CI/CD 全套 Jenkinsfile
- Node 前端/后端 Jenkinsfile
- Go 多模块 Jenkinsfile
- Java Maven/Gradle Jenkinsfile
- K8s 部署 + Docker 构建通用模板