Fork me on GitHub

将 .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 容器应用的经验。

posted @ 2024-01-20 23:26  张善友  阅读(177)  评论(0编辑  收藏  举报