Как справляться с зависимыми задачами?

I.
Есть 2 основных ветки: master и dev. Процесс разработки такой: новая задача (task-1234) создается от master, разрабатывается и отправляется в dev, после в dev тестируется, закрывается в "тест среде" и сама задача (task-1234) отправляется в master. В dev можно пушить master. В master пушить dev нельзя. (можно это опустить и представить, что задачи вообще никуда не заливаются, а висят в ревью)

1) Простой пример: я имею 2 задачи - добавить index страницу ресурса Article и добавить crud кнопки на эту страницу для этого ресурса. Т.е. получается, что 2 задача зависит от первой. Первую я сделал и отправил в dev (или поставил на ревью), мне нужно приступать к второй сразу, ждать я не могу. Что мне делать?

2) Сложный пример: допустим, задач не 2, а 20. Это разработка большого модуля, часть задач являются подзадачами, часть просто зависимы от других. Как быть здесь?

II.
Я столкнулся с 2 примером и мне пришлось создавать зависимости между задачами, создавать одни на основе других и следить за изменениями в каждой, чтобы после обновлять зависимые. Все это мерджилось на dev, потом чистилось от того, что dev мерджился в них. Пришлось решать кучу конфликтов, а после еще и создавать одну результирующую задачу, в которую я замерждил всю эту кучу задач, решил все конфликты и именно ее отправил на master.

III.
После я нашел это: https://softwareengineering.stackexchange.com/a/351790, но не до конца пока это понял.

IV.
Поэтому пытаюсь понять, как я все же должен поступить в итоге, если снова столкнусь с кучей задач, которые частично связаны друг с другом. Есть ли универсальное решение такой проблемы?

V.
И доп. вопрос, вот ведение независимого master от dev очевидно имеет минусы. Gitflow предлагает делать резизы именно из dev, но вариант с релизами нам не подходит, т.к. из требований - непрерывная разработка. Чтобы задача выполнялась и могла быть сразу протестирована и отправлена на master. Есть ли для этого какие-то адекватные решения?
  • Вопрос задан
  • 650 просмотров
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
Возможно это вначале покажется чутка избыточным, но по размышлению - нет:

master == прод
dev == ветка стабильной разработки, где живут более-менее целостные фичи
feature_xx == опять же целостная, самостоятельная фича, привносящая осмысленный функционал и состоящая возможно из множества задач

фичи отращиваются и возвращаются в ветку dev и их можно даже на уровне ветки протестировать
в какой-то момент от ветки dev отращивается ветка release (по-сути релиз-кандидат) и потом по выпуску (релизу) вливается в master и dev
go to 1

при таком подходе в dev живёт достаточно стабильное решение, а ветках feature - конкретные фичи, которые к моменту влития в dev - в общем-то тоже стабильны и функциональны.

ну и собственно релизный цикл получает некую "асинхронность" относительно цикла разработки:
- захотел релиз-менеджер к юбилею фирмы выпустить релиз - пожалуйста - в dev есть пачка фич
- накопилось осмысленное кол-во фич - вперёд в релиз
- оттестирована конкретная ожидаемая фича - в релиз (ну и попутно менее значимые)

сорри за слегка вольный пересказ по-сути большинства моделей ветвления гита, гитлаба, атлассиана и др.)
Ответ написан
Комментировать
@aaltqna Автор вопроса
parent-1
  child-1
    child-child-1
    child-child-2
  child-2
  child-3 (по описанию требует код child-child-1)


Допустим, добавляется новый модуль, менеджер задач поддерживает иерархию, тогда:

I. Разработка.

1) создаю parent-1, в ней добавляется общий код.

2) на основе parent-1 создаются child-1..3
2.1) если в parent-1 происходят ЛЮБЫЕ изменения, то в каждом ее child я делаю rebase от измененной parent-1.

3) на основе child-1 создаются child-child-1..2
3.1) если в child-1 происходят ЛЮБЫЕ изменения, то в каждом ее child я делаю rebase от измененной child-1.

4) child-3 требует код child-child-1. Я делаю merge child-child-1 в child-3 и ставлю в менеджере задач, что child-3 блокируется child-child-1.
4.1) если в child-child-1 происходят ВАЖНЫЕ для child-3 изменения, то я снова делаю merge child-child-1 в child-3
4.2) если в child-child-1 происходят НЕВАЖНЫЕ для child-3 изменения, то я не делаю merge вообще

II. Доставка.

Сценарий 1) непрерывный вывод каждой задачи, тогда child-1 и child-2 и все их подзадачи доставляются сразу после закрытия их в тест среде как master merge сhild-n (child-child-n).

child-3, как имеющий зависимость, ожидает доставки своих зависимостей и только потом может быть доставлен сам.

Сценарий 2) релиз тип, модуль должен быть доставлен разом. Тогда создается еще одна результирующая задача (release-1) в нее вливаются все конечные узлы каждой parent-1 подзадачи.

Здесь можно выделить отдельной задачей частичный релиз, выбрав только часть подзадач parent-1.

В результате имеются изолированные задачи с конкретными зависимостями и 2 вариантами доставки. Теоритически с доп. информацией пришел к такой системе. Минусы?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы