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

Я предпочитаю упорядочивать свои артефакты в 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 Tags вместе с Azure DevOps.

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


person Antebios    schedule 07.02.2019    source источник


Ответы (1)


Эта логика должна работать для любой системы 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 условия:

  1. если получится
  2. GitVersion.BranchName не начинается с тегов / (это гарантирует, что это событие сборки не было инициировано тегом), и
  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

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

введите здесь описание изображения

person Antebios    schedule 07.02.2019