用途
Jenkins 是领先的开源自动化服务器,用于构建、测试和部署应用程序。本技能适用于以下场景:设置 Jenkins 流水线(声明式或脚本式)、配置 Jenkins 代理与执行器、管理 Jenkins 插件与安全、创建用于流水线复用的共享库、将 Jenkins 与外部工具集成。
前提条件
- Jenkins 服务器(2.x 或更高版本)
- Jenkins 管理员访问权限
- Jenkins 服务器上安装 Java 11+
- 对流水线有基本的 Groovy 理解
主要能力
声明式流水线
在仓库根目录创建 Jenkinsfile,使用 pipeline 块定义 agent、environment、stages 和 post。示例中展示了构建、测试、部署三个阶段,以及失败时发送邮件通知。
代理配置
支持多种代理类型:
- Docker 代理:通过
agent { docker { image 'node:20' args '-v /tmp:/tmp' } }在容器中执行。 - Kubernetes 代理:通过
agent { kubernetes { yaml '''...''' } }定义 Pod 模板,包含 node 和 docker 容器。 - 标签代理:通过
agent { label 'linux && docker' }选择带特定标签的代理。
参数化构建
使用 parameters 块定义 string、choice、booleanParam 等参数,并在 when 条件中通过 params 引用。
凭据管理
通过 environment { AWS_CREDS = credentials('aws-credentials') } 或 withCredentials 绑定用户名密码等凭据,避免明文暴露。
并行阶段
在 stage 中使用 parallel 块同时运行多个子阶段,例如单元测试、集成测试和端到端测试。
共享库
共享库结构包含 vars/、src/、resources/。在 vars/ 中定义全局步骤(如 buildApp.groovy),通过 @Library('my-shared-library') _ 引入并在流水线中调用。
脚本式流水线
使用 node('linux') { ... } 块,结合 try/catch/finally 进行错误处理和清理(如 cleanWs())。
插件管理
列出了常用插件:workflow-aggregator、git、docker-workflow、kubernetes、credentials-binding、blueocean、job-dsl、configuration-as-code。可通过 Jenkins CLI 或 init.groovy.d 安装。
配置即代码(JCasC)
通过 jenkins.yaml 文件定义系统消息、执行器数量、安全域、授权策略和凭据,实现 Jenkins 配置的版本化管理。
多分支流水线
自动发现包含 Jenkinsfile 的分支,可在 Jenkins UI 中通过“New Item > Multibranch Pipeline”配置。在 Jenkinsfile 中可使用 when { anyOf { branch 'main'; branch 'release/*' } } 控制分支特定行为。
使用方式
- 在仓库根目录创建 Jenkinsfile,编写声明式或脚本式流水线。
- 根据需求配置代理(Docker、Kubernetes 或标签)。
- 定义参数、凭据和并行阶段。
- 将可复用逻辑抽取到共享库。
- 通过插件管理安装必要插件。
- 使用 JCasC 管理配置。
- 配置多分支流水线以自动发现分支。
适用场景
- 持续集成与持续部署(CI/CD)
- 多环境部署(dev、staging、prod)
- 容器化构建与测试
- Kubernetes 环境下的动态代理
- 需要复用流水线逻辑的团队
限制与常见问题
- 流水线语法错误:Jenkinsfile 解析失败。解决方案:使用 Jenkins UI 中的 Pipeline Syntax 生成器,或用 jenkins-cli 验证。
- 代理无法连接:构建代理断开。解决方案:检查代理日志、验证网络连通性、增加超时设置。
- 内存不足:Jenkins 崩溃或构建因 OOM 失败。解决方案:在 JAVA_OPTS 中增加堆大小、清理旧构建。
最佳实践
- 大多数场景使用声明式流水线。
- 实现共享库以复用代码。
- 将 Jenkinsfile 存储在源代码管理中。
- 使用凭据插件管理机密。
- 在 post 块中实现适当的清理。
- 配置构建保留策略。
- 使用 Blue Ocean 获得现代 UI 体验。
相关技能
github-actions(GitHub 原生 CI/CD)、kubernetes-ops(K8s 部署目标)、docker-management(容器构建)。