如何使用 Azure DevOps 上的 GitVersion 将依赖于发布或预发布的工件上传到 Artifactory?
How do I upload Artifacts depending on Release or Prerelease to Artifactory using GitVersion on Azure DevOps?
我更喜欢在 Artifactory 中以 Repo[dev|test|prod] 的层次结构组织我的工件 -> 工件名称 -> 发布工件到这里 -> 预发布进入子文件夹。
为什么?因此,当我在 Artifactory Repository Browser 中导航时,我没有一棵非常长的树。我可以展开存储库并按工件名称查看第一级,但仍然看不到任何工件,然后展开工件名称叶,然后查看我发布的工件。但是,下面的顶部项目将是一个名为 "prerelease" 的子目录文件夹。这样做是为了让我可以轻松地手动删除我的所有预发布版本(如果我希望一次性删除),或者安排清理它们。
[My Repo]
|
+-\prerelease\
| |--artifact-1.2.3-ci0004.nupkg
| |--artifact-1.0.1-ci0002.nupkg
|--artifact-1.0.0.nupkg
|--artifact-1.0.1.nupkg
我知道如何使用 Artifactory filespec 将包上传到我的存储库:
** For Pre-Release
{
"files": [
{
"pattern": "$(build.artifactstagingdirectory)\*.nupkg",
"target": "myrepo-nuget-dev-local/$(PackageName)/prerelease/"
}
]
}
** For Release
{
"files": [
{
"pattern": "$(build.artifactstagingdirectory)\*.nupkg",
"target": "myrepo-nuget-dev-local/$(PackageName)/"
}
]
}
我需要做的是将每个文件规范放入其自己的构建步骤中,然后添加将执行一个构建步骤或另一个构建步骤但绝不会同时执行的条件。为什么?因为构建工件将永远是预发布或发布工件,但绝不会两者兼而有之。我正在使用 GitVersion 和 Git 标签以及 Azure DevOps。
所以问题是:自定义条件需要什么才能使其正常工作?
此逻辑适用于任何 CI 系统,但此语法适用于 Azure DevOps。
如何创建这些可以在这里找到:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops
这是它的样子:
预发布版:
and(succeeded(), not(startsWith(variables['GitVersion.BranchName'], 'tags/')), or(ne(variables['GitVersion.PreReleaseLabel'], ''),ne(variables['GitVersion.BuildMetaData'], '')))
这是说必须满足所有 3 个条件:
- 如果成功
- GitVersion.BranchName 不以 'tags/' 开头(这确保此构建事件不是由标记触发的),并且,
- GitVersion.PreReleaseLabel 不为空或 GitVersion.BuildMetaData 不为空
待发布:
and(succeeded(), or(and(eq(variables['GitVersion.PreReleaseLabel'], ''), eq(variables['GitVersion.BuildMetaData'], ''), eq(variables['GitVersion.BranchName'], 'master')), startsWith(variables['GitVersion.BranchName'], 'tags/')), ne(variables['Build.Reason'], 'PullRequest'))
这是说必须满足所有 3 个条件:
- 如果成功
- (GitVersion.PreReleaseLabel 为空 AND GitVersion.BuildMetaData 为空 AND GitVersion.BranchName 为 'master') OR (GitVersion.BranchName 以 'tags/' 开头)
- Build.Reason 不是 'PullRequest'
这是它的样子:
我更喜欢在 Artifactory 中以 Repo[dev|test|prod] 的层次结构组织我的工件 -> 工件名称 -> 发布工件到这里 -> 预发布进入子文件夹。
为什么?因此,当我在 Artifactory Repository Browser 中导航时,我没有一棵非常长的树。我可以展开存储库并按工件名称查看第一级,但仍然看不到任何工件,然后展开工件名称叶,然后查看我发布的工件。但是,下面的顶部项目将是一个名为 "prerelease" 的子目录文件夹。这样做是为了让我可以轻松地手动删除我的所有预发布版本(如果我希望一次性删除),或者安排清理它们。
[My Repo]
|
+-\prerelease\
| |--artifact-1.2.3-ci0004.nupkg
| |--artifact-1.0.1-ci0002.nupkg
|--artifact-1.0.0.nupkg
|--artifact-1.0.1.nupkg
我知道如何使用 Artifactory filespec 将包上传到我的存储库:
** For Pre-Release
{
"files": [
{
"pattern": "$(build.artifactstagingdirectory)\*.nupkg",
"target": "myrepo-nuget-dev-local/$(PackageName)/prerelease/"
}
]
}
** For Release
{
"files": [
{
"pattern": "$(build.artifactstagingdirectory)\*.nupkg",
"target": "myrepo-nuget-dev-local/$(PackageName)/"
}
]
}
我需要做的是将每个文件规范放入其自己的构建步骤中,然后添加将执行一个构建步骤或另一个构建步骤但绝不会同时执行的条件。为什么?因为构建工件将永远是预发布或发布工件,但绝不会两者兼而有之。我正在使用 GitVersion 和 Git 标签以及 Azure DevOps。
所以问题是:自定义条件需要什么才能使其正常工作?
此逻辑适用于任何 CI 系统,但此语法适用于 Azure DevOps。
如何创建这些可以在这里找到:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops
这是它的样子:
预发布版:
and(succeeded(), not(startsWith(variables['GitVersion.BranchName'], 'tags/')), or(ne(variables['GitVersion.PreReleaseLabel'], ''),ne(variables['GitVersion.BuildMetaData'], '')))
这是说必须满足所有 3 个条件:
- 如果成功
- GitVersion.BranchName 不以 'tags/' 开头(这确保此构建事件不是由标记触发的),并且,
- GitVersion.PreReleaseLabel 不为空或 GitVersion.BuildMetaData 不为空
待发布:
and(succeeded(), or(and(eq(variables['GitVersion.PreReleaseLabel'], ''), eq(variables['GitVersion.BuildMetaData'], ''), eq(variables['GitVersion.BranchName'], 'master')), startsWith(variables['GitVersion.BranchName'], 'tags/')), ne(variables['Build.Reason'], 'PullRequest'))
这是说必须满足所有 3 个条件:
- 如果成功
- (GitVersion.PreReleaseLabel 为空 AND GitVersion.BuildMetaData 为空 AND GitVersion.BranchName 为 'master') OR (GitVersion.BranchName 以 'tags/' 开头)
- Build.Reason 不是 'PullRequest'
这是它的样子: