将 .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 映像的示例。
先决条件
- 已安装 .NET 8 SDK
- 已安装 Docker
- Azure 订阅。您可以获得免费订阅,这将绰绰有余
- Github 帐户
- Docker Hub 帐户
使用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 模板
修改 .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/ 并下载发布配置文件:
添加新密钥
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 应用中,可以尝试重启它。
总结
您可以在 GitHub 存储库中找到我使用的所有代码:https://github.com/geffzhang/dotnetapi,在本文中,我想分享如何使用Github Action 工作流将.NET 8应用 部署到 Azure Web 容器应用的经验。
欢迎大家扫描下面二维码成为我的客户,扶你上云