背景
一直以來,程式署都是非常麻煩且無聊的事情,在公司一般都會有 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 ...