Всем привет! В преддверии старта курсов «Framework Laravel» и «Backend-разработчик на PHP», продолжаем делиться интересным материалом по теме. Поехали.




За последние несколько лет популярность 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

[![Run on Google Cloud](https://storage.googleapis.com/cloudrun/button.svg)](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 с одним проектом, нажмите кнопку «Продолжить». Возможно, вам придется немного подождать, после этого:

  1. Выберите проект — Choose a project to deploy this application
    Выберите регион — Choose a region to deploy this application, я обычно выбираю us-central-1
    Затем дождитесь, пока контейнер соберется и развернется, процесс в моем случае выглядит так:

Если все идет хорошо, то на Google Cloud Shell вы увидите HTTPs URL, на который вы можете нажать, чтобы увидеть, что ваше приложение на Laravel работает, как показано ниже:



То, что случилось выше это:

  1. После выбора региона, скрипт построил образ docker-контейнера из Dockerfile в репозитории;
  2. Затем он сделал push собранного образа в Google Container Registry;
  3. После этого с помощью 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-бота для заказа кофе в заведении и оплаты онлайн. Записаться на второй день интенсива можно тут.