Запуск задач при изменении Semver: запуск заданий или порядок
Вот чего я пытаюсь достичь:
У меня есть проект с заданием на сборку для бинарной версии. Бинарному файлу требуется некоторое время для кросс-компиляции для каждой платформы, поэтому я хочу выпускать сборку только тогда, когда релиз помечен, но я хочу, чтобы локальная версия собиралась и тесты выполнялись для каждой зарегистрированной версии.
Основываясь на демонстрации летной школы... моя конфигурация трубопровода выглядит так:
resources:
- name: flight-school
type: git
source:
uri: https://github.com/nbering/flight-school
branch: master
- name: flight-school-version
type: semver
source:
driver: git
uri: https://github.com/nbering/flight-school
branch: master
file: version
jobs:
- name: test-app
plan:
- get: flight-school
trigger: true
- task: tests
file: flight-school/build.yml
- name: release-build
plan:
- aggregate:
- get: flight-school-version
trigger: true
- get: flight-school
passed: [test-app]
- task: release-build
file: flight-school/ci/release.yml
Это создает конвейер в веб-интерфейсе, который выглядит следующим образом:
Проблема в том, что когда я обновляю файл "release" в репозитории git, ресурс semver "flight-school-version" может проверять перед ресурсом git "flight-school", вызывая обработку сборки выпуска из git версия, назначенная для предыдущей регистрации.
Я хотел бы обойти этот способ, чтобы сборка выпуска отображалась как отдельная задача, но запускалась только при повышении версии.
Некоторые вещи, о которых я думал до сих пор
Создайте отдельный ресурс git с tag_filter
установить так, чтобы он работал только тогда, когда тег semver был передан мастеру
- Pro: Задания выполняются только когда нажата метка
- Con: Имеет ту же проблему с отключенным наследованием для тестов, что и приведенный выше пример на основе semver
Добавьте условную проверку для тега semver (или измените diff для файла), используя историю мерзавцев в извлечении как часть сценария сборки
- Pro: Будет делать то, что я хочу, не слишком много борясь с Concourse
- Con: не вижу разницу в пользовательском интерфейсе, фактически не читая вывод сборки
- Con: Сложно составить с другими задачами и типами ресурсов, чтобы сделать что-то с бинарным выпуском
Вручную вызвать сборку релиза
- Pro: Простота настройки
- Против: требует ручного вмешательства.
Используйте API для запуска приостановленного шага сборки по завершении тестов при обнаружении изменения версии
- Кон: Не видел примеров того, как другие делают это, кажется действительно сложным.
Я не нашел способа вызвать задачу, когда меняются и ресурс git, и ресурс semver.
Я ищу либо ответ для решения проблемы параллелизма в моем примере выше, либо альтернативный шаблон, который приведет к аналогичному рабочему процессу релиза.
2 ответа
Резюме
Вот то, что я придумал для решения, основываясь на предложениях из слабого канала Concourse CI.
Я добавил параллельный "релизный" трек, который фильтрует теги, похожие на версии с семантическим версионированием. Две дорожки совместно используют файлы конфигурации задач и сценарии сборки.
Фильтрация тегов
Ресурс git поддерживает tag_filter
вариант. Из README:
tag_filter
: Необязательно. Если указан, ресурс будет обнаруживать только коммиты, у которых есть тег, соответствующий выражению, выполненному дляbranch
, Шаблоны совместимы с glob(7) (как, например, bash).
Я использовал простой шаблон глобуса, чтобы соответствовать моим тегам semver (например, v0.0.1
):
v[0-9]*
Сначала я попробовал шаблон "extglob", точно соответствующий семантическим версиям, например так:
v+([0-9]).+([0-9]).+([0-9])?(\-+([-A-Za-z0-9.]))?(\++([-A-Za-z0-9.]))
Это не сработало, потому что ресурс git не использует extglob
вариант оболочки.
Конечный результат - это ресурс, который выглядит так:
resource:
- name: flight-school-release
type: git
source:
uri: https://github.com/nbering/flight-school
branch: master
tag_filter: 'v[0-9]*'
Повторное использование определений задач
Следующей проблемой, с которой я столкнулся, было избегание переписывания файла определения теста для дорожки релиза. Я должен был бы сделать это, потому что все пути к файлам используют имя ресурса, и теперь у меня есть ресурс для выпуска и разработки. Мое решение состоит в том, чтобы переопределить ресурс с помощью опции в задаче get.
jobs:
- name: test-app-release
plan:
- get: flight-school
resource: flight-school-release
trigger: true
- task: tests
file: flight-school/build.yml
Build.yml, приведенный выше, является стандартным примером из руководства по летной школе.
Собираем все вместе
Мой получившийся конвейер выглядит так:
Моя полная конфигурация конвейера выглядит так:
resources:
- name: flight-school-master
type: git
source:
uri: https://github.com/nbering/flight-school
branch: master
- name: flight-school-release
type: git
source:
uri: https://github.com/nbering/flight-school
branch: master
tag_filter: 'v[0-9]*'
jobs:
- name: test-app-dev
plan:
- get: flight-school
resource: flight-school-master
trigger: true
- task: tests
file: flight-school/build.yml
- name: test-app-release
plan:
- get: flight-school
resource: flight-school-release
trigger: true
- task: tests
file: flight-school/build.yml
- name: build-release
plan:
- get: flight-school
resource: flight-school-release
trigger: true
passed: [test-app-release]
- task: release-build
file: flight-school/ci/release.yml
На мой взгляд, вы должны вручную нажать на release-build
кнопку, и пусть все остальное будет автоматизировано. Я предполагаю, что вы вручную увеличиваете номер своей версии, но, кажется, лучше перенести это ручное вмешательство в выпуск.
То, что я хотел бы сделать, это положить в конце release-build
это наталкивает вашу минорную версию. Что-то вроде:
- put: flight-school-version
params:
bump: minor
Таким образом, вы всегда будете на правильной версии, как только вы выпустите 0.0.1
Вы закончили с этим навсегда, вы можете только идти вперед.