Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Jenkins 最佳实践

1. Master 角色设计(不要构建!)

绝对不要让 Jenkins Master 执行构建任务。

Master 只做:

  • Web UI
  • Pipeline 调度
  • Queue 管理
  • 插件管理
  • 安全控制
  • 隐式脚本编译(Groovy)

Master 不允许任何 job 使用 agent any,否则会污染 Master。

-> 使用:

agent { label 'linux' }

2. Agent 最佳实践(构建全部下放)

Agent 设计原则:

  • 构建环境隔离
  • 可丢弃
  • 自动扩容
  • 不污染系统
  • 最小化依赖

生产推荐顺序

🥇 第一推荐:Kubernetes 动态 Agent

  • 每次构建创建一个 pod
  • 构建结束 pod 自动销毁
  • 构建环境永远干净
  • 微服务项目一一隔离
  • 无限扩缩容
  • 成本最低

🥈 第二推荐:Docker Agent

  • 本地构建环境容器化
  • 不污染主机
  • 版本可控

🥉 第三推荐:SSH Agent(传统模式)

  • 非容器化环境
  • 适合固定环境(如老项目)

3. Jenkinsfile 最佳实践(最重要)

🔹(1)所有 Job 必须使用 Pipeline(弃用 Freestyle)

Pipeline = DevOps as Code

统一规范、可追溯、可 review、可复用。

🔹(2)不要写 Groovy 复杂逻辑(可维护性差)

坏例子 ❌

def x = []
for(i=0;i<1000;i++){
    x.add(i*i)
}

推荐:将逻辑写成 shell / python 脚本

保持 Jenkinsfile 简洁。

🔹(3)Jenkinsfile 必须分 Stage

推荐结构:

Checkout
Build
Unit Test
Lint
Security Scan
Docker Build
Push Image
Deploy (K8s)
Notify

🔹(4)使用并行构建提升性能

stage('Test') {
    parallel {
        ui: { sh 'npm run test:ui' }
        api: { sh 'pytest' }
    }
}

🔹(5)不要把秘钥写进脚本,用 Credentials Binding

withCredentials([string(credentialsId: 'gh-token', variable: 'TOKEN')]) {
    sh "curl -H 'token: $TOKEN' https://api.github.com"
}

🔹(6)Jenkinsfile 放在 repo 根目录

即:

myproject/
├── Jenkinsfile
├── src/
├── tests/

🔹(7)不同环境分多个 Jenkinsfile(最佳)

Jenkinsfile.dev
Jenkinsfile.staging
Jenkinsfile.prod

4. 插件管理最佳实践

插件越多 = 越不稳定

企业经验:插件控制在 ≤ 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 前的插件基本废弃)

5. 安全最佳实践

🔐 必须启用 Global Security

Manage Jenkins -> Security

🔐 不使用 admin/admin 弱口令

推荐:

  • LDAP / AD
  • GitHub OAuth
  • OIDC(Keycloak)

🔐 Credentials 必须分类

  • ssh-key
  • secret-text
  • username/password

🔐 禁止在 Pipeline 输出敏感变量

即禁止:

echo "token: ${TOKEN}"

用:

echo "Using secret token"

6. 性能优化最佳实践

① Master JVM 优化

/etc/default/jenkins

-Xms1g
-Xmx4g
-XX:+UseG1GC

② Jenkins Home 放 SSD(关键!)

避免卡顿、queue 堆积。

③ 构建历史保留策略

全部构建:只保留 20 次

日志:只保留 14 天

④ 清理 workspace

在 job 结束时加入:

cleanWs()

7. 通知最佳实践(企业必配)

使用:

  • DingTalk(钉钉)
  • Feishu(飞书)
  • Slack
  • 企业微信

示例:

post {
    always {
        dingTalk(accessToken: CRED, message: "构建完成")
    }
}

8. Deployment 最佳实践(K8s)

如你使用 Kubernetes(强烈推荐):

🌟 必须使用:

  • kubectl rollout restart
  • rollout status
  • image digest(避免 latest)

示例:

sh """
kubectl set image deploy/myapi app=myapi:${BUILD_NUMBER}
kubectl rollout status deploy/myapi
"""

9. 监控最佳实践(Jenkins Metrics)

启用 Metrics Plugin

配合:

  • Prometheus
  • Grafana

监控指标:

指标 说明
queue_length 构建排队数量
executor_usage Agent 使用率
build_duration 构建耗时
failed_builds 失败率
webhook_latency Git 推送延迟

10. 高可用(HA)与备份最佳实践

🧩 最稳方案

Kubernetes + StatefulSet + PVC + Velero + CronJob

Jenkins 备份内容

/var/jenkins_home
 ├── jobs
 ├── credentials.xml
 ├── users
 ├── secrets
 └── plugins

备份方式:

  • NFS
  • S3
  • Velero
  • restic 快照

11. 扩展:最佳 Jenkinsfile 模板(Python/Node/Go/Java)

如果你要,我可以一键产出:

  • Python CI/CD 全套 Jenkinsfile
  • Node 前端/后端 Jenkinsfile
  • Go 多模块 Jenkinsfile
  • Java Maven/Gradle Jenkinsfile
  • K8s 部署 + Docker 构建通用模板