Как загрузить артефакты в зависимости от версии или предварительной версии в Artifactory с помощью GitVersion в DevOps Azure? - PullRequest
0 голосов
/ 07 февраля 2019

Я предпочитаю организовывать свои артефакты в Artifactory в иерархию Repo [dev | test | prod] -> Имя артефакта -> Релизы. Артефакты идут сюда -> Предварительные релизы помещаются в подпапку.

Зачем?Поэтому, когда я перемещаюсь по браузеру Artifactory Repository, у меня нет чрезвычайно длинного дерева.Я могу развернуть хранилище и увидеть первый уровень по имени артефакта, но при этом не увидеть никаких артефактов, затем развернуть лист с именем артефакта и посмотреть мои выпущенные артефакты.Но верхним элементом под ним будет папка подкаталога с именем «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 для загрузкипакет в мой репозиторий:

** 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 вместе с DevOps Azure.

Итак, вопрос: каким должно быть пользовательское условие, чтобы это работало?

1 Ответ

0 голосов
/ 07 февраля 2019

Эта логика должна работать для любой системы CI, но этот синтаксис будет работать для DevOps Azure.

Как их создать, можно найти здесь: https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops

Вот как это выглядиткак:

enter image description here

Для предварительного выпуска:

and(succeeded(), not(startsWith(variables['GitVersion.BranchName'], 'tags/')), or(ne(variables['GitVersion.PreReleaseLabel'], ''),ne(variables['GitVersion.BuildMetaData'], '')))

Это означает, что все 3 условия ДОЛЖНЫвстретиться:

  1. при успешном завершении
  2. GitVersion.BranchName не начинается с 'tags /' (это гарантирует, что это событие сборки не было вызвано тегом), и,
  3. 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 условияхНЕОБХОДИМО выполнить:

  1. при успешном завершении
  2. (GitVersion.PreReleaseLabel пусто, а GitVersion.BuildMetaData пусто, а GitVersion.BranchName равно 'master') ИЛИ (GitVersion.BranchName начинается с 'tags / ')
  3. Build.Reason не является' PullRequest '

Вот как это выглядит:

enter image description here

...