背景

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

代码准备

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

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

服务器环境

首先去服务器安装下 dotnet 运行时,我这里是用centos。

参考官方文档 在 CentOS 上安装 .NET - .NET | Microsoft Docs

## 安装 .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 ...

10分钟实现dotnet程序在linux下的自动部署的更多相关文章

  1. linux下实现自动部署tomcat的脚本

    linux下实现自动部署tomcat的脚本 由于经常部署war到tomccat上,经常有一些重复的工作要做:停服务.备份war包.上传新的war包.启动服务.索性就写了一个自动部署的脚本. 脚本如下a ...

  2. 解决Qt程序在Linux下无法输入中文的办法

    解决Qt程序在Linux下无法输入中文的办法 一位网友问我怎样在Linux的Qt的应用程序中输入中文,我一開始认为不是什么问题,可是后面自己尝试了一下还真不行.不仅是Qt制作的应用程序,就连Qt Cr ...

  3. 程序在Linux下前后台切换

    程序在Linux下前后台切换 一.为什么要使程序在后台执行 背景:SecureCRT远程连接到linux主机,使程序在后台运行有以下好处: (1)本机关机不影响linux主机运行 (2)不影响计算效率 ...

  4. 【Qt开发】解决Qt程序在Linux下无法输入中文的办法

    解决Qt程序在Linux下无法输入中文的办法 一位网友问我如何在Linux的Qt的应用程序中输入中文,我一开始觉得不是什么问题,但是后面自己尝试了一下还真不行.不仅是Qt制作的应用程序,就连Qt Cr ...

  5. 转: linux下的自动对时

    转自: http://www.cnblogs.com/vimmer/archive/2012/05/17/2505785.html 评注:date 命令格式为: date -s 2012-08-02 ...

  6. Linux下使用JDK11部署Nacos启动报错:Could not find or load main class

    Linux下使用JDK11部署Nacos 错误日志 /nacos/jdk-11.0.12/bin/java -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize ...

  7. 在linux下用tomcat部署java web项目的过程与注意事项

    在linux下用tomcat部署java web项目的过程与注意事项 一.安装JDK 到http://www.oracle.com/technetwork/java/javase/downloads/ ...

  8. Linux下Tomcat同时部署两个工程然而只有一个能访问问题

    Linux下Tomcat同时部署两个工程然而只有一个能访问问题 问题: Linux下单个部署到Tomcat下的时候都正常,两个一起部署,只有一个能访问: 解决方案: 由于采用#./shutdown.s ...

  9. 在linux下用tomcat部署java web项目的过程与注意事项(转)

    在linux下用tomcat部署java web项目的过程与注意事项一.安装JDK到http://www.oracle.com/technetwork/java/javase/downloads/in ...

随机推荐

  1. 2021.08.06 P3478 STA-Station(树形结构)

    2021.08.06 P3478 STA-Station(树形结构) [P3478 POI2008]STA-Station - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 给 ...

  2. jsp第二周作业

    1.p39 实验2 显示当前时间,并输出上午(0-12)好,下午好(13-17),晚上好(18-23) <%@ page language="java" import=&qu ...

  3. selenium模块跳过用户名密码验证码输入,加载浏览器标签和cookie,进行翻页爬虫多页动态加载的数据(js)

    能解决登陆一次后,之后不需要二次登陆的动态加载数据,网页保存的cookie和标签,加入到selenium自动化测试浏览器中 1 from selenium import webdriver 2 imp ...

  4. Rancher无法登录 容器报错X509:certificate has expired or is not ye valid

    在某天需要发布新版本的时候,发现rancher无法登录,于是到服务器上查看rancher日志,发现以下内容:  参考rancher文档中独立容器Rancher Server证书更新解决 1. 进入容器 ...

  5. kernel UAF && tty_struct

    kernel UAF && 劫持tty_struct ciscn2017_babydriver exp1 fork进程时会申请堆来存放cred.cred结构大小为0xA8.修改cred ...

  6. 论文解读(ClusterSCL)《ClusterSCL: Cluster-Aware Supervised Contrastive Learning on Graphs》

    论文信息 论文标题:ClusterSCL: Cluster-Aware Supervised Contrastive Learning on Graphs论文作者:Yanling Wang, Jing ...

  7. python入门基础知识二(字符串的常用操作方法)

    下标/索引: a = "I'm interested in Python." print(a[4]) i # 英文的字符串每一个下标/索引对应一个字母(含标点) a = '我喜欢p ...

  8. 论文解读《Deep Attention-guided Graph Clustering with Dual Self-supervision》

    论文信息 论文标题:Deep Attention-guided Graph Clustering with Dual Self-supervision论文作者:Zhihao Peng, Hui Liu ...

  9. 基于 Jenkins + Kubernetes + Argo CD 的完整 DevOps 流程记录(1) - 环境部署

    一.环境准备 1.1 镜像仓库 整套 DevOps 流程使用 Harbor 作为内部镜像仓库,所有构建产物(镜像)都会推送到 Harbor,以备后续进行项目部署.Harbor 从 2.x 版本开始支持 ...

  10. Angular核心概念

    一.集成开发环境@angular/cli IE8之后才有debugger工具 2009,nodejs发布,前端Big Bang 1.1 基于NodeJS的工具链 打包工具 grunt 对js代码做合并 ...