1. 程式人生 > >Linux下自動化部署ASP.NET CORE 3.1(Docker+Jenkins+Nginx)

Linux下自動化部署ASP.NET CORE 3.1(Docker+Jenkins+Nginx)

1、先配置好Docker阿里雲加速,可以使用阿里雲容器服務 (可自己在阿里雲申請,要不然安裝東西直接很慢)
注意:https://XXXX.mirror.aliyuncs.com為阿里雲加速服務分配地址

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://XXXX.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

  

2、安裝Docker
使用指令碼自動安裝

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

  

3、安裝JenKins
建立jenkins工作目錄

mkdir /usr/local/jenkins

  

拉取jenkins映象

docker pull jenkins/jenkins:lts

  

修改jenkins目錄和docker目錄許可權,這裡1000是容器中Jenkins 的使用者 uid

chown -R 1000:1000 /usr/local/jenkins
sudo chown -R 1000:1000 /var/run/docker.sock

docker run -itd -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true -v /usr/local/jenkins:/var/jenkins_home -v /usr/bin/docker:/bin/docker -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts 

  

引數解釋:
-p 8080:8080 -p 50000:50000 --對映jenkins埠
--name jenkins --容器名稱自己命名
privileged=true --授予容器管理員許可權
-v /usr/local/jenkins:/var/jenkins_home --對映jenkins目錄
-v /usr/bin/docker:/bin/docker --對映docke目錄 到時候需要在容器裡執行docker命令
-v /var/run/docker.sock:/var/run/docker.sock --對映docker執行命令 到時候需要容器裡執行docker命令。

配置JenKins
檢視容器啟動成功後,我們可以通過地址+埠訪問剛剛執行的Jenkins

例如http://IP地址:8080
安裝成功訪問後會如下圖所示。

 

 

 

提示首次訪問需要密碼,我們通過剛剛對映的Jenkins目錄裡檢視這個預設密碼。
預設密碼路徑:/usr/local/jenkins/secrets/ (注意前面usr/local/jenkins路徑就是剛剛自己對映的目錄)

 

 

 

 

 

 安裝完成後建立一個使用者名稱和密碼,即可完成安裝進入首頁。

 

 

 

3. 建立專案

1、原始碼編譯釋出工程

原始碼釋出工程即將原始碼提交到git伺服器,jenkins通過git拉取最新的原始碼,並通過Dockerfile裡的配置進行編譯釋出過程。然後通過Docker構建此映象並執行到容器。

建立一個.Net Core Web專案。

 

建立專案的時候可以選擇啟用Docker支援。

 

 預設的Dockerfile是有幫我們進行程式碼編譯併發布動作的。所以預設的Dockerfile檔案是適合和程式碼一起提交到伺服器然後使用Docker進行構建映象。

 專案建立完成後隨程式碼一起提交到git伺服器。(svn等也都可以)

git專案目錄,注意將Dockerfile複製到根目錄。由於到時候構建映象的時候就是從根目錄執行的。

2、已編譯的Release工程

已編譯的Release工程,此種方式適合git或svn在區域網的;又不希望原始碼不暴露到外網的需要。此種方式是將專案工程進行進行釋出打包操作。例如java常見的打包成一個war包檔案。.Net 就是生成對應的DLL 檔案。

專案在釋出之前我們對專案的Dockerfile檔案屬性做個更改,以便在釋出時將此檔案複製到釋出時的目錄。

將釋出檔案釋出到自己的git(或svn)目錄,如下圖所示的,一定要包含Dockerfile檔案。釋出後的檔案,可以根據自己需要將沒有更新DLL或者appsetting.json等檔案剔除掉。只保留本次要更新的檔案即可。

修改Dockerfile檔案,因為預設的Dockerfile檔案是包含編譯釋出的命令,所以這裡要將這些相關命令操作刪除掉;保留如下命令配置即可。

 

 儲存然後提交到所有檔案到git伺服器。

提交後的git目錄。

建議:無論是程式碼編譯釋出工程還是已編譯的Release工程,第一次使用Docker部署時最好先自己手動將這些檔案拷貝到伺服器,並手動構建物件並執行容器看是否成功;能否訪問網站。也就是先不用Jenkins將這些流程自己手動走一遍,確保一些目錄包括Dockerfile等都是配置正確的。

如只想將釋出檔案提交到git,可以下載git桌面版本,在本地新建專案,同步到git線上即可;

 

4.  建立JenKins任務

專案工程建立完成並提交到git伺服器後,開始在Jenkins裡面建立任務。

 

 

 輸入專案描述,原始碼管理選擇自己對應的即可。

 

 

 我這裡選擇的git。第一次新增專案時需要新增一種授權方式點選右邊新增按鈕即可。

 

 

 選擇新增授權方式 常用的就是使用者名稱加密碼或者SSH方式。

 

 

 下一步設定構建環境

 

 

 設定觸發器,這裡主要是設定自動觸發條件,有定時構建、遠端觸發構建、輪詢SCM。

這裡只設置輪詢SCM形式的,很簡單的方式。意思是在指定間隔時間內會去輪詢git或svn中版本是否有變化。如果有就立即構建該專案。其實就是做到只要程式碼提交了 則立刻就能自動構建專案進行釋出;不在需要其他任何操作了。

 

 

 選擇構建—>執行shell;當然我們這裡是linux伺服器所有多數選擇執行shell。

 

 

 新增shell 命令

#!/bin/bash
# 獲取短版本號
GITHASH=`git rev-parse --short HEAD`
docker stop webtest
docker rm webtest
echo ---------------Building Docker Image...------------------
docker build -t webtest:$GITHASH .
docker tag webtest:$GITHASH webtest:latest
echo ---------------Launching Container...------------------
docker run --name webtest -d -p 8005:80 webtest:latest 

應用--儲存

在構建開始前,請確認已安裝ASP.NET Core Runtime與.NET Core SDK

docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1

docker pull mcr.microsoft.com/dotnet/core/sdk:3.1

請先提前安裝,否則構建時可能會因無法安裝而超時

自動開始構建了 注意jenkins這裡時間是預設是utc時間。utc時間轉換我們北京時間是要+8小時的。

藍色圖示代表構建成功,如果失敗會是紅色

檢視控制檯輸出資訊,尤其構建失敗時能夠從裡面獲取到失敗原因等。

 

 

構建失敗情況

1、ASPNETCORE專案釋出中Dockfile檔案中配置項沒有修改

 

 

2、Docker命令不存在,目錄許可權沒有設定

 

 3、構建時超時,aspnetcore執行時沒有安裝

 

 nginx安裝

docker pull nginx:latest

docker run --name nginx-test -p 8080:80 -d nginx

  

引數說明:

--name nginx-test:容器名稱。

-p 8080:80: 埠進行對映,將本地 8080 埠對映到容器內部的 80 埠。

-d nginx: 設定容器在在後臺一直執行。

 

nginx 代理設定

docker ps -a  獲取nginx容器ID

docker exec -it 容器ID /bin/bash 進入容器

因為容器沒有安裝VIM,先安裝VIM

apt-get update && apt-get install vim -y

進入/etc/nginx/conf.d

新建檔案

vim xxxx.conf

server {
    listen        80;
    server_name   example.com *.example.com;
    location / {
        proxy_pass         http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

可參考

https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-3.1

nginx -t  配置檔案檢測

nginx -s reload 更新配置檔案

最後成果:

&n