公司后端部署优化

3,794 阅读2分钟

背景简介

之前在宇宙厂时有一套完善的代码提交、自动打包、自动通知流程。而在现在的公司,开发团队较小,虽然有 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 大模型的帮助来完成脚本的部分编写,让整个过程更加流畅。