Есть несколько пет-проектов с перспективой. Пытаюсь наладить 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? :)