如何通过Jenkins在CentOS上实现自动化部署,轻松提升项目上线效率?
- 内容介绍
- 文章标签
- 相关推荐
说到前言,告别“手动部署”的痛苦时刻
各位开发同学好!老实说,还在为每次项目上线前的“手动部署”焦头烂额吗?相信你我都经历过这些痛点
- 深夜加班发版: 每次上线都要手动打包、上传、解压、重新启动。动作一多,难免手抖输错命令,导致回滚又是一番折腾。
- 环境不一致惹祸端: 开发环境、测试环境、生产环境配置参差不齐。“在我机器上跑没问题”却在线上炸锅,排查耗时极长。怎么说呢,
- 发布流程不可控: 谁发的?什么时候发的,发了啥改动?没有留痕,出问题甩锅无据,复盘无从下手。
- 重复劳动效率低: 建立、测试、部署全靠人工跑流程。高智商人才干着搬运工的活,太不划算!
今天我就带大家用 Jenkins + CentOS 搭建一套自动化部署流水线。实现代码提交即自动建立、测试、部署让项目上线效率瞬间起飞,彻底解放双手!
说到第一阶段,CentOS 上搭建 Jenkins 基础环境
工欲善其事必先利其器。Jenkins 基于 Java 运行,且官方推荐通过 YUM 源安装以便后续维护更新。
1. 安装 Java 运行环境
痛点提示: 忘装 JDK 或版本不对,Jenkins 启动直接报错。我建议显式安装 JDK 11 或 JDK 17。按理说,
# 安装 OpenJDK 17
sudo yum install -y java-17-openjdk-devel
# 验证安装
java -version
javac -version
2. 添加 Jenkins YUM 源并导入密钥
痛点提示: 国内直连官网源极慢甚至超时。其实,若速度慢可替换为清华/阿里云镜像源地址。
# 下载官方 repo 配置
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
# 导入 GPG Key 验证包合法性
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
# 清理缓存并重建元数据
sudo yum clean all && sudo yum makecache
3. 安装并启动 Jenkins
# 安装最新稳定版
sudo yum install -y jenkins
# 配置防火墙放行默认端口 8080
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
# 开启服务并设置开机自启
sudo systemctl start jenkins
sudo systemctl enable jenkins
# 检查状态确认运行正常
systemctl status jenkins
4. 初始化解锁与基础配置
-
浏览器访问
-
获取初始密码:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword - 安装推荐插件或稍后按需安装。怎么说呢,
- 创建管理员账号完成初始化。
- <>设置关键工具链 :Manage Jenkins → Tools → 分别配置 JDK、Maven/Gradle、Git、Ant方法。若选择“自动安装”需确保服务器能联外网;生产环境建议预装好填写本地绝对方法。
第二阶段的观点是。主要流水线配置——从代码到制品
Jenkins 安装好只是个“空壳”,接下来定义“怎么建立”、“怎么部署”。
1 . 新建建立任务
- FreeStyle Project :适合简单项目、Ant/Maven 脚本型项目。
- Pipeline :推荐!用 J比如enkinsfile 作为代码管理流水线。支持复杂阶段控制,还有并行,再有回滚等高级特性。
以 FreeStyle + Android Ant 项目为例 :
- General :勾选 “GitHub/GitLab hook trigger for GITScm polling” 或 “Poll SCM”。
- 源码管理 :选择 Git,填仓库 URL 、凭据 、指定分支。
- 建立触发器 :勾选 “GitHub hook trigger for GITScm polling”。
- 建立环境 :勾选 “Inject environment variables”、或使用 Config File Provider 注入配置文件。
- 建立步骤 → Execute Shell :
- > GitLab / GitHub / Gitee / Coding 操作基本一致 :Settings → Webhooks → Add Webhook{{}
- > URL : http://你的 JenkinsIP:8080/github-webhook/ 或 http://.../gitlab-webhook/ 或通用 http://.../generic-webhook-trigger/invoke?token=xxx {{} < l i>> Secret Token : 生成随机字符串,在 Jenkins 全局安全配置或 Generic Webhook Trigger 插件中校验。防恶意调用 .{{}> Trigger : Push events 、Tag push events 、Merge Request events 按需勾选 .{{}> SSL verification : 内网自签证书可关闭;公网必须开启 .{{}> 测试一下!点击 Test 按钮,查看 Response Code 是否 `200`,去 Jenkins 日志看有无 `Received webhook` .{{}{{}>}}
#!/bin/bash
set -ex # 报错即停止 、打印命令
echo " 开始建立..."
# 若全局工具配置了 Ant 名为 'DefaultAnt',可直接用 ant 命令
ant clean release
# 建立产物归档方法
ARTIFACT_PATH="bin/app-release.apk"
if;n
echo " 构造失败 未找到 APK"
exit fi
echo " 构造完成 : $ARTIFACT_PATH "
# 若使用 Pipeline 推荐用 archiveArtifacts;FreeStyle 需在 “构造后操作” 勾选 “Archive artifacts” 填 bin/*.apk }}
推荐写法 : Declarative Pipeline 放入代码库根目录 :{{}
pipeline {
agent any // 或 label 'build-agent'
tools {
jdk 'JDK17'
maven 'Maven3_9'
// ant 'DefaultAnt' // 若需 Ant }
environment {
// 敏感信息用 credentials 获取 DEPLOY_SERVER = 'deploy@prod-server'
DEPLOY_PATH = '/opt/app/current' }
stages {
stage { steps { checkout scm }}
stage {
steps {
sh '''
set -ex ./mvnw clean package -DskipTests # 或 ant release '''}}
stage { steps { sh './mvnw test' }}
stage {
when { branch 'main' } // 主分支才自动部署 steps {
script {
// 调用统一部署脚本或直接写 SSH/SCP sh '''
./deploy.sh ${DEPLOY_SERVER} ${DEPLOY_PATH} '''}}}} post { always { cleanWs // 清理工作区 }}}
{{}
配置 Git Webhook ——实现“推代码即触发”的关键一步 {{}
> 使用者痛点 :> 配好了 JenkinsJob,本地 git push 半天没反应?说起来,九成是 Webhook 没通!{{}
< h4>
> 常见坑 & 排查 {{}{{}>}} < ul>
> < l i>> 防火墙 / 安全组没放行 8080 或反向代理端口 .<{/}> < l i>> Nginx反向代理未转发 Header 导致插件识别失败 .<{/}> < l i>> 凭据权限不足。Webhook 能触发但拉取代码报 Permission denied .<{/}> {{}{{}>}}
< h2 id =" deploy-script ">
第三阶段 : 自动化部落脚本当落地 — —Shell 脚本常用方法 {{}{{}>}} < p>
> 构造产物出来后,怎么安全 、快速 、可回滚地落盘生产机?别再手写 scp + ssh restart 一把梭了!{{}{{}>}}
< h3> > core_deploy.sh 模板{{}{{}>}} < pre> > {{}{{}>}}
APPNAME="my-app" DEPLOYUSER="${1:-deploy}" DEPLOYHOST="${2:-prod.example.com}" REMOTEBASE="/opt/${APPNAME}" TIMESTAMP=$ RELEASEDIR="${REMOTEBASE}/releases/${TIMESTAMP}" CURRENTLINK="${REMOTEBASE}/current" BACKUPDIR="${REMOTEBASE}/backups" KEEPRELEASES=5 #保留最近5个版本便于秒级回滚
echo " === Starting deploy ${APPNAME} @ ${TIMESTAMP} ===" echo " Target: ${DEPLOYUSER}@${DEPLOYHOST}:${RELEASEDIR}"
echo " Upload artifact..." ssh "${DEPLOYUSER}@${DEPLOYHOST}" " mkdir -p ${RELEASEDIR} mkdir-p ${BACKUPDIR} "
scprtarget/*.jar "${DEPLOYUSER}@${DEPOLYHOST}:${RELEASE_DIR}/" #或 scp app.tgz ...
echo " Remote deploy operations..." ssh-t "${DEPOLYUSER}@${DEPOLYHOST}" bash-seu o pipefail "<<'EOFREMOTE' set-euopipefail cd "${REMOTEBASE}" if];怎么说呢,n mv "${CURRENTLINK}" "${BACKUPDIR}/${APPNAME}backup$" fi ln-snf "${RELEASEDIR}" "${CURRENTLINK}" echo " Symlink switched."
systemctl reload-or-restart "${APPNAME}.service" || systemctl restart "${APPNAME}.service" sleep5 systemctl is-active --quiet "${APP_NAME}.service" && echo " Service healthy." || { echo " Service down!",exit;}
ls-dtr releases/* | tail-n+$) | xargs-r rm-rf ls-dtr backups/* | tail-n+$) | xargs-r rm-rf EOF_REMOTE
echo " Deploy completed!Version:${TIMESTAMP}" echo " Rollback command: ssh ${DEPOLYUSER}@${DEPOLYHOST} 'ln-snf \$ ${CURRENTLINK}&& systemctl restart ${APPNAME}'">{{}}{>{}>{{ <{/}{{/}}{{>{{
说到前言,告别“手动部署”的痛苦时刻
各位开发同学好!老实说,还在为每次项目上线前的“手动部署”焦头烂额吗?相信你我都经历过这些痛点
- 深夜加班发版: 每次上线都要手动打包、上传、解压、重新启动。动作一多,难免手抖输错命令,导致回滚又是一番折腾。
- 环境不一致惹祸端: 开发环境、测试环境、生产环境配置参差不齐。“在我机器上跑没问题”却在线上炸锅,排查耗时极长。怎么说呢,
- 发布流程不可控: 谁发的?什么时候发的,发了啥改动?没有留痕,出问题甩锅无据,复盘无从下手。
- 重复劳动效率低: 建立、测试、部署全靠人工跑流程。高智商人才干着搬运工的活,太不划算!
今天我就带大家用 Jenkins + CentOS 搭建一套自动化部署流水线。实现代码提交即自动建立、测试、部署让项目上线效率瞬间起飞,彻底解放双手!
说到第一阶段,CentOS 上搭建 Jenkins 基础环境
工欲善其事必先利其器。Jenkins 基于 Java 运行,且官方推荐通过 YUM 源安装以便后续维护更新。
1. 安装 Java 运行环境
痛点提示: 忘装 JDK 或版本不对,Jenkins 启动直接报错。我建议显式安装 JDK 11 或 JDK 17。按理说,
# 安装 OpenJDK 17
sudo yum install -y java-17-openjdk-devel
# 验证安装
java -version
javac -version
2. 添加 Jenkins YUM 源并导入密钥
痛点提示: 国内直连官网源极慢甚至超时。其实,若速度慢可替换为清华/阿里云镜像源地址。
# 下载官方 repo 配置
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
# 导入 GPG Key 验证包合法性
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
# 清理缓存并重建元数据
sudo yum clean all && sudo yum makecache
3. 安装并启动 Jenkins
# 安装最新稳定版
sudo yum install -y jenkins
# 配置防火墙放行默认端口 8080
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
# 开启服务并设置开机自启
sudo systemctl start jenkins
sudo systemctl enable jenkins
# 检查状态确认运行正常
systemctl status jenkins
4. 初始化解锁与基础配置
-
浏览器访问
-
获取初始密码:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword - 安装推荐插件或稍后按需安装。怎么说呢,
- 创建管理员账号完成初始化。
- <>设置关键工具链 :Manage Jenkins → Tools → 分别配置 JDK、Maven/Gradle、Git、Ant方法。若选择“自动安装”需确保服务器能联外网;生产环境建议预装好填写本地绝对方法。
第二阶段的观点是。主要流水线配置——从代码到制品
Jenkins 安装好只是个“空壳”,接下来定义“怎么建立”、“怎么部署”。
1 . 新建建立任务
- FreeStyle Project :适合简单项目、Ant/Maven 脚本型项目。
- Pipeline :推荐!用 J比如enkinsfile 作为代码管理流水线。支持复杂阶段控制,还有并行,再有回滚等高级特性。
以 FreeStyle + Android Ant 项目为例 :
- General :勾选 “GitHub/GitLab hook trigger for GITScm polling” 或 “Poll SCM”。
- 源码管理 :选择 Git,填仓库 URL 、凭据 、指定分支。
- 建立触发器 :勾选 “GitHub hook trigger for GITScm polling”。
- 建立环境 :勾选 “Inject environment variables”、或使用 Config File Provider 注入配置文件。
- 建立步骤 → Execute Shell :
- > GitLab / GitHub / Gitee / Coding 操作基本一致 :Settings → Webhooks → Add Webhook{{}
- > URL : http://你的 JenkinsIP:8080/github-webhook/ 或 http://.../gitlab-webhook/ 或通用 http://.../generic-webhook-trigger/invoke?token=xxx {{} < l i>> Secret Token : 生成随机字符串,在 Jenkins 全局安全配置或 Generic Webhook Trigger 插件中校验。防恶意调用 .{{}> Trigger : Push events 、Tag push events 、Merge Request events 按需勾选 .{{}> SSL verification : 内网自签证书可关闭;公网必须开启 .{{}> 测试一下!点击 Test 按钮,查看 Response Code 是否 `200`,去 Jenkins 日志看有无 `Received webhook` .{{}{{}>}}
#!/bin/bash
set -ex # 报错即停止 、打印命令
echo " 开始建立..."
# 若全局工具配置了 Ant 名为 'DefaultAnt',可直接用 ant 命令
ant clean release
# 建立产物归档方法
ARTIFACT_PATH="bin/app-release.apk"
if;n
echo " 构造失败 未找到 APK"
exit fi
echo " 构造完成 : $ARTIFACT_PATH "
# 若使用 Pipeline 推荐用 archiveArtifacts;FreeStyle 需在 “构造后操作” 勾选 “Archive artifacts” 填 bin/*.apk }}
推荐写法 : Declarative Pipeline 放入代码库根目录 :{{}
pipeline {
agent any // 或 label 'build-agent'
tools {
jdk 'JDK17'
maven 'Maven3_9'
// ant 'DefaultAnt' // 若需 Ant }
environment {
// 敏感信息用 credentials 获取 DEPLOY_SERVER = 'deploy@prod-server'
DEPLOY_PATH = '/opt/app/current' }
stages {
stage { steps { checkout scm }}
stage {
steps {
sh '''
set -ex ./mvnw clean package -DskipTests # 或 ant release '''}}
stage { steps { sh './mvnw test' }}
stage {
when { branch 'main' } // 主分支才自动部署 steps {
script {
// 调用统一部署脚本或直接写 SSH/SCP sh '''
./deploy.sh ${DEPLOY_SERVER} ${DEPLOY_PATH} '''}}}} post { always { cleanWs // 清理工作区 }}}
{{}
配置 Git Webhook ——实现“推代码即触发”的关键一步 {{}
> 使用者痛点 :> 配好了 JenkinsJob,本地 git push 半天没反应?说起来,九成是 Webhook 没通!{{}
< h4>
> 常见坑 & 排查 {{}{{}>}} < ul>
> < l i>> 防火墙 / 安全组没放行 8080 或反向代理端口 .<{/}> < l i>> Nginx反向代理未转发 Header 导致插件识别失败 .<{/}> < l i>> 凭据权限不足。Webhook 能触发但拉取代码报 Permission denied .<{/}> {{}{{}>}}
< h2 id =" deploy-script ">
第三阶段 : 自动化部落脚本当落地 — —Shell 脚本常用方法 {{}{{}>}} < p>
> 构造产物出来后,怎么安全 、快速 、可回滚地落盘生产机?别再手写 scp + ssh restart 一把梭了!{{}{{}>}}
< h3> > core_deploy.sh 模板{{}{{}>}} < pre> > {{}{{}>}}
APPNAME="my-app" DEPLOYUSER="${1:-deploy}" DEPLOYHOST="${2:-prod.example.com}" REMOTEBASE="/opt/${APPNAME}" TIMESTAMP=$ RELEASEDIR="${REMOTEBASE}/releases/${TIMESTAMP}" CURRENTLINK="${REMOTEBASE}/current" BACKUPDIR="${REMOTEBASE}/backups" KEEPRELEASES=5 #保留最近5个版本便于秒级回滚
echo " === Starting deploy ${APPNAME} @ ${TIMESTAMP} ===" echo " Target: ${DEPLOYUSER}@${DEPLOYHOST}:${RELEASEDIR}"
echo " Upload artifact..." ssh "${DEPLOYUSER}@${DEPLOYHOST}" " mkdir -p ${RELEASEDIR} mkdir-p ${BACKUPDIR} "
scprtarget/*.jar "${DEPLOYUSER}@${DEPOLYHOST}:${RELEASE_DIR}/" #或 scp app.tgz ...
echo " Remote deploy operations..." ssh-t "${DEPOLYUSER}@${DEPOLYHOST}" bash-seu o pipefail "<<'EOFREMOTE' set-euopipefail cd "${REMOTEBASE}" if];怎么说呢,n mv "${CURRENTLINK}" "${BACKUPDIR}/${APPNAME}backup$" fi ln-snf "${RELEASEDIR}" "${CURRENTLINK}" echo " Symlink switched."
systemctl reload-or-restart "${APPNAME}.service" || systemctl restart "${APPNAME}.service" sleep5 systemctl is-active --quiet "${APP_NAME}.service" && echo " Service healthy." || { echo " Service down!",exit;}
ls-dtr releases/* | tail-n+$) | xargs-r rm-rf ls-dtr backups/* | tail-n+$) | xargs-r rm-rf EOF_REMOTE
echo " Deploy completed!Version:${TIMESTAMP}" echo " Rollback command: ssh ${DEPOLYUSER}@${DEPOLYHOST} 'ln-snf \$ ${CURRENTLINK}&& systemctl restart ${APPNAME}'">{{}}{>{}>{{ <{/}{{/}}{{>{{

