10分钟实现dotnet程序在linux下的持续部署

背景

一直以来,程序署都是非常麻烦且无聊的事情,在公司一般都会有 devops 方案,整个 cicd 过程涉及的工具还是挺多的,搭建起来比较麻烦。那么对于一些自己的小型项目,又不想搭建一套这样的环境,怎么办呢。。。前段时间尝试了一下 阿里云效 pipeline + gitee + ecs ,还是挺方便的,主要是免费^ ^,服务器也可以用自建的或者其他的,下面就分享一下如何使用

代码准备

随便准备个demo项目,并提交到 gitee

## 创建aspnetcore web项目
dotnet new web -o aspnetcoredemo
e30eed7344cda51356dfe90fd8d6bf7a.png

服务器环境

首先去服务器安装下 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

安装完成:

c9901f531f88dda980c37afe95fd7f95.png

自动部署

进入云效平台流水线

e093bf44345b79b7ce596a5e5c54056b.png

选择 .NET Core 流水线模板,创建

1de7c77c0e03912ffefe1a32ade1ef23.png

配置流水线

第一步是配置流水线源

选择代码源:码云(当然你也可以选别的,github,自建git之类的)

授权一下,然后选择你的代码仓库,默认分支名。下面的工作目录随便写一个,比如:demo

7dab4ce4790bfb2b847c52229f443dfb.png

第二步配置构建

b6635548b2e03dd9a2e9076ec0f5bb27.png602267e2b30537f6aee8a510a4cdc6e0.png

主要是执行命令,和打包路径 注意下,其他的选项默认就行

## cd到项目目录
cd aspnetcoredemo## 还原项目
dotnet restore
## 发布项目
dotnet publish -c Release -o out

第三步配置部署

主机组我这里选 阿里云 ecs (你也可以选其他非阿里云的主机,要装插件)

b39368ad35d3ef1e25a891f1bba2d0a4.png

添加服务器连接,授权创建即可

c95af1258f33261388eb8c8426fc26cf.png

选择主机,下一步,保存(我这里就一台机器,也可以多台机器部署)

e951abb8c301553481b615cbb3173a3f.png

部署脚本:

