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

Tassdar發表於2022-04-20

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

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

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

相關文章