Задать вопрос
dlnsk
@dlnsk
ПК Партнер 01.01 -> ПК Поиск -> IBM PC

Есть проблемка с symlinks... Как деплоить с минимальным downtime?

Есть несколько пет-проектов с перспективой. Пытаюсь наладить CI/CD. Чтобы снизить downtime решил использовать самый дешевый способ - symlinks. И вот столкнулся с интересной проблемой:
Дано:
1. Проект на Laravel
2. Установлен локальный Gitlab Runner
3. Все ПО работает в Docker-контейнерах.

Настройка:
Проект клонируется в такую папку (далее фрагменты job'а):
GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_RUNNER_SHORT_TOKEN/$CI_CONCURRENT_ID/$CI_PROJECT_NAME/$CI_COMMIT_BRANCH/$CI_COMMIT_SHORT_SHA

и затем линкуется в "правильную" папку
ln -srfT $GIT_CLONE_PATH $PROD_SRC_PATH

Используется относительная ссылка, чтобы потом, когда все это окажется в контейнере, ссылки не побились.
Чтобы загруженные пользователем файлы остались на месте, подключаем аналогичным способом папку с файлами
ln -srfT $PROD_DATA_PATH/storage $GIT_CLONE_PATH/storage


В docker-compose.yml ко всем нужным контейнерам подключаются необходимые папки
volumes:
    - ${OASIS_SRC}:/var/www/oasis
    - ./www/data:/var/www/data
    - ./www/builds:/var/www/builds


И вот тут появляется проблема:
Из-за того, что GIT_CLONE_PATH довольно длинная, то относительная ссылка на файлы пользователя принимает вид storage -> ../../../../../../data/oasis/storage. Но путь внутри контейнера не такой длинный (/var/www/oasis) и мы получаем ошибку No such file or directory.
Причем рядом лежит другой проект, сконфигурированный точно так же, но из-за архитектуры там большая глубина папок до исходников и все работает хорошо. :)

В целом проблема понятна. Есть очевидные пути решения:
1. Сократить путь GIT_CLONE_PATH (не хотелось бы).
2. Углубить папку внутри контейнера: ${OASIS_SRC}:/var/l/o/n/g/p/a/t/h/www/oasis (тоже как-то спорно).

Посоветуйте хороший способ деплоя, чтобы и downtime был небольшим.

PS: Выкинуть симлинки и поставить rsync? :)
  • Вопрос задан
  • 69 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
dlnsk
@dlnsk Автор вопроса
ПК Партнер 01.01 -> ПК Поиск -> IBM PC
Попробовал я уменьшить GIT_CLONE_PATH, как посоветовал VoidVolker ... и ничего не получилось! Хм. А проблемка оказалась вот в чем:
volumes:
    - ${OASIS_SRC}:/var/www/oasis

Дело в том, что если симлинк примонтировать к контейнеру, то он становится обычной папкой! И все относительные симлинки внутри начинают вести совершенно не туда.
Второй проект, о котором шла речь в вопросе, находится глубже (внутри монтируемой папки) и, соответственно, остается симлинком и относительные ссылки внутри спокойно работают.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
  1. Деплой в каталог по номеру выполняемой задачи
  2. Выполнить скрипты подготовки деплоя приложения
  3. Удалить симлинк на текущую версию проекта
  4. Создать новый симлинк на свежую версию
  5. Выполнить скрипты завершения деплоя приложения

А если запустить два-три инстанса приложения - то можно их обновлять по очереди и без полной остановки проекта. Само собой если в коде проекта допускается работа в несколько инстансов.
Ну и если что-то пойдёт не так - можно быстро откатить версию.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы