Запуск задач при изменении 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 был отправлен в master.

  • Плюс: задания запускаются только при нажатии тега.
  • Против: имеет ту же проблему с отключенным наследованием для тестов, что и в приведенном выше примере на основе semver.

Добавьте условную проверку для тега semver (или измените diff в файле), используя историю git в оформлении заказа как часть скрипта сборки

  • Pro: В основном буду делать то, что хочу, без особых проблем с Concourse.
  • Против: невозможно увидеть разницу в пользовательском интерфейсе, не прочитав вывод сборки.
  • Против: Трудно скомпоновать другие задачи и типы ресурсов, чтобы что-то сделать с бинарной версией.

Запуск сборки выпуска вручную

  • Плюс: просто настроить
  • Против: требуется ручное вмешательство.

Используйте API для запуска приостановленного этапа сборки по завершении тестов при обнаружении изменения версии

  • Против: не видел примеров, чтобы другие делали это, кажется действительно сложным.

Я не нашел способа запустить задачу, когда оба ресурса git и ресурса semver меняются.

Я ищу либо ответ для решения проблемы параллелизма в приведенном выше примере, либо альтернативный шаблон, который приведет к аналогичному рабочему процессу выпуска.


person nbering    schedule 22.02.2018    source источник


Ответы (2)


Резюме

Вот что я придумал для решения, основанного на предложениях канала Slack 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]*'

Повторное использование определений задач

Следующая проблема, с которой я столкнулся, заключалась в том, чтобы избежать повторной записи моего тестового файла определения для трека выпуска. Мне пришлось бы сделать это, потому что все пути к файлам используют имя ресурса, и теперь у меня есть ресурс для выпуска и разработки. Мое решение - переопределить ресурс опцией в задаче получения.

jobs:
  - name: test-app-release
    plan:
      - get: flight-school
        resource: flight-school-release
        trigger: true
      - task: tests
        file: flight-school/build.yml

Build.yml, приведенный выше, является стандартным примером из учебного курса летной школы.

Собираем все вместе

Получившийся в результате конвейер выглядит так:

Concourse Pipeline с параллельными треками

Моя полная конфигурация конвейера выглядит так:

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
person nbering    schedule 24.02.2018
comment
Вам следует ознакомиться с предстоящей функцией Concourse CI ... github.com/concourse/concourse/issues/1707 - person Dwayne Forde; 11.03.2018
comment
@DwayneForde Я посмотрю журнал изменений для этой новой функции. Когда это произойдет, я попытаюсь обновить свой конвейер, чтобы использовать его, и, если это сработает, я обновлю свой ответ. - person nbering; 11.03.2018

На мой взгляд, вам следует вручную нажать кнопку release-build, а все остальное автоматизировать. Я предполагаю, что вы вручную увеличиваете номер своей версии, но кажется лучше перенести это ручное вмешательство на выпуск.

Что бы я сделал, так это поставил бы в конец release-build, который поднимает вашу второстепенную версию. Что-то вроде:

- put: flight-school-version
  params:
    bump: minor

Таким образом, вы всегда будете использовать правильную версию, как только вы выпустите 0.0.1, вы навсегда покончите с ней, вы можете двигаться только вперед.

person Josh Zarrabi    schedule 24.02.2018
comment
Спасибо за Ваш ответ. По предложению кого-то из слабого канала Concourse CI, я думаю, что собираюсь довольствоваться параллельной цепочкой заданий, выполняемых на главном сервере и отфильтрованных по тегам в формате Semver. Я надеялся избежать этого, поскольку для этого требуется повторение заданий и ресурсов типа «копировать-вставить», но, похоже, это лучше всего подходит для моего рабочего процесса. Наверное, полностью откажусь от ресурса semver. Я обновлю ответ, как я это делаю, когда реализовал пример с летной школой. - person nbering; 24.02.2018