За последние несколько лет популярность Laravel резко возросла. Сообщество Laravel даже придерживается мнения, что Laravel сделал процесс работы на PHP приятнее, по сравнению с той болью, которая была раньше. В Laravel 6 есть несколько новых интересных функций. Получение супер-масштабируемого рабочего URL-адреса для вашего приложения занимает часы, если не дни. А создание чего-то вроде Kubernetes – это тяжелейшая задача. Именно в таких случаях Google Cloud Run выступает в лучшем свете, ведь с его помощью вы можете получить рабочий HTTPs URL-адрес для любого из ваших контейнерных приложений в считанные минуты.
Google Cloud Run является бессерверным и полностью управляется Google. Вы получаете супер-масштабирование, посекундную оплату, HTTPs URL и собственный маппинг домена.
Если вы хотите запустить stateless контейнеры, Cloud run – самый простой способ это сделать. В этой статья я подробно расскажу, как заставить ваше приложение Laravel 6 работать на Google cloud run с Continous Integration (CI).
Необходимые требования
- Вы знакомы с PHP/Composer и знаете о Laravel (думаю, иначе вы бы здесь не находились);
- Вы знаете, как использовать Git из консоли;
- Ваш код для CI/CD размещен на GitHub и вы знаете, как им пользоваться;
- Вы хорошо знакомы с Docker, может даже с многоступенчатой сборкой;
- У вас есть рабочий аккаунт Google Cloud (они дают вам беспроцентный кредит в 300$ в течение 1 года, нет причин не заводить его).
Почему Cloud Run – отличный вариант для начинающих
По двум причинам, которые я опишу ниже:
- Вы познакомитесь с лучшими практиками и программным обеспечением, таким как Docker и CI/CD.
- Основной каркас будет работать после нажатия кнопки, выбора двух вещей и пяти минут ожидания, и вы сможете получить рабочий HTTPs URL. Куда уж проще?
Шаги по развертыванию
Ниже приведено руководство по настройке и развертыванию Laravel 6 в Cloud Run:
1. Клонируйте Laravel или новый проект Laravel
Начните с клонирования Laravel или используйте composer или Laravel CLI, как указано в официальном руководстве по установке.
Я использую composer, чтобы получить последнюю версию Laravel, как показано ниже:
composer global require laravel/installer
Я запустил следующую команду, чтобы получить последнюю версию Laravel:
composer create-project --prefer-dist laravel/laravel laravel6-on-google-cloud-run

2. Сначала протестируйте локально
Затем запустите cd laravel6-on-google-cloud-run, а потом php artisan serve. Чтобы увидеть, что все работает, я перешел по адресу http://localhost:8000 в браузере и у меня все заработало. У меня был локально установлен PHP 7.2.

3. Создайте новый репозиторий на GitHub
Создайте новый репозиторий на GitHub, как показано ниже:

4. Добавьте репозиторий и README
Теперь после того, как вы создали репозиторий, добавьте его в локальную копию Laravel и добавьте README-файл.
Для этого выполните следующие команды в консоли:
git init code . # I used VS code to change the readme git add readme.md git commit -m "Initial commit -- App Readme" git remote add origin git@github.com:geshan/laravel6-on-google-cloud-run.git git push -u origin master
После выполнения команды в моем репозитории на GitHub оказалось следующее:

5. Добавьте полный Laravel, откройте Pull Request
Теперь давайте отправим все приложение как pull request в репозиторий GitHub, выполнив следующие команды:
После этого откройте Pull Request в репозитории, подобно этому. Возможно, вы думаете, зачем мне нужен pull request, если я работаю над проектом один?
Ну, что ж, я считаю, что нужно всегда соблюдать системный подход, даже если вы работаете один.
После этого смерджите ваш pull request.
6. Настройка тестов с GitHub actions
Не самая веселая часть. После того как вы смерджите свой pull request, GitHub будет знать, что это проект Laravel. Нажмите на вкладку Actions на странице своего репозитория и вы увидите что-то вроде того, что изображено ниже:

Щёлкните Set up this workflow под Laravel, а на следующей странице нажмите кнопку Start commit в правом верхнем углу. После этого добавьте сообщение коммита, как показано ниже и нажмите Commit new file.