49dd893760dda8aa9392b91c3fe63422.png
## 创建目录
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=aspnetcoredemoPROG_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=0echo "checking ${HEALTH_CHECK_URL}"while truedostatus_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code}  ${HEALTH_CHECK_URL}`if [ "$?" != "0" ]; thenecho -n -e "\rapplication not started"elseecho "code is $status_code"if [ "$status_code" == "200" ];thenbreakfifisleep 1((exptime++))echo -e "\rWait app to pass health check: $exptime..."if [ $exptime -gt ${APP_START_TIMEOUT} ]; thenecho 'app start failed'exit 1fidoneecho "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 ]];thenecho -e "\rno dotnet process"returnfiecho "stop dotnet process"times=60for e in $(seq 60)dosleep 1COSTTIME=$(($times - $e ))checkdotnetpid=`ps -ef | grep dotnet | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`if [[ $checkdotnetpid ]];thenkill -9 $checkdotnetpidecho -e  "\r        -- stopping dotnet lasts `expr $COSTTIME` seconds."elseecho -e "\rdotnet process has exited"break;fidoneecho ""
}
start() {start_applicationhealth_check
}
stop() {stop_application
}
case "$ACTION" instart)start;;stop)stop;;restart)stopstart;;*)usage;;
esac
b000a315ecf3b33e0eb53162391623e9.png

记得复制到输出目录:

ea37eae1c8e9fa20e6ff426ea4866bf3.png

增加一个 HealthChecks 接口用于部署脚本的健康检查:

7429a7137637ade84764f69232f979e6.png

手动构建

流水线 点击运行,如果前面配置没有问题的话,可以看到构建部署成功。

749b1677a544f3348f37246de7ce6a16.png

访问一下,ok:

f3f0c60a621b841c7de18e82018dfede.png

自动构建

下面通过 webhook 配置,实现提交代码,自动构建部署

流水线,选择触发配置,打开 webhook 触发:

e7767c57365fa9c251d9662ae4ea600e.png

将这个 webhook 地址复制,配置到你的 gitee 仓库中,保存:

e3a19749fb12d84b7ce394ced2865113.png

接下来随便修改下代码,测试下:

94053942914df26fbefdddce92166d32.png

提交代码后自动触发了流水线构建部署:

d2dd09680abb552bd71f4010baf30fc0.png

ok:

dc4f68dae7370191e8775b45a484635f.png

结束

Happy coding ...

参考资料

[1]

在 CentOS 上安装 .NET - .NET | Microsoft Docs: https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言试题131之将一个数组逆序输出。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:将一个数组逆序输出。 分析:…

【错误异常大全】:无法加载 DLL“ArcGISVersion.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

文章目录 错误异常解决方案错误异常 无法加载 DLL“ArcGISVersion.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。 解决方案 将目标平台改为x86,具体步骤如下: 点击【配置管理器】。 下拉活动解决方案平台,点击【新建】。 选择x86,点击【确定】。

Go语言之反射

和Java语言一样,Go也实现运行时反射,这为我们提供一种可以在运行时操作任意类型对象的能力。比如我们可以查看一个接口变量的具体类型,看看一个结构体有多少字段,如何修改某个字段的值等。TypeOf和ValueOf在Go的反射定义中&#x…

博客即简历

本文转载自:http://www.cnblogs.com/stoneniqiu/p/5271248.html。 我个人也是在一直坚持写博客,每月至少一篇,并慢慢地将其变成了自己的习惯。一些想法与本文不谋而合,所以决定转载此文。 --------------------------------------…

C语言试题132之取一个整数 a 从右端开始的 4~7 位。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:取一个整数 a 从右端开始的 …

【错误异常大全】:ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS

文章目录 问题描述解决方法问题描述 ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS components. 解决方法 打开program.cs,把ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop); 放到Application…

统一建模语言 UML

目录 统一建模语言 UMLUML定义了5类10种模型图一用例图用于建立需求模型二静态图主要描述系统的静态表示和关系包括类图包图对象图三行为图描述系统动态模型和对象组成的交换关系包括状态图和活动图四交互图用于描述对象间的交互关系由一组对象和它们之间的关系组成包含它们之间…

[转]npm生成的package.json文件中依赖项版本号前的波浪号(~)和插入符号(^)是啥意思?

package.json一般也就长这么模样: {"name": "","description": "","version": "4.17.1","author": "","contributors": [],"license": "MIT",&quo…

使用 C# 提取 PDF 文件中的所有文字(支持 .NET Core)

PDF 是 Portable Document Format 的简称,意为“可携带文档格式”,是由 Adobe Systems 用于与应用程序、操作系统、硬件无关的方式进行文件交换所发展出的文件格式。PDF 文件以 PostScript 语言图象模型为基础,无论在哪种打印机上都可保证精确…

【错误异常大全】:正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。

文章目录 错误异常:解决方案一:解决方案二:错误异常: 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。 解决方案一: 1、把VS菜单的 调试->异常->Managed Debuggin Assistants->LoaderLo…

Linux——JDK的部署

1.检查一下系统中的jdk版本[java] view plaincopy $>java -version java version "1.7.0_"OpenJDK Runtime Environment (IcedTea6 1.11.1) (rhel-1.45.1.11.1.el6-x86_64)OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)2.检测JDK安装包[java] view pla…

python字符串格式化方法 format函数的使用

python从2.6开始支持format,新的更加容易读懂的字符串格式化方法,从原来的% 模式变成新的可读性更强的花括号声明{}、用于渲染前的参数引用声明, 花括号里可以用数字代表引用参数的序号, 或者 变量名直接引用。从format参数引入的…

C语言试题133之画圆形

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:画圆形 2 、温馨提示 想获取…

ReactDom.render和React.render的区别

这个是react最新版api,也就是0.14版本做出的改变。主要是为了使React能在更多的不同环境下更快、更容易构建。于是把react分成了react和react-dom两个部分。这样就为web版的react和移动端的React Native共享组件铺平了道路。也就是说我们可以跨平台使用相同的react组…

[转]阿里编程规范(精简版)

文章目录 1、简介2、命名:3、格式规约4、注释规约5、OOP规约6、集合处理7、控制语句8、异常9、日志10、单元测试11、工程规约1、简介 统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大降低代码维护成本 2017年年初,首次…

C#(Sharp)GDI plus与图形编程(计算机图形学必备知识)

文章目录 9.1 GDI+与图形编程9.1.0 GDI概念9.1.1 GDI+绘图命名空间9.1.2 坐标系统9.1.3 Graphics类9.2 绘图工具类9.2.1 Pen类9.2.2 常用图形的绘制方法9.2.3 Brush 类9.3 绘制相关图形9.3.1 绘制曲线9.1 GDI+与图形编程 9.1.0 GDI概念 GDI是Graphics Device Interface的缩写…

.Net之延迟队列

介绍具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。使用场景延迟队列在项目中的应用还是比较多的,尤其像电商类平台:订单成功后,在30分钟内没有支付&#xf…

C语言试题134之画直线

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:用 line 画直线 2 、温馨提示…

KeyMob应用开发者服务平台帮助开发者推广和盈利

为什么80%的码农都做不了架构师?>>> 2014年10月,新版KeyMob移动广告聚合平台正式上线,登入KeyMob移动广告聚合平台即可看到聚合功能,目前新KeyMob整合了国内外多家主流的广告平台,实实在在的为应用开发者赚…

Android GIS开发系列-- 入门季(13)Gdal简单写个shp文件

Gdal是用来读写栅格与矢量数据的,在Gdal官网,可以下载相关的资源进行平台的编译。其实Arcgis底层也是用Gdal来读取shp文件的,那在Android中可以直接读写shp文件吗,是可以的。这里已经有人编译了Android端的so ,下载地址…