• 10分钟实现dotnet程序在linux下的自动部署


    背景

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

    代码准备

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

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

    image-20220702161750722

    服务器环境

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

    安装完成:

    image-20220702161204296

    自动部署

    进入云效平台流水线

    image-20220702162400781

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

    image-20220702162529035

    配置流水线

    第一步是配置流水线源

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

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

    image-20220702162850643

    第二步配置构建

    image-20220702163537784

    image-20220702170309759

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

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

    第三步配置部署

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

    image-20220702163915595

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

    image-20220702164445753

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

    image-20220702164642489

    部署脚本:

    image-20220702170929035

    ## 创建目录
    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
    

    image-20220702171223342

    记得复制到输出目录:

    image-20220702171421380

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

    手动构建

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

    image-20220702172815932

    访问一下,ok:

    image-20220702173039889

    自动构建

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

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

    image-20220702173719962

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

    image-20220702173814426

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

    image-20220702173951884

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

    image-20220702174111077

    ok:

    image-20220702175351961

    结束

    Happy coding ...

  • 相关阅读:
    checkbox全选
    table隔行变色与table单元格根据条件更改字体颜色
    document.ready和window.onload
    JS实现定时弹出广告
    CSS overflow属性与display属性
    OpenCV 安装步骤
    C#类的继承多态(虚方法,隐藏方法、抽象类和抽象方法)
    C#中虚方法,抽象方法和隐藏方法
    C#的重载与重写
    C#中可空类型
  • 原文地址:https://www.cnblogs.com/xhznl/p/16438063.html
Copyright © 2020-2023  润新知