每次改完代码都要手动上传、打包、重启服务?测试环境反复手工部署太累?Jenkins 是使用最广的开源持续集成/持续部署(CI/CD)工具:你只需要把代码推到 Git,Jenkins 自动完成拉代码、构建、测试、部署,全程无人值守。这篇文章从零安装 Jenkins,并带你把第一条流水线跑起来。
一、Jenkins 是什么?能解决什么问题
传统部署流程:改代码 -> 打包 -> 上传服务器 -> 停服务 -> 重启,全靠手工,还容易出错。
Jenkins 的工作方式:
Git 提交代码
|
v
Jenkins 检测到变更(轮询或 Webhook 触发)
|
v
自动执行流水线:拉代码 -> 构建/测试 -> 部署到服务器 -> 通知结果
| 场景 | 传统方式 | Jenkins 方式 |
|---|---|---|
| 发布新版本 | 手工打包上传 | 提交代码自动发布 |
| 每次改完都要测 | 手动跑测试 | 流水线自动跑 |
| 发布结果反馈 | 等同事喊 | 构建成功/失败自动通知 |
二、安装 Jenkins
前提:已安装 JDK(Jenkins 需要 Java)。
java -version # 需要 JDK 8+,没有就装:yum install -y java-1.8.0-openjdk
CentOS 7 安装:
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
yum install -y jenkins
Ubuntu/Debian 安装:
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | tee /etc/apt/sources.list.d/jenkins.list > /dev/null
apt update && apt install -y jenkins
启动:
systemctl start jenkins
systemctl enable jenkins
systemctl status jenkins
ss -tlnp | grep 8080 # Jenkins 默认端口 8080
三、初始化配置
第 1 步:解锁 Jenkins
浏览器访问 http://服务器IP:8080,会要求输入初始管理员密码:
cat /var/lib/jenkins/secrets/initialAdminPassword
第 2 步:选择插件
- 新手直接选"安装推荐的插件"(Install suggested plugins),包含 Git、Pipeline、构建工具等常用插件;
- 也可以自定义选择需要的插件。
第 3 步:创建管理员账号
填用户名、密码、邮箱,保存后进入主界面。
四、配置 Git 和凭据
第 1 步:确认 Git 已安装
yum install -y git
第 2 步:在 Jenkins 里添加 Git 仓库凭据
- 系统管理 -> 凭据(Credentials)-> 全局 -> 添加凭据;
- 类型选 "Username with password"(或 SSH Key);
- 填 Git 仓库的用户名密码/Token,保存。
五、创建第一条流水线(Pipeline)
方式 A:图形化自由风格项目(新手友好)
- 新建任务 -> 输入名称 -> 选择"自由风格软件项目";
- 源码管理:选 Git,填仓库地址,凭据选刚才添加的;
- 构建触发器:选"轮询 SCM",填
H/5 * * * *(每 5 分钟检查一次代码变更); - 构建环境:勾选需要的选项;
- 构建步骤:添加"执行 shell",填构建命令:
# 示例:PHP 项目无编译,直接检查语法 + 部署
php -l index.php
rsync -avz --delete /var/lib/jenkins/workspace/项目名/ root@目标服务器:/www/wwwroot/site/
- 保存后点"立即构建",看控制台输出,蓝色=成功,红色=失败。
方式 B:Pipeline 流水线脚本(推荐,可版本化管理)
新建任务 -> 选择"流水线"(Pipeline)-> 在 Pipeline 脚本里写:
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
git branch: 'main', url: 'https://git.example.com/team/web.git',
credentialsId: 'my-git-cred'
}
}
stage('构建') {
steps {
sh 'npm install && npm run build'
}
}
stage('部署') {
steps {
sh 'rsync -avz --delete dist/ root@192.168.1.20:/www/wwwroot/site/'
}
}
}
post {
success { echo '部署成功!' }
failure { echo '部署失败,请查看日志' }
}
}
这样流水线本身也可以存到 Git 仓库(Jenkinsfile),实现"配置即代码"。
六、Git 提交自动触发(Webhook)
轮询 SCM 有延迟,想要"推代码就立刻构建",配置 Webhook(以 Gitea/GitHub 为例):
第 1 步:Jenkins 装插件并生成触发地址
- 插件管理安装 "Generic Webhook Trigger";
- 构建触发器里勾选,记录 Jenkins 的 Webhook URL:
http://JenkinsIP:8080/generic-webhook-trigger/invoke;
第 2 步:在 Git 仓库后台配置 Webhook
Gitea/GitHub 仓库 -> Webhooks -> 添加:
URL: http://JenkinsIP:8080/generic-webhook-trigger/invoke?token=自定义Token
事件:Push
之后每次 git push,仓库会自动通知 Jenkins 触发构建。
七、构建产物归档与邮件通知
归档构建产物:
在流水线 post 或自由风格项目"构建后操作"里添加:
archiveArtifacts artifacts: 'dist/**'
邮件通知:
- 系统管理 -> 系统配置 -> 邮件通知,填 SMTP 服务器、账号密码、默认收件人;
- 流水线 post 里加:
post {
failure {
mail to: 'ops@example.com', subject: "构建失败:${env.JOB_NAME}",
body: "查看详情:${env.BUILD_URL}"
}
}
八、常见问题排查
1. 初始密码文件找不到
看看 Jenkins 是否真的启动了,或路径不同:
find / -name initialAdminPassword 2>/dev/null
2. 构建时提示 git: command not found
Jenkins 运行用户(jenkins)的 PATH 问题,在构建步骤里用绝对路径或加环境变量:
environment { PATH = "/usr/bin:${env.PATH}" }
3. 构建一直卡在拉取代码
检查凭据是否正确、仓库地址能否被 Jenkins 服务器访问(内网 Git 要确认网络通)。
4. rsync 部署提示 Permission denied
Jenkins 运行用户没有权限或 SSH 密钥没配。给 jenkins 用户配置到目标服务器的 SSH 免密:
sudo -u jenkins ssh-keygen -t ed25519
sudo -u jenkins ssh-copy-id root@192.168.1.20
5. 端口 8080 被占用
修改 /etc/sysconfig/jenkins 里的 JENKINS_PORT,或改用其他端口。
总结
Jenkins 的核心就是"把部署动作固化成流水线":安装 -> 初始化 -> 配置 Git 凭据 -> 写 Pipeline(拉代码/构建/部署)-> 触发(轮询或 Webhook)-> 通知。跑通第一条流水线后,发布就变成了"推代码"这一个动作。配合 Jenkinsfile 存到 Git,整个 CI/CD 流程可版本化、可复用,团队协作效率直接上一个台阶。




