10分钟实现dotnet程序在linux下的持续部署
背景
一直以来,程序部署都是非常麻烦且无聊的事情,在公司一般都会有 devops 方案,整个 cicd 过程涉及的工具还是挺多的,搭建起来比较麻烦。那么对于一些自己的小型项目,又不想搭建一套这样的环境,怎么办呢。。。前段时间尝试了一下 阿里云效 pipeline + gitee + ecs ,还是挺方便的,主要是免费^ ^,服务器也可以用自建的或者其他的,下面就分享一下如何使用
代码准备
随便准备个demo项目,并提交到 gitee
## 创建aspnetcore web项目
dotnet new web -o aspnetcoredemo
服务器环境
首先去服务器安装下 dotnet 运行时,我这里是用centos。
参考官方文档 在 CentOS 上安装 .NET - .NET | Microsoft Docs[1]
## 安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加 Microsoft 包存储库。 打开终端并运行以下命令:
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
## 通过 ASP.NET Core 运行时,可以运行使用 .NET 开发且未提供运行时的应用。 以下命令将安装 ASP.NET Core 运行时,这是与 .NET 最兼容的运行时。 在终端中,运行以下命令:
sudo yum install aspnetcore-runtime-6.0
安装完成:
自动部署
进入云效平台流水线
选择 .NET Core 流水线模板,创建
配置流水线
第一步是配置流水线源
选择代码源:码云(当然你也可以选别的,github,自建git之类的)
授权一下,然后选择你的代码仓库,默认分支名。下面的工作目录随便写一个,比如:demo
第二步配置构建
主要是执行命令,和打包路径 注意下,其他的选项默认就行
## cd到项目目录
cd aspnetcoredemo
## 还原项目
dotnet restore
## 发布项目
dotnet publish -c Release -o out
第三步配置部署
主机组我这里选 阿里云 ecs (你也可以选其他非阿里云的主机,要装插件)
添加服务器连接,授权创建即可
选择主机,下一步,保存(我这里就一台机器,也可以多台机器部署)
部署脚本:
## 创建目录
mkdir -p /home/admin/aspnetcoredemo/
## 解压文件到 /home/admin/aspnetcoredemo/ 目录
tar zxvf /home/admin/aspnetcoredemo/package.tgz -C /home/admin/aspnetcoredemo/
## 执行部署脚本
sh /home/admin/aspnetcoredemo/deploy.sh restart
部署脚本
这个 deploy.sh 加到项目代码中,这个脚本的大概内容就是 杀死进程->重新启动程序->健康检查->部署完成
内容如下:
#!/bin/bash
# 修改APP_NAME为云效上的应用名
APP_NAME=aspnetcoredemo
PROG_NAME=$0
ACTION=$1
APP_START_TIMEOUT=20 # 等待应用启动的时间
APP_PORT=5000 # 应用端口
HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT}/HealthChecks # 应用健康检查URL
HEALTH_CHECK_FILE_DIR=/home/admin/status # 脚本会在这个目录下生成nginx-status文件
APP_HOME=/home/admin/${APP_NAME} # 从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
记得复制到输出目录:
增加一个 HealthChecks 接口用于部署脚本的健康检查:
手动构建
流水线 点击运行,如果前面配置没有问题的话,可以看到构建部署成功。
访问一下,ok:
自动构建
下面通过 webhook 配置,实现提交代码,自动构建部署
流水线,选择触发配置,打开 webhook 触发:
将这个 webhook 地址复制,配置到你的 gitee 仓库中,保存:
接下来随便修改下代码,测试下:
提交代码后自动触发了流水线构建部署:
ok:
结束
Happy coding ...
参考资料
[1]
在 CentOS 上安装 .NET - .NET | Microsoft Docs: https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos
相关文章
- Linux查看程序版本:一种快捷方式(linux查看程序版本)
- 解读最小Linux源码(最小linux源码)
- 快速部署Linux系统:百度云客户端(百度云linux客户端)
- Linux开发C语言程序的简易步骤(linux创建c程序)
- Linux中进程对内存空间的优化(linux进程空间)
- 程序Linux下如何安装程序?(linux下如何安装)
- 简易指南:在Linux中编写C语言程序(怎么在linux写c语言)
- Linux嵌套循环:灵活操控复杂程序(linux嵌套循环)
- 使用Cat命令掌握Linux中的文件(linux中cat)
- Linux 下快捷锁定屏幕的技巧(linux锁定屏幕)
- 「在Linux上使用U盘启动系统」(linux的u盘启动)
- Linux系统中:维护安全的防火墙(linux中防火墙)
- 程序Linux下控制串口程序的实现(linux控制串口)
- Linux下批量重命名文件快捷技巧(批量重命名linux)
- 选用惠普服务器,轻松部署Linux系统(惠普服务器linux)
- 马士兵讲Linux技巧:深入学习Linux必备的教程(马士兵linux)
- 轻松入门Linux终端光标设置技巧(linux终端光标设置)
- 优化你的计算资源:学习 Linux 程序优先级设置技巧(linux程序优先级)
- Linux程序卸载:简单快捷的方式(linux程序卸载)
- 从Windows轻松移植到Linux:一个程序员的指南(程序移植linux)
- 深入了解Linux内核:循环原理解析(linux内核循环)
- 如何在Linux上配置静态IP(linux配置静态的ip)
- 原子构建的Linux:开创软件部署的新时代(atomic linux)
- Linux服务器为网站部署新机会”(linux服务器部署网站)
- 利用Linux脚本传参数实现更高效率(linux脚本传参数)
- Linux下程序编译输出实践指南(linux输出编译)
- 掌握Linux分区利器fdisk,玩转硬盘分区(linux的fdisk)