为什么使用

  1. 程序在发布时步骤繁琐,除了进行编码的开发和测试还要登录运行的主机进行程序启停文件迁移等步骤
  2. 人工干预发布流程可能会在文件迁移过程中存在遗忘部分文件等小问题
  3. 自动化程度很低,不能快速交付测试等
  4. 出现版本发布后不能快速回滚到历史版本的问题

使用自动部署的好处

  1. 可以规范自动发布部署流程
  2. 可以快速回滚到某个历史版本
  3. 可以自动监听代码库变动,自动构建和部署
  4. 无需人工参与部署流程

简单开始

Gitee - https://gitee.com/

  1. 一个正常使用的Gitee账号
  2. 创建一个参与自动部署的仓库

    SourceRep

  3. 将仓库克隆到本地

代码

  1. 代码可以正常推送到上述仓库
  2. 新的SLN

    NewSln

  3. 新的忽略文件

    Gitignore

  4. 创建新项目 - NET6.0

    NewProject

  5. 新项目启动

    WebAppRun

  6. 代码推送

    CodePush

云效 - https://flow.aliyun.com/

首次登录,填写必要信息等(不再概述)
  1. 全局设置

GlobalSet

  1. 绑定Gitee

GiteeInformation

点击新建后会打开新标签页打开Gitee登录界面,输入账号密码进行绑定

GiteeBinding

  1. 绑定服务器
服务器需提前安装ASP.NET Core 程序的运行环境 (NET6.0)

ServerBinding

MyServer

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&timestamp=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

NeedPython2

下载脚本后修改部分代码

wget http://agent-install-default.oss-cn-hangzhou.aliyuncs.com/production-install.sh

ReplacePython3_1

将2.7修改为3

ReplacePython3_2

执行(替换掉下载过程,直接复制第二行到最后的命令)

AddAgent

bash production-install.sh 'http://devops.aliyuncs.com/api/getSnByRegion?regionId=d219de20-0da8-4e0b-90f8-25f611ef04dd&sign=QjgbulOStz4gD1xiu2ECZA%3D%3D&aliyunRegion=default&timestamp=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

SelectServer

SaveServer

  1. 新建流水线

NewFlow

CreateFlow

  1. 配置仓库

    ConfigGitSource

  2. 制品构建

    测试构建过程是否正常,建议在构建前手动在服务器上执行构建过程,排除普通问题

    .NETCoreBuild

    编译制品

    dotnet publish -c Release -o out
  3. 主键部署

    此步骤主要测试文件路径及命令执行情况

    RunApplicationWeb

    mkdir -p /home/auto_run
    
    tar zxvf /home/admin/app/package.tgz -C /home/auto_run
  4. 保存并运行

    SaveAndRun

  5. 测试流程是否正常

    根据异常自行解决问题

    RunLog

进阶使用

程序中加入健康检查

HealthCheck

加入启动脚本

注意事项:一定要明确文件路径,如果出现部署失败问题大概率由此处引起

deploy

#!/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

更新仓库

UpdateSource

添加Webhook

代码提交时自动触发流水线进行自动构建部署

WebHook_1

将复制的链接粘贴到仓库配置中

WebHook_2

WebHook_3

WebHook_4

修改主机部署中部署脚本

AutoDeploy

mkdir -p /home/auto_run

tar zxvf /home/admin/app/package.tgz -C /home/auto_run

bash /home/auto_run/deploy.sh restart

钉钉通知构建结果

DingTalkBot

DingTalkBotMessage

代码提交测试自动部署

Compare_1

Compare_2

最后修改:2023 年 10 月 20 日
如果觉得我的文章对你有用,请随意赞赏