Как стать автором
Обновить

Комментарии 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 исключить ненужные шаги — это-то как раз легко. Проблема в том, как взять артефакты, собранные в другой ветке по заданию другой сборочной линии с целью выложить их на прод (смысла собирать их повторно нет, так как код идентичен).

https://docs.gitlab.com/ee/ci/pipelines/job_artifacts.html#access-the-latest-job-artifacts-by-url

не пробовали добавить шаг только для мастер ветки: скачать артефакты конкретного джоба ветки dev? Предварительно загрузив нужные файлы в артефакты, конечно

Если вас не сильно беспокоит тэги ваших финальных сборок (если они вообще тэгируются), то могу предложить такое решение (если я правильно понял вашу задачу): последний шаг в 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. Они дают куда больше гибкости.

Отличная статья

Зарегистрируйтесь на Хабре, чтобы оставить комментарий