CI/CD для laravel-проекта на gitlab
3 500 руб. за проект
Нужен ci/cd для выкатывания laravel 9 проекта на shared hosting beget.
В результате должен получиться:
1. Dockerfile для запуска базового образа внутри gitlab runner, с последующим размещением его в gitlab registry
2. .gitlab-ci.yml для проекта с двумя шагами: build и prod
3. shell-скрипт для закачки сборки на удалённый shared хостинг beget
4. shell-скрипт для локальной настройки проекта на shared хостинге beget
Образ должен содержать:
1. Dockerfile отнаследованный от официального дистрибутива php 8.1, желательно на alpine https://hub.docker.com/_/php?tab=tags
2. Установленные пакеты: composer bash wget gomplate sshpass openssh-client mysql-client nano libjpeg libpng-dev libxml2-dev imap-dev libzip-dev freetype imagemagick npm nodejs
3. Установленные расширения: php-curl php-mbstring mysql-client php-dom php-simplexml php-pdo php-fileinfo php-tokenizer
4. Подключенные расширения: pdo pdo_mysql gd dom imap iconv fileinfo simplexml tokenizer xml bcmath zip
5. Могут понадобиться другие расширения, если они нужны для запуска стандартного дистрибутива laravel 9
Файл .gitlab-ci.yml должен содержать:
1. Шаг composer (stage: build) - собирает vendor, хранить можно 1 день
2. Шаг node (stage: build) - собирает node_modules и npm run build
3. Шаг deploy_prod (stage: prod) -
3.1. Собирает переменные в gomplate -f .env.tmpl >> .env
3.2. Запускает скрипт закачки получившегося проекта на удалённый хостинг
3.3. Запускает удалённый скрипт настройки проекта на удалённом хостинге
4. Все шаги выполняются последовательно и автоматически
Скрипт закачки должен уметь:
1. Принимать путь корня проекта и реквизиты доступа по ssh - из cicd environments gitlab
2. Подключиться к хостингу по ssh, принять ssh-ключ при помощи sshpass и openssh-client
3. Почистить временную папку на удалённом хостинге
4. Закачать получившийся проект по scp во временную папку на хостинге
5. Отчитаться в логи об успешной закачке
Скрипт удалённой настройки должен уметь:
1. Принимать путь до исполняемого файла php (особенность beget, запускает команды так: /opt/php/8.1/bin/php artisan)
2. Выкатывать проект по принципу Blue-Green Deployment: три директории (current, blue, green), собираем проект в "следующей", потом подключаем к current. Если удобно, можно blue-green реализовать уже на этапе закачки, в прошлом скрипте.
3. Установить доступы на папки проекта, согласно документации laravel
4. Настроить ссылку на storage, сам storage лежит вне сборок
5. Настроить ссылку на public => public_html (особенность beget)
6. Подключить ссылку на директорию logs
7. Применить миграции - php artisan migrate
8. Обновить кеш конфигов - php artisan config:cache
9. Переключить собранный пакет в директорию current
10. Отчитаться в логах об успешном переключении проекта
Структура папок на виртуальном хостинге в итоге примерно такая:
~/current
~/current/public_html <- корень проекта и index.php
~/blue
~/green
~/storage
~/tmp
~/logs
Для проверки работы нужно будет собрать базовую инсталляцию laravel 9 и проверить что она успешно выкатывается на хостинг beget. Пожелания и предложения принимаются.
В результате должен получиться:
1. Dockerfile для запуска базового образа внутри gitlab runner, с последующим размещением его в gitlab registry
2. .gitlab-ci.yml для проекта с двумя шагами: build и prod
3. shell-скрипт для закачки сборки на удалённый shared хостинг beget
4. shell-скрипт для локальной настройки проекта на shared хостинге beget
Образ должен содержать:
1. Dockerfile отнаследованный от официального дистрибутива php 8.1, желательно на alpine https://hub.docker.com/_/php?tab=tags
2. Установленные пакеты: composer bash wget gomplate sshpass openssh-client mysql-client nano libjpeg libpng-dev libxml2-dev imap-dev libzip-dev freetype imagemagick npm nodejs
3. Установленные расширения: php-curl php-mbstring mysql-client php-dom php-simplexml php-pdo php-fileinfo php-tokenizer
4. Подключенные расширения: pdo pdo_mysql gd dom imap iconv fileinfo simplexml tokenizer xml bcmath zip
5. Могут понадобиться другие расширения, если они нужны для запуска стандартного дистрибутива laravel 9
Файл .gitlab-ci.yml должен содержать:
1. Шаг composer (stage: build) - собирает vendor, хранить можно 1 день
2. Шаг node (stage: build) - собирает node_modules и npm run build
3. Шаг deploy_prod (stage: prod) -
3.1. Собирает переменные в gomplate -f .env.tmpl >> .env
3.2. Запускает скрипт закачки получившегося проекта на удалённый хостинг
3.3. Запускает удалённый скрипт настройки проекта на удалённом хостинге
4. Все шаги выполняются последовательно и автоматически
Скрипт закачки должен уметь:
1. Принимать путь корня проекта и реквизиты доступа по ssh - из cicd environments gitlab
2. Подключиться к хостингу по ssh, принять ssh-ключ при помощи sshpass и openssh-client
3. Почистить временную папку на удалённом хостинге
4. Закачать получившийся проект по scp во временную папку на хостинге
5. Отчитаться в логи об успешной закачке
Скрипт удалённой настройки должен уметь:
1. Принимать путь до исполняемого файла php (особенность beget, запускает команды так: /opt/php/8.1/bin/php artisan)
2. Выкатывать проект по принципу Blue-Green Deployment: три директории (current, blue, green), собираем проект в "следующей", потом подключаем к current. Если удобно, можно blue-green реализовать уже на этапе закачки, в прошлом скрипте.
3. Установить доступы на папки проекта, согласно документации laravel
4. Настроить ссылку на storage, сам storage лежит вне сборок
5. Настроить ссылку на public => public_html (особенность beget)
6. Подключить ссылку на директорию logs
7. Применить миграции - php artisan migrate
8. Обновить кеш конфигов - php artisan config:cache
9. Переключить собранный пакет в директорию current
10. Отчитаться в логах об успешном переключении проекта
Структура папок на виртуальном хостинге в итоге примерно такая:
~/current
~/current/public_html <- корень проекта и index.php
~/blue
~/green
~/storage
~/tmp
~/logs
Для проверки работы нужно будет собрать базовую инсталляцию laravel 9 и проверить что она успешно выкатывается на хостинг beget. Пожелания и предложения принимаются.
Отзывы
Дмитрий хорошо справился с поставленной задачей, всё сделал как нужно, и даже раньше оговоренного срока. Рекомендую.
2 года
назад
В заказе есть исполнитель
При переводе заказа из архивного в актуальный, текущий исполнитель будет снят с задачи.
Выберите тип сделки
С безопасной сделкой вы всегда сможете вернуть средства, если что-то пойдет не так. С простой сделкой вы самостоятельно договариваетесь с исполнителем об оплате и берете на себя решение конфликтов.