使用Azure Pipelines从GitHub发布NuGet包

[本文目录]

ps: 阅读本文大概需要20分钟

欢迎大家点击上方公众号链接关注我,了解新西兰码农生活

  1. 什么是 YAML?

    1. name/value 名称/值

    2. collections 集合

    3. multiple data types 复合数据类型

    4. comments 注释

  2. Pipelines 的 YAML 结构

  3. 在 Azure DevOps Pipelines 中创建第一个任务

    1. 为您的项目应用 Azure DevOps Pipelines

    2. 设置触发器

    3. 设置作业池

    4. 运行第一个 Pipeline

  4. 向 Pipeline 添加任务

    1. 创建第一个 step

    2. 构建项目

    3. 为 .NET Core CLI 添加参数

  5. 发布 Artifact

    1. 打包代码

    2. 使用变量

    3. 发布 Artifacts

  6. 将 *.nupkg 文件发布到 NuGet 包源

    1. 创建 release pipeline

    2. 添加 Artifact

    3. 添加任务

    4. 创建 release

    5. 在 NuGet 上检查包

  7. 结语

长久以来我已经习惯使用经典的编辑器来配置 Azure DevOps Pipelines,该编辑器允许我们使用对用户友好的图形界面来配置 pipeline 的各种属性。但是配置 pipeline 的更好方法是使用YAML文件。您可以轻松调整 pipeline 的每个选项,并轻松克隆和共享。现在 YAML 已经是 Azure DevOps 中配置 pipeline 的默认模板。我已经开发了一个简单的 NuGet 程序包(为WPF, UWP 及 Xamarin实现一个简单的消息组件),该包集成了 Azure DevOps 来进行构建和发布。我将演示如何使用YAML文件创建新的 pipeline。在开始之前,让我们花一些时间来初步了解YAML。

1.什么是 YAML?

YAML(YAML不是标记语言)是一种适用于所有编程语言的对人类友好的数据序列化标准。

-- yaml.org[1]

YAML被设计为对人类友好,并且可以很好地与现代编程语言配合工作。它类似JSON。实际上,您可以将 YAML 作为JSON的超集。每个JSON文件也是一个有效的YAML文件。但是不同之处在于它们有不同的优先级。JSON 的首要目标是简单性和通用性,因此很容易在每种现代编程语言中生成和解析。但是对于YAML,首要的设计目标是提高人类的可读性。因此,YAML的生成和解析更加复杂。

想象一下如何描述基本的数据结构?有三个基本但非常重要的基元:mappings(即映射,如哈希/字典),sequences(即序列,如数组/列表)和 scalars(即标量,如字符串/数字)。我们可以这样描述JSON的结构:

  • 一个 name/value 的 collection。一个object以 {开头,以}结尾。每个名称后都带有:,name/value 之间以,分隔。

  • 一个 value 的 list/array。一个array 以[开头,以]结尾。value 以,分隔。

  • 一个 value 可以是双引号中的字符串,或者是数字,或者是true或false或null,或者是 object 或 array。这些结构可以嵌套。

YAML和JSON之间有一些相似之处。让我们看一下在YAML中如何实现这些特性。但由于 Azure DevOps Pipelines 不支持YAML的所有功能,因此我们不会介绍YAML的所有详细信息。

1.1 name/value 名称/值

YAML也包含一组 name/value 对,但不需要使用{和}。: 的左边是名称,:的右边是值。例如:

name: myFirstPipeline

注意,YAML中的 string 不需要用引号。但也可以用引号。

值可以是字符串或数字,也可以是 true,false或null或一个 object。YAML 使用缩进来表示嵌套对象。最好使用 2 个空格缩进,但不是必需的。例如:

variables:
var1: value1
var2: value2

1.2 collections 集合

YAML 使用[] 来表示数组或集合。例如:

sequence: [1, 2, 3]

另一种方式是使用 -,如下所示:

sequence:
- item1
- item2

1.3 multiple data types 复合数据类型

|表示关键字有多种数据类型。例如,job | templateReference表示该值允许是一个 job 或 template reference。

1.4 comments 注释

JSON不支持注释,但是可以在YAML中使用#进行注释。

2. Pipelines 的 YAML 结构

