使用 TravisCI 持续交付 NuGet 包
最近我做了一个教程,介绍如何使用 Travis CI 作为工具来自动测试您刚刚推送或尝试推送到 master 分支的代码。对其进行编译和测试,并最终向您报告更改的状态。
但我们可以继续让它变得更好,例如上一个教程中制作的核心库,我想使用 NuGet feed 将其公开,这样每个人都可以在他们的库中轻松操作!
但是如何? 我们如何编译、测试该包,然后将该包发布到提要中,以便每个人都可以在他们的项目中下载它?
好了,这就是 😁 的教程!
# 什么是新的?
代码几乎没有变化,我们需要改变的是打包、发布以及如何自动化它。
.NET Core CLI
我们将使用 .NET Core CLI,我们在上一个教程中使用了 dotnet restore、dotnet build 和 dotnet test 等命令。
现在我们将使用一组新命令!
dotnet nuget
您可以在此处查看这套工具的文档,但有一个简短的解释:
dotnet nuget是一组基本工具,包括安装、恢复、删除和发布包。
NuGet 提要
NuGet 是 .NET 的包管理器。 NuGet 客户端工具提供了生成和使用包的能力。 NuGet Gallery 是所有包作者和使用者使用的中央包存储库。
NuGet 是免费的,因此您可以注册并获取 API 密钥并开始上传包。它们将被上传、验证,然后为所有人列出。
获取API密钥
为了上传您的软件包,您需要在注册后获取 API 密钥,因此请转到 API 密钥页面 并创建一个新密钥。
请记住,API 密钥的有效期为 365 天。
然后复制您的密钥并将其存储在某个地方,如页面中所述,您将无法再次看到它,如果您没有保存它,则必须重新生成它。
生成NuGet包
现在我们已经有了 API 密钥,下一步是从解决方案生成 NuGet 包,因此请继续打开包含类库的解决方案。
我将使用上一篇教程 中的解决方案,其中有一个名为 CalculatorCLI.Core 的 .NET Core 库类。
现在转到项目属性,然后转到程序包,您将看到有关程序包的大量信息,例如程序包版本、作者、描述等。
接下来是填写此内容,您实际上不必填写所有内容,但重要且强制的内容是 Package id、Package version、Authors 和 Description。另外,如果您尝试自己上传文件,它将要求 License,我们也需要添加它。
然后你可以保存,右键单击项目并选择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
与上一个教程一样,我们使用不同的命令来构建和测试解决方案。现在,我们将添加更多命令来打包和发布包。
这些命令是:
dotnet pack -c <configuration>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
正如您所看到的,我们有三个不同的阶段 compile、test 和 push,最后一个阶段仅在 branch 为 master 时运行,并且它不是 pull request,而只是 push。
如果您不明白这一点,只需查看文档即可,它的解释非常简单。
考虑到这一点,所有 pull request 都不会将任何内容推送到 NuGet feed。
将 API 密钥设置为环境变量
转到存储库构建的设置并添加一个名为 NUGET_API_KEY 的新环境变量,其值是从 NuGet 页面复制的 api 密钥。
创建一个 pull request
现在我们已经完成了所有设置,是时候创建一个 pull request 并检查该拉取请求的编译是否忽略了最后一个 stage。
检查构建
当您发出拉取请求时,一个构建将在 TravisCI 仪表板中排队,正如您所看到的,我们有 2 个不同的构建,而不是三个。
现在让我们接受 pull request 并再次检查构建,看看我们现在有三个作业而不是两个。
一旦您看到正在排队的构建,您就可以看到三个作业,包括末尾的 Deploy-prod。
整个构建完成后,您可以在日志中看到该包已被推送到源。
显然你可以在 NuGet 页面中看到它
就是这样
在本教程中,我们了解了如何自动化 NuGet 包交付。我们使用了一些工具,例如 TravisCI、stages 和 dotnet nuget。
在我看来,即使这需要时间来正确设置,并且在某些情况下可能过于复杂。为了让一切变得完美和自动化,在这种技术上投入时间是值得的。








