Недавно я построил конвейер «сборка-тестирование-публикация-развертывание-откат» и боролся с вопросом об одном или многих каналах. Я решил использовать один канал для выполнения всех задач по той причине, что было бы легко перейти в одно место и указать каналу, что вы хотите сделать, введя параметры. В то время это казалось хорошей идеей, но с момента ее выпуска я почувствовал несколько недостатков:
- Успех или неудача сборки конкретного конвейера не означает, что код приложения обязательно плох. Например, у нас произошел сбой производства из-за ошибки в коде канала, но это не значит, что сборка приложения плоха. Но значок состояния сборки показывает
Failed
in our ReadMe. Which isn't true (the way we see it).
- Это сложнее. В трубе имеется несколько путей, определяемых значениями параметров. Больше шансов на ошибку, труднее проверять и т. д.
- Грубо нарушает принцип единой ответственности, а также принцип наименьшего изумления. Он не обязательно будет делать то, что можно было бы ожидать, исходя из некоторых правил, которые я встроил в целях защиты пользователей. С более простой трубой вероятность ошибки будет меньше.
- Наша организация еще не перешла на настоящее непрерывное развертывание, поэтому всегда будет задержка и человек, нажимающий кнопку «развертывание», даже в отделе контроля качества. Возможно, мы перейдем к этапу контроля качества с компакт-дисков раньше или позже, но нам придется доказать безопасность и надежность всего этого, прежде чем начальству будет комфортно использовать компакт-диск в производстве.
Все это говорит об отдельных трубах с четко разграниченными функциями.
Сейчас я создаю еще один конвейер для службы того же типа и планирую провести рефакторинг, чтобы использовать отдельные каналы для сборки и развертывания - так же, как @jayhendren, указанный выше:
- Сборка, тестирование (на данный момент почти не существует), публикация артефактов.
- Я пытаюсь создать кулинарные книги, чтобы развернуть временные машины для развертывания, чтобы предоставить разработчикам изолированные тестовые песочницы.
- Развертывание в отделе контроля качества
- Развертывание в продукте
Стоит упомянуть одну вещь: мы определенно используем многоветвевые каналы, по крайней мере, для каналов сборки, и декларативный синтаксис везде, где это возможно.
Если подумать об этом, пока я пишу это, канал сборки может остаться таким, какой он есть сейчас, как задание многоветвевого конвейера, созданное на основе файла Jenkinsfile, живущего в репозитории приложения, и основанного на любом отправке на github.:
Затем я могу вручную создать дополнительные конвейеры для развертывания — шаблонные, чтобы они были универсальными, и передавать каждому из них только уникальные переменные. Обновлять.
Я хочу вернуться к этому и противоречить самому себе. После дальнейшего внутреннего обсуждения дизайна и моего собственного роста как пользователя Jenkins, я вернулся к
одна труба для всех задач
Разница заключалась в использовании меньшего количества параметров и управлении потоком с помощью ветки/PR, которая запускала сборку. Таким образом, хотя задачи могут различаться, выходные данные канала основаны только на его свойствах.