在 Azure DevOps 中设置 Pipelines 时,我们使用 Stages、 Jobs 和 Tasks 来描述 CI/CD 流程。一个 pipeline 可能包含一个或多个 Stage,例如 Build the app 和 Run tests 等。每个 Stage 都包含一个或多个 Job。每个 Job 都包含一个或多个 Task。让我们看一下 pipeline 的YAML文件的层次结构:

YAML文件的层次结构

您不需要所有级别,因为有时 pipeline 仅包含几个 Job,因此只需针对您的特定需求定制步骤即可。

3. 在 Azure DevOps Pipelines 中创建第一个任务

3.1 为您的项目应用 Azure DevOps Pipelines

您可以在 Azure DevOps Repo 或 GitHub 上托管项目。Azure DevOps Pipelines 支持许多存储库提供程序,例如 GitHub,Bitbucket 或其他 Git 系统。

如果您的项目托管在 GitHub 上,则可以轻松地从 GitHub Marketplace 安装 Azure Pipelines 插件:

安装 Azure Pipelines 插件

在 Marketplace 中搜索 pipeline,然后点击 Azure Pipelines, 按照向导将其安装到项目中。接下来,您可以在 Azure DevOps 中看到您的项目。

另一种方法是在 Azure DevOps 中创建一个新的空白项目,然后仅启用所需的模块(如仅启用 Pipelines,无需启用 Repos)。然后连接到您在 GitHub 上的项目存储库,并按照指南构建第一个 pipeline。

让我们创建一个新的 pipeline 来构建项目。在 Azure DevOps 菜单中单击 Pipelines,然后选择 Builds:

Azure DevOps 菜单

单击 New - New build pipeline:

创建新pipeline

Azure DevOps Pipelines 会请求项目位置:

选择项目位置

如果您喜欢经典的带界面的编辑器,请单击 Use the classic editor。但是这次,我将使用 YAML。因此,我单击 GitHub(YAML) 选项,然后选择存储库。Azure Pipelines 将分析存储库,并为项目推荐 Pipeline 模板。如果 Azure Pipelines 无法分析您的项目是什么类型,也可以手动进行配置:

配置项目类型

我将从头开始构建 pipeline。因此,我选择了 Starter pipeline。显然,您可以为项目的特定类型选择一个模板,以简化流程。您也可以单击 Show more 以检查更多可用模板。

选择模板后,Azure Pipelines 将在仓储库的根目录下创建一个名为azure-pipelines.yml的文件。Starter pipeline 的默认模板如下所示:

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
- master

pool:
vmImage: 'ubuntu-latest'

steps:
- script: echo Hello, world!
displayName: 'Run a one-line script'

- script: |
echo Add other tasks to build, test, and deploy your project.
echo See https://aka.ms/yaml
displayName: 'Run a multi-line script'

文件的内容可能会因项目而异。

您可以通过单击文件名链接来更改文件名:

更改 YAML 文件名称

3.2 设置触发器

我们已经了解了YAML的基础知识。让我们看一下该 YAML文件的内容。第一个关键字是 trigger,表示 Push 触发器。它指定当您推送更改到哪个分支时将导致构建过程。如果未指定此值,则每次 Push 代码到任何分支都会触发构建。

对于 trigger 键,有不同的选项,但是目前我们只需要知道,我们可以在此处设置分支名称即可,如下所示:

trigger:
- master

如果要添加更多分支,只需添加以下元素:

trigger:
- master
- develop

您还可以为branches,tags 和paths配置include和exclude 。完整语法为:

trigger:
batch: boolean # batch changes if true (the default); start a new build for every push if false
branches:
include: [ string ] # branch names which will trigger a build
exclude: [ string ] # branch names which will not
tags:
include: [ string ] # tag names which will trigger a build
exclude: [ string ] # tag names which will not
paths:
include: [ string ] # file paths which must match to trigger a build
exclude: [ string ] # file paths which will not trigger a build

您可以使用通配符指定标签的分支。通配符模式允许您使用 * 匹配零个或多个字符,并使用 ? 匹配单个字符。有关更多详细信息,请访问:触发器中的通配符[2]。

触发器的另一种类型是PR 触发器,它指定向哪些分支提交 Pull Request 将会导致构建。但是请记住,此功能仅适用于 GitHub 和 Bitbucket Cloud。如果您使用的是 Azure DevOps Repos,则可以配置用于生成验证的分支策略[3]触发构建以进行验证。

我正在使用 GitHub,因此我使用以下代码进行配置,对 master 分支有新的 Pull Request 时将会触发构建:

