將 .NET 8應用 以 dotnet publish 創建容器鏡像並結合 Github Actions 部署到 Azure 應用服務容器

介紹

.NET 8 無需 DockerFile 即可爲 .NET 應用創建 docker 映像的新方法,我將使用 dotnet publish 將 .NET 應用容器化,在本文中,我將分享我如何爲.NET 8的項目創建一個簡單的 ci/cd 的經驗。它包括 2 個主題:

  • 創建用於生成 .NET 應用並將其發佈到 Azure 的 GitHub 工作流
  • 如何使用 dotnet publish 的新功能創建 docker 映像的示例。

先決條件

使用Visual studio 2022或者是Visual studio code 創建 .NET 8 WEB API 項目 dotnetapi:

───dotnetapi
     ├───dotnetapi.sln
     └───dotnetapi.csproj

    └───其他文件

dotnet publish 現在可以在沒有 docker 文件的情況下創建映像。您可以在官方文檔中找到配置 docker 鏡像所需的一切。

dotnet publish /t:PublishContainer -r linux-x64 (確保在項目目錄下運行此命令)

運行該命令後,應在本地 docker 中心創建新Image。默認情況下,Image 名稱將等於項目名稱,這裏還要提一下的是 dotnet publish 現在默認在Release模式下發布應用。可以在 .csproj 文件中更改其名稱。將新設置添加到 .csproj 文件以修改生成的映像名稱:

    <ContainerRepository>yizhanshop</ContainerRepository>


<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>

    <TargetFramework>net8.0</TargetFramework>

    <Nullable>enable</Nullable>

    <ImplicitUsings>enable</ImplicitUsings>

    <InvariantGlobalization>true</InvariantGlobalization>

    <UserSecretsId>9d475c4e-a0e9-42ab-acc1-e54efb654a06</UserSecretsId>

    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>

    <DockerfileContext>.</DockerfileContext>

  <ContainerRepository>yizhanshop</ContainerRepository>


再次運行 dotnet publish 並確保創建名爲“yizhanshop”的新Image,在本地 docker 容器中運行我們的Image :

docker run -p 5000:8080 --rm yizhanshop

轉到瀏覽器中的 http://localhost:5000/,並確保 API 正在運行。

將鏡像推送到 docker hub

  • 轉到 docker hub 並生成一個新令牌(如果已有令牌,可以使用現有令牌)。
  • 使用您的 Docker Hub 用戶名和令牌(剛剛生成)登錄 Docker Hub

docker login -u <YOUR_USERNAME>

  • 使用您的用戶名標記圖像

docker tag yizhanshop <YOUR_USERNAME>/yizhanshop

  • 將鏡像推送到 docker hub

docker push <YOUR_USERNAME>/yizhanshop

創建 Azure 應用服務Create Azure App Service

現在,已在專用容器註冊表中創建Image,並已準備好將此映像部署到應用服務容器。我們將使用 Linux 容器,現在轉到 https://portal.azure.com/#create/Microsoft.WebSite 並使用 Linux 容器創建新的 Web 應用。

創建 Github 工作流

現在,將存儲庫推送到 GitHub並創建基本的Build工作流。我們可以從預定義的 GitHub 工作流開始,用於構建 .net 應用。轉到“Actions”並搜索“.net”。應會看到 .net 模板

image

修改 .net 版本以使用 .net 8 並提交到主分支,現在的內容如下:

# This workflow will build a .NET project

# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net

name: .NET

on:

push:

branches: [ "main" ]

pull_request:

branches: [ "main" ]

env:

yizhanshop_image: '${{ secrets.DOCKER_HUB_USERNAME }}/yizhanshop'

jobs:

build:

runs-on: ubuntu-latest

steps:

    - uses: actions/checkout@v3

    - name: Setup .NET

uses: actions/setup-dotnet@v3

with:

dotnet-version: 8.0.x

    - name: Restore dependencies

run: dotnet restore dotnetapi/dotnetapi.sln

    - name: Build

run: dotnet build --no-restore dotnetapi/dotnetapi.sln

    - name: Test

run: dotnet test --no-build --verbosity normal dotnetapi/dotnetapi.sln


將機密添加到存儲庫

現在,我們需要將 Docker hub 令牌和用戶名添加到存儲庫機密中,以便我們可以在管道中執行“docker login”。
轉到設置 => security: secrets and variables => Actions: New repository secret:

DOCKER_HUB_USERNAME => 您的 docker hub 用戶名
DOCKER_HUB_USERNAME =>您的 docker hub 令牌

此外,還需要添加應用服務發佈配置文件。
轉到應用服務 https://portal.azure.com/ 並下載發佈配置文件:

image

添加新密鑰

AZURE_WEBAPP_PUBLISH_PROFILE ->粘貼從 Azure 下載的字符串。

此外,添加一個變量 (不是SECRET) ,用於指示 Azure Web 應用名稱。就我而言,這是“yizhanshop”

AZURE_WEBAPP_NAME => 它應等於 Web 應用的“名稱”

修改工作流以自動推送新圖像

  • 首先,不要忘記將 github 所做的更改自動拉取到本地存儲庫
  • 轉到 .github/workflows/dotnet.yml,讓我們稍微修改一下創建的工作流

讓我們添加一些變量

env:

    yizhanshop_image: '${{ secrets.DOCKER_HUB_USERNAME }}/yizhanshop'

添加將創建 docker Image的步驟,並更改映像名稱的步驟,以便我們可以將其推送到我們的 docker hub 容器註冊表,登錄到 docker hub,將鏡像推送到 docker

steps:

    - uses: actions/checkout@v3

    - name: Setup .NET

uses: actions/setup-dotnet@v3

with:

dotnet-version: 8.0.x

    - name: Restore dependencies

run: dotnet restore dotnetapi/dotnetapi.sln

    - name: Build

run: dotnet build --no-restore dotnetapi/dotnetapi.sln

    - name: Test

run: dotnet test --no-build --verbosity normal dotnetapi/dotnetapi.sln

    - name: Create Docker Image

run: dotnet publish ./dotnetapi/dotnetapi.csproj /t:PublishContainer -r linux-x64

    - name: change image tag

run: docker tag yizhanshop ${{ env.yizhanshop_image }}

    - name: Login to Docker Hub

uses: docker/login-action@v3

with:

username: ${{ secrets.DOCKER_HUB_USERNAME }}

password: ${{ secrets.DOCKER_HUB_TOKEN }}

    - name: Docker Push

run: docker push ${{ env.yizhanshop_image }}


你可以試試。當對 PR 進行任何更改時,應觸發流水線 main或 main分支本身。 如果更改未反映在 Azure Web 應用中,可以嘗試重啓它。

image

總結

您可以在 GitHub 存儲庫中找到我使用的所有代碼:https://github.com/geffzhang/dotnetapi,在本文中,我想分享如何使用Github Action 工作流將.NET 8應用 部署到 Azure Web 容器應用的經驗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章