使用 TravisCI 持续交付 NuGet 包

· 2 分钟阅读

最近我做了一个教程,介绍如何使用 Travis CI 作为工具来自动测试您刚刚推送或尝试推送到 master 分支的代码。对其进行编译和测试,并最终向您报告更改的状态。

图片来自 Gyazo

但我们可以继续让它变得更好,例如上一个教程中制作的核心库,我想使用 NuGet feed 将其公开,这样每个人都可以在他们的库中轻松操作!

但是如何? 我们如何编译、测试该包,然后将该包发布到提要中,以便每个人都可以在他们的项目中下载它?

好了,这就是 😁 的教程!

# 什么是新的?

代码几乎没有变化,我们需要改变的是打包、发布以及如何自动化它。

.NET Core CLI

我们将使用 .NET Core CLI,我们在上一个教程中使用了 dotnet restoredotnet builddotnet test 等命令。

现在我们将使用一组新命令!

dotnet nuget

您可以在此处查看这套工具的文档,但有一个简短的解释:

dotnet nuget 是一组基本工具,包括安装、恢复、删除和发布包。

NuGet 提要

NuGet 是 .NET 的包管理器。 NuGet 客户端工具提供了生成和使用包的能力。 NuGet Gallery 是所有包作者和使用者使用的中央包存储库。

NuGet 是免费的,因此您可以注册并获取 API 密钥并开始上传包。它们将被上传、验证,然后为所有人列出。

获取API密钥

为了上传您的软件包,您需要在注册后获取 API 密钥,因此请转到 API 密钥页面 并创建一个新密钥。

图片来自 Gyazo

请记住,API 密钥的有效期为 365 天。

然后复制您的密钥并将其存储在某个地方,如页面中所述,您将无法再次看到它,如果您没有保存它,则必须重新生成它。

图片来自 Gyazo

生成NuGet包

现在我们已经有了 API 密钥,下一步是从解决方案生成 NuGet 包,因此请继续打开包含类库的解决方案。

我将使用上一篇教程 中的解决方案,其中有一个名为 CalculatorCLI.Core 的 .NET Core 库类。

现在转到项目属性,然后转到程序包,您将看到有关程序包的大量信息,例如程序包版本、作者、描述等。

接下来是填写此内容,您实际上不必填写所有内容,但重要且强制的内容是 Package idPackage versionAuthorsDescription。另外,如果您尝试自己上传文件,它将要求 License,我们也需要添加它。图片来自 Gyazo

然后你可以保存,右键单击项目并选择Pack

1>------ Build started: Project: CalculatorCLI.Core, Configuration: Debug Any CPU ------
1>CalculatorCLI.Core -> D:\Development\Personal\CalculatorCLI-demo\CalculatorCLI\CalculatorCLI.Core\bin\Debug\netstandard2.1\CalculatorCLI.Core.dll
1>Successfully created package 'D:\Development\Personal\CalculatorCLI-demo\CalculatorCLI\CalculatorCLI.Core\bin\Debug\CalculatorCLI.Core.1.0.0.1.nupkg'.
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

输出将显示,如果一切正常,它将打印 Successfully created package

使用 dotnet

与上一个教程一样,我们使用不同的命令来构建和测试解决方案。现在,我们将添加更多命令来打包和发布包。

这些命令是:

  1. dotnet pack -c <configuration>
  2. dotnet nuget push <package> <k <apikey> -s <source>

部署脚本

当我们要改变构建方式时,我相信拥有不同的文件,每个文件都包含取决于环境的构建定义,将是最好的主意。

因此,让我们在存储库的根目录中创建一个名为 scripts 的文件夹,其中包含三个 bash 脚本。

scripts\compile.sh

#!/bin/sh

echo "Restoring..."
dotnet restore ".\CalculatorCLI\CalculatorCLI.sln"   

echo "Building..."
dotnet build ".\CalculatorCLI\CalculatorCLI.sln" -c Release

scripts\test.sh

#!/bin/sh

echo "Testing..."
dotnet test ".\CalculatorCLI\CalculatorCLI.sln" -c Release -v n

scripts\push.sh

#!/bin/sh

echo "Packing..."
dotnet pack ./CalculatorCLI/CalculatorCLI.Core/CalculatorCLI.Core.csproj -c Release

echo "Pushing..."
dotnet nuget push ./CalculatorCLI/CalculatorCLI.Core/bin/Release/*.nupkg -s "https://nuget.org" -k $NUGET_API_KEY

改进 .travis.yml 文件

现在我们已经更新了源代码,我们知道了需要使用的命令,我们需要将持续交付与持续集成相集成。这样我们除了编码、测试、审查和推送之外实际上不需要做任何事情。

我们现在要对 .travis.yml 文件执行以下操作:

1.添加不同的stages 2. 每个stage取决于分支 3. 如果您的构建是在 master 上,则意味着必须更新包,因此我们将把包推送到 NuGet feeds 4. 如果您的构建是拉取请求,我们仍然会检查构建是否可以编译并测试,但我们不会发布它。

阶段

从他们的文档中:

您可以通过在构建配置(您的 .travis.yml 文件)中指定条件来过滤和拒绝构建、阶段和作业。

您可以在其文档页面中找到有关 TravisCI stages 的更多信息。

因此,我们将更改文件并添加阶段,最终结果如下:

language:
    csharp
sudo: required
mono: none 
dotnet: 3.0

os:
  - linux
    
jobs:
  include:
    - stage: compile
      script: bash scripts/compile.sh

    - stage: test
      script: bash scripts/test.sh

    - stage: deploy-prod
      if: branch = master AND type = push
      name: "Deploy to NuGet"
      script: bash scripts/push.sh

正如您所看到的,我们有三个不同的阶段 compiletestpush,最后一个阶段仅在 branchmaster 时运行,并且它不是 pull request,而只是 push

如果您不明白这一点,只需查看文档即可,它的解释非常简单。

考虑到这一点,所有 pull request 都不会将任何内容推送到 NuGet feed。

将 API 密钥设置为环境变量

转到存储库构建的设置并添加一个名为 NUGET_API_KEY 的新环境变量,其值是从 NuGet 页面复制的 api 密钥。

图片来自 Gyazo

创建一个 pull request

现在我们已经完成了所有设置,是时候创建一个 pull request 并检查该拉取请求的编译是否忽略了最后一个 stage

检查构建

当您发出拉取请求时,一个构建将在 TravisCI 仪表板中排队,正如您所看到的,我们有 2 个不同的构建,而不是三个。图片来自 Gyazo

现在让我们接受 pull request 并再次检查构建,看看我们现在有三个作业而不是两个。

图片来自 Gyazo

一旦您看到正在排队的构建,您就可以看到三个作业,包括末尾的 Deploy-prod

图片来自 Gyazo

整个构建完成后,您可以在日志中看到该包已被推送到源。

图片来自 Gyazo

显然你可以在 NuGet 页面中看到它

图片来自 Gyazo

图片来自 Gyazo

就是这样

在本教程中,我们了解了如何自动化 NuGet 包交付。我们使用了一些工具,例如 TravisCIstagesdotnet nuget

在我看来,即使这需要时间来正确设置,并且在某些情况下可能过于复杂。为了让一切变得完美和自动化,在这种技术上投入时间是值得的。

您可以在 此处 中找到源代码,如果您有任何疑问,请随时通过我的 twitter 与我联系!