pr:
- master

3.3 设置作业池

pool 用于指定要用于作业的池。完整语法为:

pool:
name: string # name of the pool to run this job in
demands: string | [ string ] ## see below
vmImage: string # name of the vm image you want to use, only valid in the Microsoft-hosted pool

Azure DevOps 为我们提供了许多由 Microsoft 托管的池。您可以在这里找到它们:由 Microsoft 托管的作业代理[4]

当然,您也可以使用私有池,但需要首先创建构建代理, 不过这超出了本文的范围。

我想在 Windows 平台上构建项目,因此将 vmImage 更改为 windows-2019,即运行 Visual Studio 2019 的 Windows Server 2019。因此该配置将是:

pool:
vmImage: 'windows-2019'

如果您正在开发.NET Core 应用程序,则可以通过以下代码使用 Linux 平台(例如 Ubuntu):

pool:
vmImage: 'ubuntu-latest'

3.4 运行第一个 Pipeline

下面的部分是一些脚本。在更改它们之前,我们可以先保存 Pipeline 并尝试运行它。点击右上角的 Save and run。您可以在保存之前更改提交消息。您将看到如下所示的结果:

运行结果

实际上,此默认 Pipeline 模板仅显示如何运行输出回显消息的单行脚本和多行脚本。我们还需要添加任务来构建项目。

4. 向 Pipeline 添加任务

让我们看一下 Pipeline 任务的层次结构。我们可以使用 Stage、 Job 和 Step 对任务进行分类。基本上,一个Stage 是一系列 Job 的集合。Job 是 Step 的集合。Step 是组成一项 Job 的一系列特定操作,例如运行一段脚本或复制文件。下面是一个示例:

stages:
- stage: Build
jobs:
- job: BuildJob
steps:
- script: echo Building!
- stage: Test
jobs:
- job: TestOnWindows
steps:
- script: echo Testing on Windows!
- job: TestOnLinux
steps:
- script: echo Testing on Linux!
- stage: Deploy
jobs:
- job: Deploy
steps:
- script: echo Deploying the code!

如前所述,您不需要全部。如果您的 pipeline 只有一个 Stage 和一个 Job,则可以省略 stage 和 job,而仅使用 steps。

4.1 创建第一个 step

我倾向从最简单的方法开始。因此,让我们忽略 stage 和 job。首先,我将添加 steps 来构建项目。第一步是安装 .NET Core SDK。

删除默认 pipeline 中的 echo 脚本,然后添加 steps 部分,如下所示:

steps:
- task: UseDotNet@2
displayName: 'Install .NET Core SDK'
inputs:
packageType: 'sdk'
version: '2.x'

请不要只复制并粘贴它。尝试手动输入以测试功能强大的 Azure DevOps Pipelines 编辑器。当您为任务名称输入 dotnet 时,您会发现编辑器会自动显示一个包含此关键字的列表:

智能感知

这与 Visual Studio 中的智能感知类似。用向上或向下移动键然后按回车选择 UseDotNet@2。添加后,您会发现任务上方有一个灰色的 Settings 链接:

任务设置

点击Settings,您将在右侧看到配置面板:

任务配置面板

它节省了我们记住参数名称的时间。在 Version 文本框中输入2.x,然后单击 Add。该任务将添加到 pipeline 中:

配置参数

编辑器支持出色的智能感知,当您键入内容时,你会看到编辑器的实时提示:

智能感知

下一个问题是,我们如何知道需要使用的参数?对于.NET Core 工具,请在此处查看文档:使用.NET Core 任务[5]

Azure DevOps Pipelines 支持许多任务,例如生成任务,工具任务,测试任务,部署任务和实用程序任务等。您可以在此处找到支持的任务列表:构建和发布任务[6]

4.2 构建项目

现在,我们已经为项目安装了.NET Core SDK。接下来,我们需要调用 .NET Core CLI 来构建项目。在当前 steps 部分中添加一个新任务,并选择 DotNetCoreCLI@2,因为我们使用的是 .NET Core v2.x。当您看到任务上方的  Settings 链接时,可以在任务配置面板中轻松配置它:

任务配置面板

新任务如下所示:

- task: DotNetCoreCLI@2
inputs:
command: 'build'
projects: 'FunCoding.CoreMessenger/FunCoding.CoreMessenger/FunCoding.CoreMessenger.csproj'

当您指定项目路径时,可以使用通配符 (如使用 **/*.csproj 匹配所有子目录下的所有*.csproj 文件)。您还可以指定 build 命令的参数。

现在让我们使其尽可能简单。单击右上角的 Save ,输入您的提交消息,然后单击 Save:

保存 pipeline

保存 pipeline 后,可以通过单击右上角的 Run 来运行它。选择正确的 branch 或 tag,然后单击 Run:

运行 pipeline

您将看到 pipeline 正常运行:

pipeline 运行结果

4.3 为 .NET Core CLI 添加参数

当我们使用 .NET Core CLI 的 dotnet build 命令时,默认配置为 debug。我们需要指定release模式。因此,我们可以添加一个configuration参数,如下所示:

- task: DotNetCoreCLI@2
displayName: 'Build the project'
inputs:
command: 'build'
configuration: 'Release'
projects: 'FunCoding.CoreMessenger/FunCoding.CoreMessenger/FunCoding.CoreMessenger.csproj'

如果我们只需要一个验证 PR 的 build pipeline,这已经足够了。我们只需要验证构建,而无需打包和发布软件包。但是对于发布流程来说,我们需要打包项目并生成* .nupkg文件。因此,让我们继续实现打包及发布。

5. 发布 Artifact

下一步是使用 .NET Core CLI 的 dotnet pack 命令将代码打包到 NuGet 包中,然后将其发布到一个文件夹中。

5.1 打包代码

dotnet pack 命令用于构建项目并创建 NuGet 软件包。我们需要添加另一个任务来使用此命令。选择DotNetCoreCLI@2任务,然后单击Settings:

任务配置

我们需要选择 pack 命令。然后选择要打包的项目的正确路径。我们可以将 Configuration to Package和Package Folder 保留为默认值。对于 Do not build 复选框,我们可以将其选中,因为在上一个步骤中,我们已经完成了构建。在 Pack options 中,我们可以选择版本控制模式。更多细节可参考:

版本方案

对于 byPrereleaseNumber,版本将设置为您为主要,次要和补丁选择的任何内容,以及日期和时间,格式为 yyyymmdd-hhmmss。

对于 byEnvVar,版本将设置为您提供的环境变量,例如 MyVersion(没有**$**,仅是环境变量名称)。确保将环境变量设置为正确的 SemVer,例如 1.2.3或1.2.3-beta1。

对于 byBuildNumber,版本将设置为构建版本号,请确保您的构建版本号是正确的 SemVer,例如 1.0.$(Rev:r)。如果选择 **byBuildNumber **,该任务将提取一个由点分隔的版本“ 1.2.3.4”,并仅使用该版本,并删除所有标签。要按原样使用构建版本号,您应该如上所述使用 byEnvVar,并设置BUILD_BUILDNUMBER 环境变量。

对于此演示,我不想将其作为正式版本发布到 NuGet。所以我选择byPrereleaseNumber。它会在Major.Minor.Patch 版本之后附加一个后缀,因此它会显示为一个预发行版本。预发行版本是带有-的标签,后面添加您想要的字母和数字。例如,版本 1.0.0-beta,1.0.0-build12345 都是 1.0.0 的预发行版本。这称为 SemVer,表示语义化版本号。您可以在这里找到更多详细信息:Semantic Versioning[7]。当我们需要发布正式版本时,我们将不使用这种类型的打包选项。一种简便的方法是在 *.csproj 文件中对版本号进行硬编码,然后在此处将 Pack options 设置为 Off。但这意味着每次发布新版本都要更改*.csproj文件。还有一种方式是对dotnet pack命令使用参数如:dotnet pack -p:PackageVersion=2.1.0。我们还可以找到其他一些工具来简化我们的工作,例如 DotNetTools[8]。您可以使用工具或直接编写 PowerShell 脚本来更新版本号。

pack 任务如下所示:

- task: DotNetCoreCLI@2
displayName: 'Pack the package'
inputs:
command: 'pack'
configuration: 'Release'
packagesToPack: 'FunCoding.CoreMessenger/FunCoding.CoreMessenger/FunCoding.CoreMessenger.csproj'
nobuild: true
versioningScheme: 'byPrereleaseNumber'
majorVersion: '1'
minorVersion: '0'
patchVersion: '0'

如果 pipeline 正常运行,它将打包项目并将打包后的* .nupkg文件生成到$(Build.ArtifactStagingDirectory)中,该目录是 Azure DevOps 的预定义变量。您可以在此处找到预定义变量的相关内容:预定义变量[9]。

5.2 使用变量

目前,我们尚未指定构建配置。大多数项目的默认值为 Debug。所以我们需要给这个参数指定 Release。另外,我们发现这两个任务都包含项目路径。因此,我们可以使用 变量 来简化脚本。

变量允许我们定义一些可重复使用的键/值对。这也是避免在脚本中进行硬编码的好方法。当 Azure DevOps Pipelines 执行任务时,变量将被替换为正确的值。

如上一节所述,Azure DevOps 已经提供了一些预定义的变量。我们还可以定义自己的变量。让我们在 pool 部分之后添加一些变量:

variables:
configuration: 'Release'
projectPath: 'FunCoding.CoreMessenger/FunCoding.CoreMessenger/FunCoding.CoreMessenger.csproj'

然后我们可以使用$(variableName)在任务中应用这些变量:

- task: DotNetCoreCLI@2
displayName: 'Build the project'
inputs:
command: 'build'
configuration: $(configuration)
projects: $(projectPath)

- task: DotNetCoreCLI@2
displayName: 'Pack the package'
inputs:
command: 'pack'
configuration: $(configuration)
packagesToPack: $(projectPath)
nobuild: true
versioningScheme: 'byPrereleaseNumber'
majorVersion: '1'
minorVersion: '0'
patchVersion: '0'

Pipeline 将按预期工作。

实际上,我们可以接着使用dotnet push命令在 build pipeline 中将其推送到 NuGet 的包源。但这有点混淆了 build 与 release,因为理论上 build pipeline 只应执行构建工作。因此,我将创建另一个 release pipeline 将其推送到 NuGet 包源。

5.3 发布 Artifacts

下一步是发布 NuGet 包文件,以便 release pipeline 能够将其推送到 NuGet 包源。通过键入 publish 来添加新任务,然后选择 PublishBuildArtifacts@1:

添加新任务

您可以在此处找到有关此任务的更多详细信息:发布构建 Artifacts 任务[10]

单击 Settings ,并保留默认设置,然后单击 Add:

任务配置

打包项目时,Package Folder 的默认设置为 $(Build.ArtifactStagingDirectory)。因此,在发布步骤中,任务将从 $(Build.ArtifactStagingDirectory) 中获取打包好 NuGet 包文件,并将其发布到 Azure Pipelines 或文件共享。该脚本如下所示:

- task: PublishBuildArtifacts@1
displayName: 'Publish the package'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'

好的,现在触发此 pipeline 后,它将构建项目,然后打包并将 NuGet 程序包发布到 Azure Pipelines。我们可以在 build pipeline 结果页面上单击 Artifacts,然后单击 drop:

查看Artifacts

我们可以看到打包好的 *.nupkg 文件:

Artifacts 文件

注意,每次编译后,* .nupkg文件的名称后缀都会更改。因为上一个步骤中我们为pack任务选择了byPrereleaseNumber。如果您选择了其他的版本方案,名称会有所不同。

6. 将 *.nupkg 文件发布到 NuGet 包源

通常,我们应该有一个名为 release 的分支来发布软件包。但是为了简单起见,我继续将 master 分支用于 release pipeline。请记住,这不是 GitFlow 的最佳实践。我只想专注于YAML的内容。您可以在脚本中轻松更改目标分支。

6.1 创建 release pipeline

让我们创建一个 release pipeline。单击 Azure DevOps 菜单中的 Pipelines,然后单击右侧的 Releases :

Azure DevOps Releases菜单

在新窗口中,单击 New pipeline 。您将看到如下页面:

添加新pipeline

我们将从头开始创建 pipeline,因此请单击 Empty job:

release pipeline 配置

6.2 添加 Artifact

单击Add an artifact,然后您将看到一个页面用来配置 Artifact:

添加 Artifacts

为发布选择正确的 build pipeline。然后点击 Add。Artifact 将显示在这里:

选择好的 Artifact

6.3 添加任务

然后点击 Stage 1 下方的 1 job, 0 task 链接。您可以更新 Stage 和 作业代理的详细信息:

任务配置

点击 Job 右侧的 +:

添加任务

您将看到一个页面,显示 Azure DevOps 中的所有可用任务:

可用任务列表

在我写作这篇文章之前,我以为可以使用 dotnet push 命令将程序包推送到 NuGet 程序包源,所以选择了 .NET Core 任务,并从 Command 列表中选择了 nuget push 命令。但是发现 .NET Core CLI 抛出了错误:

Error: DotNetCore currently does not support using an encrypted Api Key.
Packages failed to publish

我在 GitHub 上发现了一个问题:DotNetCore currently does not support using an encrypted Api Key[11]。目前,.NET Core CLI 当前不支持使用 ApiKey 的方式,因为加密密钥所需的库不可用。因此,我们需要使用 NuGet Tool 来推送软件包:

选择 NuGet 任务

这里的配置有点小坑。Path to NuGet package(s) to publish 的默认值是$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg 。但是 release pipeline 将 artifacts 下载到了 System.ArtifactsDirectory,因此我们需要使用 $(System.ArtifactsDirectory)/**/*.nupkg。否则的话 release pipeline 会找不到 build pipeline 发布的 Artifacts。您可以在此处找到一些信息:NuGet 任务[12]。有关 Artifacts 的更多内容,请在此处查看文档:发布 Artifacts 和 Artifacts 源[13]。

下一个重要的事情是我们需要创建与 NuGet 服务器的连接。如果要将 NuGet 程序包发布到您的组织,请选择This organization/collection 作为 Target feed location。我正在将其发布到 NetGet,所以我选择External NuGet server (including other organizations/collections)。

如果尚未创建与 NuGet 服务器的连接,请单击 +New 以创建一个。您可以在 NuGet 门户中找到您的 ApiKey。Feed URL 应为https://api.nuget.org/v3/index.json。

创建 NuGet 服务连接

单击右上角的 Save 以保存配置。任务的最终配置如下所示:

NuGet 任务配置

这个任务非常简单,因为我们只需要使用一个命令。如果您还有更多任务,只需添加它们即可。您还可以为不同的环境创建不同的 Stage,例如 Dev,Stage 或 Prod。

6.4 创建 release

点击 Create release,您将看到用于配置发布的页面:

创建发布

单击 Create 以开始发布。然后返回该发布的详细信息页面,单击 Deploy:

开始部署

您将看到一个用于部署的新页面:

启动部署

单击 Deploy ,release pipeline 将启动发布。

如果 release pipeline 成功发布,则可以看到如下所示的结果:

发布结果

6.5 在 NuGet 上检查包

现在登录 NuGet,可以看到该预发布版本的软件包已经显示在这里:

检查 NuGet 上的包

请记住,带有自动后缀(如1.0.0-CI-10191202-034430)的软件包是预发行版本。因为我们在pack任务中选择了byPrereleaseNumber。如果要发布正式版本,则需要通过其他方式指定版本号。在 CI/CD 中,版本控制是另一件需要注意的事情。但是我想在这里停止,因为本文旨在展示如何从头开始编写YAML文件。我们没有涵盖 Git Flow 的全部细节,例如分支策略等。希望通过本文您能对YAML有一个基本的了解,并且能够开始编写第一个YAML文件。

7. 结语

最终的 build pipeline 的 YAML 文件如下所示:

trigger:
- master

pool:
vmImage: 'windows-2019'

variables:
configuration: 'Release'
projectPath: 'FunCoding.CoreMessenger/FunCoding.CoreMessenger/FunCoding.CoreMessenger.csproj'

steps:
- task: UseDotNet@2
displayName: 'Install .NET Core SDK'
inputs:
packageType: 'sdk'
version: '2.x'

- task: DotNetCoreCLI@2
displayName: 'Build the project'
inputs:
command: 'build'
configuration: $(configuration)
projects: $(projectPath)

- task: DotNetCoreCLI@2
displayName: 'Pack the package'
inputs:
command: 'pack'
configuration: $(configuration)
packagesToPack: $(projectPath)
nobuild: true
versioningScheme: 'byPrereleaseNumber'
majorVersion: '1'
minorVersion: '0'
patchVersion: '0'

- task: PublishBuildArtifacts@1
displayName: 'Publish the package'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'

在本文中,我介绍了 YAML是什么以及如何从头开始定义 YAML 文件。Azure DevOps Pipelines 为我们提供了一个具有智能感知能力的优秀编辑器,可用来轻松编写 YAML文件, 当然您也可以使用配置面板更新属性。我们没有涵盖有关 CI/CD 的所有详细信息。请检查 GitFlow[14] 并应用正确的分支策略。希望本文对您编写第一个YAML文件有所帮助。谢谢。

更多关于 Azure DevOps Pipelines 的内容,请参阅:Azure Pipelines 文档[15]。

参考资料

[1]

yaml.org: https://yaml.org/

[2]

触发器中的通配符: https://docs.microsoft.com/zh-cn/azure/devops/pipelines/build/triggers?WT.mc_id=DT-MVP-5001643&view=azure-devops&tabs=yaml#wildcards

[3]

用于生成验证的分支策略: https://docs.microsoft.com/zh-cn/azure/devops/repos/git/branch-policies?WT.mc_id=DT-MVP-5001643&view=azure-devops#build-validation

[4]

由Microsoft托管的作业代理: https://docs.microsoft.com/zh-cn/azure/devops/pipelines/agents/hosted?WT.mc_id=DT-MVP-5001643&view=azure-devops#use-a-microsoft-hosted-agent

[5]

使用.NET Core任务: https://docs.microsoft.com/zh-cn/azure/devops/pipelines/tasks/tool/dotnet-core-tool-installer?WT.mc_id=DT-MVP-5001643&view=azure-devops

[6]

构建和发布任务: https://docs.microsoft.com/zh-cn/azure/devops/pipelines/tasks/?WT.mc_id=DT-MVP-5001643&view=azure-devops

[7]

Semantic Versioning: https://semver.org/

[8]

DotNetTools: https://github.com/RicoSuter/DNT

[9]

预定义变量: https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?WT.mc_id=DT-MVP-5001643&view=azure-devops&tabs=yaml

[10]

发布构建 Artifacts 任务: https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/utility/publish-build-artifacts?WT.mc_id=DT-MVP-5001643&view=azure-devops

[11]

DotNetCore currently does not support using an encrypted Api Key: https://github.com/microsoft/azure-pipelines-tasks/issues/7160

[12]

NuGet任务: https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/package/nuget?WT.mc_id=DT-MVP-5001643&view=azure-devops#examples

[13]

发布Artifacts和Artifacts源: https://docs.microsoft.com/en-us/azure/devops/pipelines/release/artifacts?WT.mc_id=DT-MVP-5001643&view=azure-devops#download

[14]

GitFlow: https://datasift.github.io/gitflow/IntroducingGitFlow.html

[15]

Azure Pipelines 文档: https://docs.microsoft.com/zh-cn/azure/devops/pipelines/?WT.mc_id=DT-MVP-5001643&view=azure-devops

了解新西兰IT行业真实码农生活
请长按上方二维码关注“程序员在新西兰”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/312785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM(2)——JVM类加载机制

一、JVM类加载机制简介 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 在Java语言里面,类型的加载和连接过程都是在程序运…

PYPL 12月榜单发布,编程语言、IDE与数据库市场如何?

PYPL(PopularitY of Programming Language,编程语言流行指数)12 月份的榜单已经发布了。PYPL 是非常流行的参考指标,其榜单数据的排名均是根据榜单对象在 Google 上相关的搜索频率进行统计排名,原始数据来自 Google Tr…

JVM(3)——JVM类加载器

一、类加载器简介 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为“类加载器”。 类加载器虽然只用于实现类的…

.NET Core应用框架AA介绍(二)

AA的开源地址https://github.com/ChengLab/AAFrameWork AA框架是一个基础应用框架,是建立在众多大家熟知的流行工具之上并与之集成。比如:ASP.NET Core、Automapper、Dapper、Dapper-FluentMap、RabbitMQ、Redis、MassTransit、Log4net等等大家可以很方便…

JVM(4)——对象访问

一、对象创建过程在Java语言中,对象是如何访问的呢?对象访问在Java语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会涉及Java虚拟机栈、Java堆区、方法区。 对于下面这行代码, Object obj ne…

Java BIO、NIO、AIO的区别

一、基础概念 同步:是指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。 异步:是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知)。&…

鹅厂后台开发工程师的工作日常

写在前面 :本故事纯属虚构,如有雷同,不负责任。为了整理 Linux 开发和日常使用的常用命令,想了好几天才串了这么个故事。虽然有点牵强,但是内容还是挺干的~欢迎大家点评。在很久很久以前,鹅厂开发类工程师职…

.NET Core开发的iNeuOS工业互联网平台,发布 iNeuDA 数据分析展示组件,快捷开发图形报表和数据大屏...

经过一段时间的努力,iNeuDA产品组件已经开发和测试完成,现在正式上线。现在iNeuOS工业互联网操作系统的技术体系和产品体系更佳完善,为中小企业提供更佳全面解决方案。如下图:iNeuDA 一站式大数据分析平台作为国内领先的新一代自助…

asp.net core 从 3.0 到 3.1

asp.net core 从 3.0 到 3.1Intro今天 .net core 3.1 正式发布了,.net core 3.1 正式版已发布,3.1 主要是对 3.0 的 bug 修复,以及一些小优化,而且作为 LTS 版本,建议大家升级。值得一提的是.net core 2.2 这个月就要寿…

Mac(OS X)必备软件

常有人说Mac上面软件少,没有Windows上面软件丰富,其实除了少数特定基于Windows平台的软件除外,其他软件都能在Mac上找到其相应版本或其他替代软件。本篇就Mac上常用软件做一下总结。 第一类:聊天/通讯 1、QQ QQ for Mac保留和QQ一…

身边的设计模式(三):抽象工厂 与 依赖注入

上篇文章,我们说到了简单工厂和工厂方法,如果没看过的,请先看上篇,不然的话,可能有些吃力,或者直接点击阅读原文,查看我博客园的对应详细版的文章。大家学到了这里,我建议自己可以练…

Java基础知识——Java集合详解

数组是Java很常见的一种数据结构,能够快速地进行存取。但是当遇到下面几种情况: ①我们需要存储的数据集数目是不定的 ②我们希望数据集能够自动排序 ③我们需要以键值对的方式存储数据 … 数组就不能满足我们的需求了。这时候,我们就需要使用…

边缘计算与云计算的不同,这篇说明白了!

术语“边缘计算”是指一种分布式计算,是将数据存储和计算带到需要它的站点或设备附近,这种分配设置消除了滞后时间并节省了带宽。与“物联网”相比,这是一种针对云环境的优化方法。它在数据源附近(即网络的“边缘”)处…

经典排序算法(12)——总结

一、排序算法简介 排序算法(Sorting algorithm)是一种能将一串数据,依照特定排序方式(依照其中的某个或某些关键字的大小)进行排列的一种算法。 常见的排序算法有:交换排序(冒泡排序、快速排序&…

在Asp.Net Core MVC 开发过程中遇到的问题总结

1. Q: Razor视图中怎么添加全局模型验证消息A&#xff1a;使用ModelOnly<div asp-validation-summary"ModelOnly" class"text-danger"></div>2.Q&#xff1a;树形表格&#xff0c;使用的是bootstrap-tablejquery.treegridA&#xff1a;效果参考…

为什么子线程中不能直接更新UI

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约4000字&#xff0c;预计阅读时间8分钟当初有同事就碰到类似的问题&#xff0c;于是就总结了一些&#xff0c;那时写这篇文章是我还在第一家公司。今天有人提到…

解决问题的能力 10倍程序员

大家好&#xff0c;我是Z哥。今天我们聊的话题对大多数人来说应该都算是一个“痛点”&#xff0c;就是怎么提高自己解决问题的能力。我们的工作中&#xff0c;每天会遇到大大小小的很多问题。其中有些是之前从未遇到过的问题&#xff0c;这对很多人来说就会很棘手&#xff0c;不…

.NET Core 3.1正式发布,还不赶快升级!

点击蓝字关注我们 .NET Core 3.1于2019年12月3日正式发布&#xff0c;这是一个长期支持&#xff08;LTS&#xff09;版本&#xff0c;并且将支持三年&#xff0c;这个版本对.NET Core的许多方面进行了改进&#xff0c;建议您尽快升级。 .NET Core 3.1 的变更日志很小。唯一新增…

.NET Core Blazor 1-Blazor项目文件分析

简介Blazor是一个使用.NET技术用于代替JavaScript/typescript的前端WEB框架。在前端开发中使用.NET语言进行书写逻辑有利于我们的性能、可靠性和安全性。并且对于使用.NET开发人员而言&#xff0c;全栈的成本更低。截止文章发布时&#xff0c;.NET Core已经发布了3.1版本&#…