Linuxでの. NETアプリケーションの自動デプロイを10分で実現

Linuxでの. NETアプリケーションの自動デプロイを10分で実現

長い間、プログラムは非常に面倒で退屈なものであり、企業では一般的にDevOpsプログラムがあり、Cicdプロセス全体に関与するツールはまだ非常に多く、構築がより面倒です。

最后更新 2022/07/02 21:57
xhznl
预计阅读 5 分钟
分类
.NET
标签
.NET C#

背景は

長い間、プログラムのデプロイメントは非常に面倒で退屈なものであり、企業では一般的にデボップスキームがあり、CI/cdプロセス全体にはまだ多くのツールが含まれており、セットアップがより面倒です。自分の小さなプロジェクトのために、このような環境を構築したくない場合はどうでしょうか。少し前にAlibaba Cloud Effects Pipeline + gitee + ecsを試してみましたが、まだ非常に便利です、主に無料^^^、サーバーはまた、自作または他のものを使用することができます、使用方法を共有します。

コードの準備

デモプロジェクトを作成し、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

インストール完了:

自動導入。

Cloud Effects Platformパイプラインへのアクセス

NET Coreパイプラインテンプレートの選択、作成

組み立てラインの設定

  • 最初のステップは、パイプラインソースの設定です。

コードソースを選択する:Code Cloud(もちろん、GitHub、ビルドgitなどを選択することもできます)

承認し、コードストアのデフォルトブランチ名を選択します。以下の作業ディレクトリに任意のものを記述してください。

  • 第2段階は構築

主にコマンドを実行し、パスをパッケージしますが、他のオプションはデフォルトで利用可能です。

## cd到项目目录
cd aspnetcoredemo

## 还原项目
dotnet restore
## 发布项目
dotnet publish -c Release -o out
  • 第3段階展開の設定

ホストグループ私はここでAlibaba Cloud ecsを選択します(また、プラグインをインストールする他の非Alibaba Cloudホストを選択することができます)

サーバー接続の追加、許可作成

ホストを選択し、次へ、保存(1台のマシンを使用しますが、複数のマシンに展開できます)

デプロイメントスクリプト:

## 创建目录

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トリガーを開きます。

このウェブフックアドレスをコピーし、giteeリポジトリに設定し、保存します。

コードを変更してテストします。

コードのコミット後、自動的にパイプラインビルドデプロイメントがトリガーされます。

ok:

終わりだ

Happy coding ...

この記事は、[Typora]+[EasyBlogImageForTypora]で編集しています。

私のコミュニティをフォローし、一緒に学ぶことへようこそ。

この記事があなたを助ける場合は、右下の[推奨]ボタンをクリックしてサポートすることができます。テキストに問題がある場合は、修正を期待してください。

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2026/04/22

バージョン別の. NETサポート状況(250 7 0 7更新)

仮想マシンとテストマシンを使用して、各バージョンのオペレーティングシステムの. NETサポートをテストします。オペレーティングシステムのインストール後、対応するランタイムを測定し、スターダストエージェントをパスとして実行できます。

继续阅读
同分类 / 同标签 2026/02/07

AOTの使用経験

プロジェクトの最初から、新しい機能が追加されたり、新しい構文が使用されたりするたびに、AOTリリーステストを行うという良い習慣を身につける必要があります。

继续阅读