为什么使用
- 程序在发布时步骤繁琐,除了进行编码的开发和测试还要登录运行的主机进行程序启停文件迁移等步骤
- 人工干预发布流程可能会在文件迁移过程中存在遗忘部分文件等小问题
- 自动化程度很低,不能快速交付测试等
- 出现版本发布后不能快速回滚到历史版本的问题
使用自动部署的好处
- 可以规范自动发布部署流程
- 可以快速回滚到某个历史版本
- 可以自动监听代码库变动,自动构建和部署
- 无需人工参与部署流程
简单开始
Gitee - https://gitee.com/
- 一个正常使用的Gitee账号
创建一个参与自动部署的仓库
- 将仓库克隆到本地
代码
- 代码可以正常推送到上述仓库
新的SLN
新的忽略文件
创建新项目 - NET6.0
新项目启动
代码推送
云效 - https://flow.aliyun.com/
首次登录,填写必要信息等(不再概述)
- 全局设置
- 绑定Gitee
点击新建后会打开新标签页打开Gitee登录界面,输入账号密码进行绑定
- 绑定服务器
服务器需提前安装ASP.NET Core 程序的运行环境 (NET6.0)
bash <(curl -L -k http://agent-install-default.oss-cn-hangzhou.aliyuncs.com/production-install.sh) 'http://devops.aliyuncs.com/api/getSnByRegion?regionId=d219de20-0da8-4e0b-90f8-25f611ef04dd&sign=QjgbulOStz4gD1xiu2ECZA%3D%3D&aliyunRegion=default×tamp=1697775102452&scope=flow' http://agent-install-default.oss-cn-hangzhou.aliyuncs.com/production-agent.tgz http://devops.aliyuncs.com/api/verifySnAndRegionId?sign=AFWnJ982NxRAb%2BwMSf7V2Q%3D%3D d219de20-0da8-4e0b-90f8-25f611ef04dd 1697775102452 default
部署脚本需要Python2环境,服务器为Python3
下载脚本后修改部分代码
wget http://agent-install-default.oss-cn-hangzhou.aliyuncs.com/production-install.sh
将2.7修改为3
执行(替换掉下载过程,直接复制第二行到最后的命令)
bash production-install.sh 'http://devops.aliyuncs.com/api/getSnByRegion?regionId=d219de20-0da8-4e0b-90f8-25f611ef04dd&sign=QjgbulOStz4gD1xiu2ECZA%3D%3D&aliyunRegion=default×tamp=1697775102452&scope=flow' http://agent-install-default.oss-cn-hangzhou.aliyuncs.com/production-agent.tgz http://devops.aliyuncs.com/api/verifySnAndRegionId?sign=AFWnJ982NxRAb%2BwMSf7V2Q%3D%3D d219de20-0da8-4e0b-90f8-25f611ef04dd 1697775102452 default
- 新建流水线
配置仓库
制品构建
测试构建过程是否正常,建议在构建前手动在服务器上执行构建过程,排除普通问题
编译制品
dotnet publish -c Release -o out
主键部署
此步骤主要测试文件路径及命令执行情况
mkdir -p /home/auto_run tar zxvf /home/admin/app/package.tgz -C /home/auto_run
保存并运行
测试流程是否正常
根据异常自行解决问题
进阶使用
程序中加入健康检查
加入启动脚本
注意事项:一定要明确文件路径,如果出现部署失败问题大概率由此处引起
#!/bin/bash
# 修改APP_NAME为云效上的应用名
APP_NAME=Auto_Publish_WebApplication
PROG_NAME=$0
ACTION=$1
APP_START_TIMEOUT=20 # 等待应用启动的时间
APP_PORT=5569 # 应用端口
HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT}/health # 应用健康检查URL
HEALTH_CHECK_FILE_DIR=/home/auto/admin/status # 脚本会在这个目录下生成nginx-status文件
APP_HOME=/home/auto_run # 从package.tgz中解压出来的dll放到这个目录下
DLL_NAME=${APP_HOME}/${APP_NAME}.dll # dll的名字
DLL_OUT=${APP_HOME}/logs/start.log #应用的启动日志
# 创建出相关目录
mkdir -p ${HEALTH_CHECK_FILE_DIR}
mkdir -p ${APP_HOME}
mkdir -p ${APP_HOME}/logs
usage() {
echo "Usage: $PROG_NAME {start|stop|restart}"
exit 2
}
health_check() {
exptime=0
echo "checking ${HEALTH_CHECK_URL}"
while true
do
status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code} ${HEALTH_CHECK_URL}`
if [ "$?" != "0" ]; then
echo -n -e "\rapplication not started"
else
echo "code is $status_code"
if [ "$status_code" == "200" ];then
break
fi
fi
sleep 1
((exptime++))
echo -e "\rWait app to pass health check: $exptime..."
if [ $exptime -gt ${APP_START_TIMEOUT} ]; then
echo 'app start failed'
exit 1
fi
done
echo "check ${HEALTH_CHECK_URL} success"
}
start_application() {
echo "starting dotnet process"
# chmod +x ${DLL_NAME}
# chmod +x ${APP_HOME}/appsettings.json
# nohup dotnet ${DLL_NAME} Urls=http://*:${APP_PORT} > ${DLL_OUT} 2>&1 &
cd ${APP_HOME}
nohup dotnet ${APP_NAME}.dll --urls "http://*:${APP_PORT}" > ${DLL_OUT} 2>&1 &
echo "started dotnet process"
}
stop_application() {
checkdotnetpid=`ps -ef | grep dotnet | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
if [[ ! $checkdotnetpid ]];then
echo -e "\rno dotnet process"
return
fi
echo "stop dotnet process"
times=60
for e in $(seq 60)
do
sleep 1
COSTTIME=$(($times - $e ))
checkdotnetpid=`ps -ef | grep dotnet | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
if [[ $checkdotnetpid ]];then
kill -9 $checkdotnetpid
echo -e "\r -- stopping dotnet lasts `expr $COSTTIME` seconds."
else
echo -e "\rdotnet process has exited"
break;
fi
done
echo ""
}
start() {
start_application
health_check
}
stop() {
stop_application
}
case "$ACTION" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
usage
;;
esac
更新仓库
添加Webhook
代码提交时自动触发流水线进行自动构建部署
将复制的链接粘贴到仓库配置中
修改主机部署中部署脚本
mkdir -p /home/auto_run
tar zxvf /home/admin/app/package.tgz -C /home/auto_run
bash /home/auto_run/deploy.sh restart
钉钉通知构建结果
代码提交测试自动部署
- 参考资料https://mp.weixin.qq.com/s/wzfjaOGMaX8\_f5fVoaXXSQ
此处评论已关闭