Jenkins 入门路线
Jenkins 是持续集成和持续交付工具。它把“拉代码、安装依赖、编译、测试、打包、构建镜像、部署、通知”这些重复操作自动化,减少人工发布带来的遗漏和误操作。
零基础可以先把 Jenkins 理解成一个自动执行脚本的平台,只是它比普通脚本多了页面管理、触发器、凭据、日志、权限和流水线状态。
Jenkins 解决什么问题
| 传统人工发布 | Jenkins 流水线 |
|---|---|
| 开发手动登录服务器执行命令 | 统一由流水线执行 |
| 发布步骤靠口头记忆 | Jenkinsfile 固化步骤 |
| 密码写在脚本里 | 使用 Credentials 管理凭据 |
| 不知道谁发了什么版本 | 每次构建都有记录 |
| 构建失败后难复现 | 控制台日志完整保留 |
基本工作流程
mermaid
flowchart TD
A["开发提交代码"] --> B["Git Webhook 或定时触发"]
B --> C["Jenkins 创建构建任务"]
C --> D["Agent 拉取代码"]
D --> E["安装依赖"]
E --> F["编译和单元测试"]
F --> G{"测试是否通过"}
G -- "否" --> H["停止流水线并通知"]
G -- "是" --> I["打包制品"]
I --> J["构建 Docker 镜像"]
J --> K["部署到目标环境"]
K --> L["健康检查和通知结果"]核心概念
| 概念 | 说明 |
|---|---|
| Job | Jenkins 中的任务,可以是自由风格任务,也可以是 Pipeline |
| Pipeline | 用代码描述的流水线,通常写在 Jenkinsfile |
| Stage | 流水线中的阶段,例如构建、测试、部署 |
| Step | 阶段里的具体动作,例如执行一条 shell 命令 |
| Agent | 实际执行任务的机器或容器 |
| Workspace | Jenkins 为当前构建准备的工作目录 |
| Credentials | 凭据管理,用来保存账号、密码、Token、SSH key |
| Artifact | 构建产物,例如 jar、zip、测试报告 |
第一个 Jenkinsfile
下面是一个 Java 项目的最小 Pipeline:
groovy
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Build') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
stage('Archive') {
steps {
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
}
}
}
}逐段理解:
| 代码 | 含义 |
|---|---|
pipeline | 声明这是一个流水线 |
agent any | 使用任意可用节点执行 |
stages | 阶段集合 |
stage('Build') | 一个名为 Build 的阶段 |
sh 'mvn ...' | 在 Linux Agent 上执行命令 |
archiveArtifacts | 归档构建产物,方便下载和追踪 |
如果 Jenkins 运行在 Windows Agent 上,命令通常使用 bat:
groovy
bat 'mvn clean package -DskipTests'凭据管理
不要把密码、Token、服务器私钥直接写进 Jenkinsfile。正确做法是放到 Jenkins 的 Credentials 中,然后在流水线里引用。
groovy
withCredentials([string(credentialsId: 'docker-token', variable: 'TOKEN')]) {
sh 'echo "$TOKEN" | docker login registry.example.com -u demo --password-stdin'
}注意:
credentialsId是 Jenkins 页面中创建的凭据 ID。- Jenkins 会尽量在日志中隐藏敏感值。
- 凭据权限要按项目和环境拆分,不要所有任务共用生产权限。
常见流水线阶段
| 阶段 | 目标 | 常见命令 |
|---|---|---|
| Checkout | 获取代码 | checkout scm |
| Install | 安装依赖 | npm ci、mvn dependency:resolve |
| Lint | 代码规范检查 | npm run lint |
| Test | 自动化测试 | mvn test、npm test |
| Build | 编译打包 | mvn package、npm run build |
| Docker Build | 构建镜像 | docker build -t app:${BUILD_NUMBER} . |
| Deploy | 部署 | kubectl apply -f deploy.yaml |
| Notify | 通知 | 邮件、企微、钉钉、飞书 |
发布策略
初学时可以先做“构建成功后部署测试环境”。生产环境建议增加保护:
mermaid
flowchart TD
A["代码合并主分支"] --> B["自动构建和测试"]
B --> C["部署测试环境"]
C --> D["人工确认"]
D --> E["部署生产环境"]
E --> F["健康检查"]
F --> G{"是否正常"}
G -- "正常" --> H["发布完成"]
G -- "异常" --> I["回滚上一版本"]生产流水线至少应该具备:
- 明确的发布版本号。
- 人工确认或审批。
- 健康检查。
- 失败自动停止。
- 可执行的回滚方案。
- 发布通知和记录。
常见问题
| 现象 | 原因 | 处理方式 |
|---|---|---|
| 拉代码失败 | Git 凭据、网络或分支错误 | 检查 Credentials、仓库地址、分支名 |
| 构建命令本地能跑 Jenkins 不能跑 | Agent 环境缺 JDK、Maven、Node | 在 Agent 安装依赖或使用容器化构建 |
| 流水线卡住 | 等待输入、命令无输出、资源不足 | 查看 Console Output 和节点状态 |
| 部署成功但服务不可用 | 配置、端口、探针或依赖异常 | 查看应用日志和健康检查 |
| 密码泄露风险 | 明文写入脚本或日志 | 改用 Credentials,并清理历史记录 |
入门练习
- 创建一个 Pipeline Job,让它从 Git 仓库拉代码。
- 给项目添加
Jenkinsfile,包含 Build、Test、Archive 三个阶段。 - 故意让测试失败,观察 Jenkins 如何停止流水线。
- 创建一个凭据,在 Jenkinsfile 中读取它,但不要把值打印出来。
- 给流水线增加构建成功和失败通知。
小结
Jenkins 的核心价值是把发布步骤代码化、自动化、可追踪。初学时先学会 Pipeline、Stage、Agent、Credentials 和 Artifact,再逐步接入 Docker、Kubernetes、审批、通知和回滚。生产流水线不是越复杂越好,而是每一步都要能解释、能复现、能排障。
