Всем привет! В преддверии старта курсов «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).
По двум причинам, которые я опишу ниже:
Ниже приведено руководство по настройке и развертыванию Laravel 6 в Cloud Run:
1. Клонируйте Laravel или новый проект Laravel
Начните с клонирования Laravel или используйте composer или Laravel CLI, как указано в официальном руководстве по установке.
Я использую composer, чтобы получить последнюю версию Laravel, как показано ниже:
Я запустил следующую команду, чтобы получить последнюю версию Laravel:

2. Сначала протестируйте локально
Затем запустите

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

4. Добавьте репозиторий и README
Теперь после того, как вы создали репозиторий, добавьте его в локальную копию Laravel и добавьте README-файл.
Для этого выполните следующие команды в консоли:
После выполнения команды в моем репозитории на 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!
Больше никакого создания
7. Добавьте docker и выполните docker-compose для запуска приложения локально
А теперь давайте добавим docker и сделаем docker-compose, чтобы запустить приложение локально без PHP или artisan serve.
Эта часть руководства вдохновлена статьей Laravel on Google Cloud Run от Nicolas.
Если вы хотите узнать больше о Docker и Laravel, обратитесь к этой статье.
Для начала выполните следующие команды, чтобы обновить ветку master, так как мы добавили новый workflow-файл с помощью интерфейса GitHub:
Добавьте ключ в файл
Поскольку это всего лишь демо, так делать можно, но в реальных приложениях будьте осторожны с секретами. Для production-ready приложений, отключите дебаг и другие вещи, связанные с разработкой.
Добавьте такой Dockerfile в корень проекта:
Добавьте следующий файл в
После этого добавьте
Сведем все к главному.
Если вы пытаетесь понять все здесь написанное, это может быть исчерпывающе, поэтому давайте я расскажу вам о главных частях:
Ниже вы видите выходные данные после работы

Если у вас Laravel заработал с Docker, откройте новый pull-request (например, такой) и добавьте Docker в свой проект.
Следующие команды я запустил в корне проекта перед открытием Pull Request:
Вы получите что-то в таком роде:
И запустите следующие команды:
В качестве бонуса они запустят тест Laravel по умолчанию после push, как видно ниже:

Только владелец репозитория имеет доступ к вкладке Actions, поэтому другим людям не обязательно знать результаты ваших тестовых сборок
8. Добавляем деплой в Google Cloud button.
Теперь давайте развернем эту установку Laravel в Google Cloud Run простым способом. На данном этапе считается, что вы смерджили свой pull-request из ветки docker.
Давайте выполним следующие команды:
Добавьте следующее в свой файл
Внимательно замените последнюю часть HTTPs URL вашего репозитория, например, если ваш репозиторий находится по адресу он изменится на, затем сделайте коммит и push.
Ваш Pull Request должен выглядеть примерно так.
9. Деплой на Google Cloud Run
После мерджа вашего pull request перейдите на страницу репозитория и нажмите кнопку Run on Google Cloud.

После этого, если вы вошли в аккаунт Google и у вас есть Google cloud setup с одним проектом, нажмите кнопку «Продолжить». Возможно, вам придется немного подождать, после этого:
Если все идет хорошо, то на Google Cloud Shell вы увидите HTTPs URL, на который вы можете нажать, чтобы увидеть, что ваше приложение на Laravel работает, как показано ниже:

То, что случилось выше это:
10. Ура! Ваше приложение работает!
После того, как вы получите URL, вы увидите ваше приложение, работающее на Google Cloud Run, как показано ниже:

Если вы хотите развернуть другую версию, вы можете изменить свой pull request в master и снова нажать кнопку для деплоя.
Цены на Google Cloud Run очень щедрые. Вы можете запустить любое приложение в контейнере или веб-приложение в Google Cloud Run.
Я запускал домашний проект, который получал 1 запрос в минуту, и мне не нужно было ничего платить.
Под капотом он использует Knative и Kubernetes. Он также может быть запущен в вашем кластере Kubernetes, но кто захочет управлять кластером K8s, если можно просто сделать push и поучить масштабируемое бессерверное полностью управляемое приложение
Чтобы запустить Laravel 6 на Google Cloud Run быстро, следуйте следующим шагам:


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

За последние несколько лет популярность 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-бота для заказа кофе в заведении и оплаты онлайн. Записаться на второй день интенсива можно тут.