Pull to refresh

Comments 13

Я настроил себе мощную 32-ядерную машину в облаке, которую обычно держу выключенной. Специальный скрипт мониторит очередь заданий через GitLab API и включает машину, если что-то ждёт выполнения. Через минуту машина поднимается, раннер выполняет все задания, и потом через 10 минут неактивности скрипт снова выключает машину.

Я использую bazel, который сильно параллелизует сборку и выжимает максимум из машины. На shared runner мой проект собирается около часа, а на моей сборочной машине - 5 минут. И при этом мне это почти ничего не стоит, т.к. в выключенном состоянии я плачу только за диск, а включенное состояние долго не длится. Такой вот лайфхак.

Выглядит отличным решением. А скрипт где крутиться, который поднимает машину?

У меня в прод-кластере Kubernetes. А вообще разницы нет. Программа крошечная и может работать, где угодно.

А может кто подскажет решение следующей проблемы. Дано: есть ветка master с релизами, прямой push в которую запрещён политикой Gitlab'а, и ветка dev, в которую могут отправлять изменения разработчики. Ветка master отличает от ветки dev только наличием файла gitlab-ci.yml, то есть код в них после слияния идентичный. При push'е в dev настроена сборочная линия (условно, один шаг), которая собирает текущий коммит и при успешной сборке ветка dev автоматически вливается в master (я в Gitlab'е для этого предварительно нажимаю специальную кнопку, включающую такое автоматическое слияние). Проблема в том, что после слияния опять запускается та же самая сборочная линия (шаг сборки + ещё дополнительный шаг — собственно, выкладка собранных артефактов на боевой сервер), а хотелось бы заиспользовать артефакты, оставшиеся после сборки на ветке dev и просто выложить их на боевой сервер (выполнить только шаг 2), так как сама сборка очень долгая — более 40 минут. В результате выкладка даже малейших изменений затягивается часа на полтора-два.

Используйте rules для исключения ненужных шагов в master ветке

Так проблема не в том, чтобы с помощью rules исключить ненужные шаги — это-то как раз легко. Проблема в том, как взять артефакты, собранные в другой ветке по заданию другой сборочной линии с целью выложить их на прод (смысла собирать их повторно нет, так как код идентичен).

Если вас не сильно беспокоит тэги ваших финальных сборок (если они вообще тэгируются), то могу предложить такое решение (если я правильно понял вашу задачу): последний шаг в dev ветке заливает ваши артифакты в хранилище (container registry, artifactory), а в мастер ветке через rules запрещаем билд, или переводим билд в мануальный режим. Мастер - только как хранилище рабочего проверенного кода, от которого просто отбранчевываются. По сути какая разница где был создан артефакт, в дев ветке или в мастере, если он сбилдился. А Деплой в прод берет их из хранилища. Только одно условие - в дев ветку должны сливаться все остальные ветки, а то получится расхождение в реальзованных фичах. Но я так понимаю, что у вас данное условие выполняется, ибо вы считаете, что мастер у вас делает бесполезный билд, значит в дев ветке у вас все фичи есть

Про теги я упомянул, потому что на некоторых проектах бранчи и теги в них - метаинформация для системы версионирования артефактов, поэтому зачастую важно в какой ветке был создан артефакт

Попробую этот вариант, наверное. Да, ветка master чисто хранилищем рабочего кода работает. На самом деле, это такая «интеграция» в систему хранения версий заказчика, потому что реальная разработка идёт вообще в другом хранилище и просто периодически сбрасывается в выделенную для нас ветку dev. Тегов тоже нет, так что не страшно.

Как вариант, можно выкачивать artifacts используя API гитлаба:

curl https://example.com/<namespace>/<project>/-/jobs/artifacts/<ref>/download?job=<job_name>

Тогда в gitlab-ci.yml в мастере можно проверять хэши коммитов в master и dev (на случай, если в dev уже попал какой-то новый код, который в master'е не должен находиться). Если они равны, то скачивать artifacts из пайплайна ветки dev, если нет, то билдить и использовать свои

Замечу, что only / except в общем случае правильнее заменить на rules. Они дают куда больше гибкости.

Sign up to leave a comment.