Azure DevOps (十一) 通過Azure Devops部署一個.NET Core WebAPI


前幾篇文章中,我們討論了如何通過流水線實現項目的編譯、上傳、打包、部署等操作,今天我們來實現一套完整的流程,把之前碎片化的知識點給串起來。

文章配套視頻專欄:

https://space.bilibili.com/38649342/channel/seriesdetail?sid=2267536

本次我們使用一個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的流水線創建成功,完結撒花。

文章雖短,但是寫這篇文章用了三個小時才完成,踩了一堆的坑,大家在調試過程中需要多多注意。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM