使用 亚马逊云科技 CodeBuild 构建.NET 7 应用程序

作者: 汤姆·摩尔 |

亚马逊云科技 CodeBuild 是一项完全托管的 DevOps 服务,用于构建和测试您的应用程序。作为一项完全托管的服务,无需管理基础架构,您只需为构建应用程序时使用的资源付费。CodeBuild 提供了默认的编译映像,其中包含.NET SDK 的当前长期支持 (LTS) 版本。

微软在11月发布了最新版本的.NET。此版本名为.NET 7,包括性能改进和功能,例如本地提前编译。(原生 AoT)... NET 7 是.NET SDK 的标准条款支持版本。此时 CodeBuild 的默认映像不支持.NET 7。对于想要立即开始在其应用程序中使用.NET 7 的客户,CodeBuild 提供了两种自定义构建环境的方法,以便您可以利用.NET 7。

自定义构建环境的第一个选项是为 CodeBuild 提供您创建和维护的容器镜像。使用这种方法,客户可以通过在容器映像中包含任何 SDK、运行时和工具来完全根据需要定义构建环境。但是,这种方法要求客户自己维护构建环境,包括修补和更新工具。这篇博客文章中将不介绍这种方法。

自定义构建环境的第二种方法是使用 buildspec 文件的安装阶段。此方法使用默认的 CodeBuild 映像,并在构建开始时添加其他功能。这样做的好处是,客户没有修补和维护构建映像的开销。

有关 buildspec 文件语法的完整文档可以在这里找到:

https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html

您的应用程序的 buildspec.yml 文件包含构建应用程序并为部署做准备所需的所有命令。对于典型的.NET 应用程序,buildspec 文件将如下所示:

```
version: 0.2
phases:
  build:
    commands:
      - dotnet restore Net7TestApp.sln
      - dotnet build Net7TestApp.sln
```

注意:此编译规范文件仅包含用于构建应用程序的命令,为简洁起见,省略了用于打包和存储构建工件的命令。

为了将.NET 7 SDK 添加到 CodeBuild 中以便我们可以构建您的.NET 7 应用程序,我们将利用构建规范文件的安装阶段。安装阶段允许您在开始实际构建之前安装任何第三方库或软件开发工具包。

```
  install:
    commands:
      - curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel STS 
```

上面的命令下载适用于.NET 的 Microsoft 安装脚本,并使用该脚本从标准条款支持频道下载和安装最新版本的.NET SDK。该脚本将在容器化构建环境中下载文件并设置环境变量。您可以使用相同的命令通过将命令参数 STS 更改为 LTS 来自动提取最新的长期支持版本的.NET SDK。

你更新后的 buildspec 文件将如下所示:

```
version: 0.2    
phases:
  install:
    commands:
      - curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel STS 
  build:
    commands:
      - dotnet restore Net7TestApp/Net7TestApp.sln
      - dotnet build Net7TestApp/Net7TestApp.sln
```

签入构建规范文件后,您可以通过 CodeBuild 控制台开始构建,您的.NET 应用程序将使用.NET 7 SDK 构建。

当你的编译运行时,你会看到类似这样的输出:

 ```
Welcome to .NET 7.0! 
--------------------- 
SDK Version: 7.0.100 
Telemetry 
--------- 
The .NET tools collect usage data in order to help us improve your experience. It is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell. 

Read more about .NET CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry 
---------------- 
Installed an ASP.NET Core HTTPS development certificate. 
To trust the certificate run 'dotnet dev-certs https --trust' (Windows and macOS only). 
Learn about HTTPS: https://aka.ms/dotnet-https 
---------------- 
Write your first app: https://aka.ms/dotnet-hello-world 
Find out what's new: https://aka.ms/dotnet-whats-new 
Explore documentation: https://aka.ms/dotnet-docs 
Report issues and find source on GitHub: https://github.com/dotnet/core 
Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli 
-------------------------------------------------------------------------------------- 
Determining projects to restore... 
Restored /codebuild/output/src095190443/src/git-codecommit.us-east-2.amazonaws.com/v1/repos/net7test/Net7TestApp/Net7TestApp/Net7TestApp.csproj (in 586 ms). 
[Container] 2022/11/18 14:55:08 Running command dotnet build Net7TestApp/Net7TestApp.sln 
MSBuild version 17.4.0+18d5aef85 for .NET 
Determining projects to restore... 
All projects are up-to-date for restore. 
Net7TestApp -> /codebuild/output/src095190443/src/git-codecommit.us-east-2.amazonaws.com/v1/repos/net7test/Net7TestApp/Net7TestApp/bin/Debug/net7.0/Net7TestApp.dll 
Build succeeded. 
0 Warning(s) 
0 Error(s) 
Time Elapsed 00:00:04.63 
[Container] 2022/11/18 14:55:13 Phase complete: BUILD State: SUCCEEDED 
[Container] 2022/11/18 14:55:13 Phase context status code: Message: 
[Container] 2022/11/18 14:55:13 Entering phase POST_BUILD 
[Container] 2022/11/18 14:55:13 Phase complete: POST_BUILD State: SUCCEEDED 
[Container] 2022/11/18 14:55:13 Phase context status code: Message:
```

结论

向应用程序的 buildspec.yml 文件中添加一行代码即可轻松地向 亚马逊云科技 CodeBuild 添加.NET 7 支持,该文件与应用程序源代码一起存储。此更改允许您随时了解.NET 的最新版本,同时仍可利用 CodeBuild 服务提供的托管运行时。

作者简介:

汤姆·摩尔

汤姆·摩尔是亚马逊云科技的高级专业解决方案架构师,专门帮助客户将微软.NET和Windows工作负载迁移到他们的亚马逊云科技环境中并对其进行现代化改造。