前幾篇文章中,我們討論瞭如何通過流水線實現專案的編譯、上傳、打包、部署等操作,今天我們來實現一套完整的流程,把之前碎片化的知識點給串起來。
本次我們使用一個ASP.NET Core的WebApi專案來進行專案的演示,後面也會寫java和golang的。
首先我們先建立一個ASP.NET Core WebAPI的模板專案,使用IDE建立就可以,我用的是jb全家桶的rider.
建立完成之後,我們稍微對專案做一點點修改,主要修改的內容為:關閉HTTP重定向,關閉鑑權,更改啟動埠為5001.
在Program.cs中刪除 HTTP重定向,鑑權的程式碼,在luanchsetting.json中更改啟動埠為5000,注意這裡改的只是你本地debug時候的埠和編譯後部署時的不是一個配置。
這些搞好之後,啟動專案,會自動彈開swagger的頁面,我們訪問一下里面的模板介面,可以看到返回了一個標準的json資料結構。
這些都準備好之後,我們把我們的程式碼推送到倉庫裡去,建立倉庫的步驟不在贅述,我在系列文章的第一篇裡已經做了介紹:《Azure DevOps (一) 託管自己的Git倉庫》
程式碼推送好之後,我們開始建立編譯流水線來編譯我們的webapi程式碼。
點選流水線,建立流水線之後右側第一個選項就是.NET Core。畢竟是微軟的親兒子,地位都不一樣,點選新增之後,我們可以看到有很多的選項
來執行不同的階段,我們本次的目標是部署專案,所以我們使用publish來執行。
新增的時候這裡要注意下把web project的勾給取消掉,打這個勾是預設編譯mvc專案的他會去找你的wwwroot檔案和webconfig
勾選完之後我們執行一下編譯,然後就發現了一個天大的雷,身為微軟的親兒子,這個.NET Core的編譯外掛居然TM的不支援.NET 6,是的,你沒聽錯,我都懷疑這爹不是親的。(╯‵□′)╯︵┻━┻
既然出了這檔子事兒,我們也只能自己想辦法了,我選擇的是自己下載.NET6的SDK,自己編譯。
我們開啟.net core的官網,選擇linux安裝.net core sdk 網站地址:https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-ubuntu#2110-
因為我們流水線的執行環境是烏班圖,所以我裝的是烏班圖的。
安裝命令如下:
wget https://packages.microsoft.com/config/ubuntu/21.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb sudo apt-get update; \ sudo apt-get install -y apt-transport-https && \ sudo apt-get update && \ sudo apt-get install -y dotnet-sdk-6.0
然後我們在執行一下編譯命令 dotnet publish
最後我們整理一下azure的流水線指令碼,因為沒有外掛可用,所以這次的指令碼需要我們自己純手打,我們在script節點中加入sdk安裝命令,然後建立第二個scprit節點用來進行專案的編譯
當然全部寫在一個裡面也沒有什麼問題,但是還是建議分開,看著清爽。
指令碼如下:
# Starter pipeline # Start with a minimal pipeline that you can customize to build and deploy your code. # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml trigger: - main pool: vmImage: ubuntu-latest steps: - script: echo Hello, world! displayName: 'Run a one-line script' - script: | echo Add other tasks to build, test, and deploy your project. echo See https://aka.ms/yaml wget https://packages.microsoft.com/config/ubuntu/21.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb sudo apt-get update; \ sudo apt-get install -y apt-transport-https && \ sudo apt-get update && \ sudo apt-get install -y dotnet-sdk-6.0 displayName: 'Run a multi-line script' - script: cd /home/vsts/work/1/s; dotnet publish; cd /home/vsts/work/1/s/azure_dotnet_app/bin/Debug/net6.0/publish/; ls displayName: "publish dotnet"
然後我們執行一下看看效果,可以看到成功的安裝了SDK6
然後執行dotnet publish,這次成功完成了編譯
編譯完之後,我們需要新增一下製品上傳步驟,和我們之前的文章中一樣,我們需要把製品上傳到流水線的倉庫上去方便後面使用。
編輯流水線,新增製品上傳,目錄選擇我們的publish的目標目錄,最後完成的流水線指令碼如下:
# Starter pipeline # Start with a minimal pipeline that you can customize to build and deploy your code. # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml trigger: - main pool: vmImage: ubuntu-latest steps: - script: echo Hello, world! displayName: 'Run a one-line script' - script: | echo Add other tasks to build, test, and deploy your project. echo See https://aka.ms/yaml wget https://packages.microsoft.com/config/ubuntu/21.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb sudo apt-get update; \ sudo apt-get install -y apt-transport-https && \ sudo apt-get update && \ sudo apt-get install -y dotnet-sdk-6.0 displayName: 'Run a multi-line script' - script: cd /home/vsts/work/1/s; dotnet publish; cd /home/vsts/work/1/s/azure_dotnet_app/bin/Debug/net6.0/publish/; ls displayName: "publish dotnet" - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '/home/vsts/work/1/s/azure_dotnet_app/bin/Debug/net6.0/publish/' ArtifactName: 'dotnet_app' publishLocation: 'Container'
完成之後執行流水線,我們就可以在流水線的執行指令碼結果中看到我們的流水線製品
然後接下來,我們去建立釋出流水線,釋出流水線的內容非常簡單,前幾篇的文章中我們使用的是FTP,後來我發現SFTP更好用,所以這裡我們用SFTP
然後我們去準備一下伺服器的環境,在伺服器上安裝一下sdk和nginx,順道配置一下守護程式,程式碼如下:
centos安裝sdk:
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm sudo yum install dotnet-sdk-6.0
安裝nginx
yum install nginx
systemctl restart nginx
配置守護程式
[Unit] Description=Example .NET Web API App running on Ubuntu [Service] WorkingDirectory=/home/dotnet_app ExecStart=/usr/bin/dotnet /home/dotnet_app/azure_dotnet_app.dll Restart=always # Restart service after 10 seconds if the dotnet service crashes: RestartSec=10 KillSignal=SIGINT SyslogIdentifier=dotnet-example User=root Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target
配置反向代理:
server { listen 80; listen [::]:80; server_name _; root /usr/share/nginx/html; 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; } # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf;
啟動守護程式:
systemctl enable app
systemctl start app
systemctl status app
檢視服務狀態,服務正常執行。
然後,我們更改一下專案的原始碼,返回一句祖傳問候
然後在流水線中新增指令碼命令:systemctl restart app
最後我們重新執行一下流水線,等待流水線執行完後,我們訪問一下介面地址
成功輸出祖傳問候,第一個ASP.NET Core的流水線建立成功,完結撒花。
文章雖短,但是寫這篇文章用了三個小時才完成,踩了一堆的坑,大家在除錯過程中需要多多注意。