Вот так у вас появилась ваша установка CI. Тесты Laravel по умолчанию теперь будут запускаться при каждом git push. Разве сложно?
Спасибо Великому Разуму GitHub!
Больше никакого создания .myCIname.yml файлов!
7. Добавьте docker и выполните docker-compose для запуска приложения локально
А теперь давайте добавим docker и сделаем docker-compose, чтобы запустить приложение локально без PHP или artisan serve.
Эта часть руководства вдохновлена статьей Laravel on Google Cloud Run от Nicolas.
Если вы хотите узнать больше о Docker и Laravel, обратитесь к этой статье.
Для начала выполните следующие команды, чтобы обновить ветку master, так как мы добавили новый workflow-файл с помощью интерфейса GitHub:
git checkout master git fetch git pull --rebase origin master # as we added the workflow file from github interface git checkout -b docker
Добавьте ключ в файл .env.example, скопируйте его из файла .env, как показано ниже:
APP_NAME=Laravel APP_ENV=local APP_KEY=base64:DJkdj8L5Di3rUkUOwmBFCrr5dsIYU/s7s+W52ClI4AA= APP_DEBUG=true APP_URL=http://localhost
Поскольку это всего лишь демо, так делать можно, но в реальных приложениях будьте осторожны с секретами. Для production-ready приложений, отключите дебаг и другие вещи, связанные с разработкой.
Добавьте такой Dockerfile в корень проекта:
FROM composer:1.9.0 as build WORKDIR /app COPY . /app RUN composer global require hirak/prestissimo && composer install FROM php:7.3-apache-stretch RUN docker-php-ext-install pdo pdo_mysql EXPOSE 8080 COPY --from=build /app /var/www/ COPY docker/000-default.conf /etc/apache2/sites-available/000-default.conf COPY .env.example /var/www/.env RUN chmod 777 -R /var/www/storage/ && \ echo "Listen 8080" >> /etc/apache2/ports.conf && \ chown -R www-data:www-data /var/www/ && \ a2enmod rewrite
Добавьте следующий файл в docker/000-default.conf:
<VirtualHost *:8080> ServerAdmin webmaster@localhost DocumentRoot /var/www/public/ <Directory /var/www/> AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
После этого добавьте docker-compose.yml:
version: '3' services: app: build: context: ./ volumes: - .:/var/www ports: - "8080:8080" environment: - APP_ENV=local
Сведем все к главному.
Если вы пытаетесь понять все здесь написанное, это может быть исчерпывающе, поэтому давайте я расскажу вам о главных частях:
- Мы используем официальный образ PHP Apache docker для запуска Laravel, он имеет версию PHP 7.3.
- Мы задействуем многоступенчатую сборку, чтобы получить зависимости с Composer, а затем копируем их в основной docker-образ, в котором есть PHP 7.3 и Apache.
- Поскольку Google Cloud Run требует, чтобы веб-сервер слушал на порту 8080, мы используем
000-default.conf, чтобы это сконфигурировать. - Чтобы упростить запуск docker-compose, введите всего одну команду docker-compose up.
- Теперь, когда вы дочитали до этого момента, запустите docker-compose из корня и все должно заработать по адресу
http://localhost:8080, в этом случае вы поймете, что Laravel 6 запущен локально в Docker.
Ниже вы видите выходные данные после работы docker-compose up до самого конца:

Если у вас Laravel заработал с Docker, откройте новый pull-request (например, такой) и добавьте Docker в свой проект.
Следующие команды я запустил в корне проекта перед открытием Pull Request:
git status
Вы получите что-то в таком роде:
On branch docker Untracked files: (use "git add <file>..." to include in what will be committed) Dockerfile docker-compose.yml docker/ nothing added to commit but untracked files present (use "git add" to track)
И запустите следующие команды:
git add . git commit -m "Add docker and docker compose" git push origin docker
В качестве бонуса они запустят тест Laravel по умолчанию после push, как видно ниже:

Только владелец репозитория имеет доступ к вкладке Actions, поэтому другим людям не обязательно знать результаты ваших тестовых сборок
8. Добавляем деплой в Google Cloud button
Теперь давайте развернем эту установку Laravel в Google Cloud Run простым способом. На данном этапе считается, что вы смерджили свой pull-request из ветки docker.
Давайте выполним следующие команды:
git checkout master git fetch git pull --rebase origin master git checkout -b cloud-run-button
Добавьте следующее в свой файл readme.md:
### Run on Google cloud run
[](https://console.cloud.google.com/cloudshell/editor?shellonly=true&cloudshell;_image=gcr.io/cloudrun/button&cloudshell;_git_repo=https://github.com/geshan/laravel6-on-google-cloud-run.git)
Внимательно замените последнюю часть HTTPs URL вашего репозитория, например, если ваш репозиторий находится по адресу он изменится на, затем сделайте коммит и push.
Ваш Pull Request должен выглядеть примерно так.
9. Деплой на Google Cloud Run
После мерджа вашего pull request перейдите на страницу репозитория и нажмите кнопку Run on Google Cloud.

После этого, если вы вошли в аккаунт Google и у вас есть Google cloud setup с одним проектом, нажмите кнопку «Продолжить». Возможно, вам придется немного подождать, после этого:
- Выберите проект — Choose a project to deploy this application
Выберите регион — Choose a region to deploy this application, я обычно выбираю us-central-1
Затем дождитесь, пока контейнер соберется и развернется, процесс в моем случае выглядит так:
Если все идет хорошо, то на Google Cloud Shell вы увидите HTTPs URL, на который вы можете нажать, чтобы увидеть, что ваше приложение на Laravel работает, как показано ниже:

То, что случилось выше это:
- После выбора региона, скрипт построил образ docker-контейнера из Dockerfile в репозитории;
- Затем он сделал push собранного образа в Google Container Registry;
- После этого с помощью gcloud CLI он разворачивает собранный образ в Cloud Run, который возвращает URL – адрес.
10. Ура! Ваше приложение работает!
После того, как вы получите URL, вы увидите ваше приложение, работающее на Google Cloud Run, как показано ниже:

Если вы хотите развернуть другую версию, вы можете изменить свой pull request в master и снова нажать кнопку для деплоя.
Больше о Google Cloud Run
Цены на Google Cloud Run очень щедрые. Вы можете запустить любое приложение в контейнере или веб-приложение в Google Cloud Run.
Я запускал домашний проект, который получал 1 запрос в минуту, и мне не нужно было ничего платить.
Под капотом он использует Knative и Kubernetes. Он также может быть запущен в вашем кластере Kubernetes, но кто захочет управлять кластером K8s, если можно просто сделать push и поучить масштабируемое бессерверное полностью управляемое приложение
TLDR
Чтобы запустить Laravel 6 на Google Cloud Run быстро, следуйте следующим шагам:
- Убедитесь, что вы вошли в свой аккаунт Google Cloud;
- Перейдите по ссылке: https://github.com/geshan/laravel6-on-google-cloud-run;
- Нажмите синюю кнопку “Run On Google Cloud”;
- Выберите свой проект;
- Выберите свой регион;
- Подождите немного и получить URL-адрес для вашего приложения Laravel как показано ниже. Возрадуйтесь!


Заключение
Надеюсь, запуск приложения Laravel на Google cloud run оказался для вас простой задачей. Вы даже смогли запустить тесты с помощью Github actions. Надеюсь, эта статья оказалась для вас полезной.
Чтобы применить подход CI/CD, вы можете прочитать эту статью, в ней рассказывается об использовании сборки в облаке. Поскольку один и тот же контейнер работает локально и на продакшене (Google Cloud Run), вам не нужно изучать новый фреймворк, чтобы перейти на бессерверную архитектуру.
Любое веб-приложение в контейнере может запуститься на Google Cloud Run, поэтому я считаю его отличным сервисом!
На этом все, а мы напоминаем о том, что уже 21 и 22 января все желающие могут посетить бесплатный онлайн-интенсив, в рамках которого мы создадим Telegram-бота для заказа кофе в заведении и оплаты онлайн. Записаться на второй день интенсива можно тут.
ссылка на оригинал статьи https://habr.com/ru/company/otus/blog/484738/
Добавить комментарий