背景简介
之前在宇宙厂时有一套完善的代码提交、自动打包、自动通知流程。而在现在的公司,开发团队较小,虽然有 Jenkins 部署流程,但存在诸多不足,例如需要手动在 Jenkins 上点击部署、代码拉取失败和 Maven 打包失败等问题无法及时反馈,所有信息都只能通过手动查看 Jenkins 输出。这些问题长期影响了我们的开发效率。
尝试解决
自动触发 Jenkins 任务
通过 GitLab 方便地配置了集成,提交代码后能够自动触发 Jenkins 任务,省去了手动操作的麻烦。
钉钉通知
集成了钉钉机器人,利用 webhook 实现部署状态的实时反馈,将构建结果自动发送到开发群,便于大家了解当前的构建状态。
Maven 日志检测
增加对 Maven 日志的检测,发现构建失败时自动输出错误信息并通知到钉钉,减少了人工检查的工作量。
启动日志监控
在测试环境中,有时项目编译成功但启动失败,为此增加了启动日志的检测,确保服务在启动失败时也能及时得到反馈。
传统部署代码脚本
由于团队规模小,部署流程比较简单,采用传统的 Bash 脚本进行部署:
#!/usr/bin/env bash
source /etc/profile
project_name="project_name"
project_home="project_home"
# 钉钉通知函数
send_dingtalk_notification() {
local message=$1
local status=$2
local color="#FF0000" # 默认红色表示失败
if [ "$status" == "success" ]; then
color="#00FF00" # 成功为绿色
fi
local webhook_url="https://oapi.dingtalk.com/robot/send?access_token=你的访问令牌"
curl -s -X POST "$webhook_url" -H "Content-Type: application/json" -d "{
\"msgtype\": \"markdown\",
\"markdown\": {
\"title\": \"部署通知\",
\"text\": \"### 部署通知\n- 状态: <font color='${color}'>${status}</font> \n- 消息: ${message}\"
}
}"
}
# 检查上一步操作是否成功的函数
check_error() {
local step=$1
if [ $? -ne 0 ]; then
local error_message="错误:${step} 失败,停止执行后续脚本。"
echo "$error_message"
send_dingtalk_notification "$error_message" "failure"
exit 1
fi
}
echo "开始部署"
# 更新 api
cd /usr/local/workspace/$project_home/api
git checkout dev
git pull
check_error "更新 api 代码"
# 编译主项目
cd /usr/local/workspace/$project_home/$project_name
git pull
check_error "更新 $project_name 代码"
mvn clean install -P ypdev -Dmaven.test.skip=true
check_error "Maven编译 $project_name 失败"
# 拷贝工程
scp -i /usr/local/workspace/ecs1.pem /usr/local/workspace/$project_home/$project_name/target/$project_name.jar root@192.168.0.0:/root/ect_home/
check_error "拷贝 $project_name jar 包失败"
# 远程启动工程
echo "启动 $project_name"
ssh -i /usr/local/workspace/ecs1.pem root@192.168.0.224 "/root/ect_home/start_$project_name.sh"
check_error "远程启动 $project_name 失败"
send_dingtalk_notification "$project_name 项目部署成功" "success"
echo "部署成功通知已发送"
结果
经过上述调整,现在实现了从代码提交到自动部署的完整自动化流程,任何问题都能自动通知到开发群。这个过程大大提高了开发效率,减少了人工干预。我借助 LLM 大模型的帮助来完成脚本的部分编写,让整个过程更加流畅。