- PVSM.RU - https://www.pvsm.ru -

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией

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


За последние несколько лет популярность Laravel резко возросла [3]. Сообщество Laravel даже придерживается мнения, что Laravel сделал процесс работы на PHP приятнее, по сравнению с той болью, которая была раньше. В Laravel 6 есть несколько новых интересных функций [4]. Получение супер-масштабируемого рабочего URL-адреса для вашего приложения занимает часы, если не дни. А создание чего-то вроде Kubernetes – это тяжелейшая задача. Именно в таких случаях Google Cloud Run выступает в лучшем свете, ведь с его помощью вы можете получить рабочий HTTPs URL-адрес для любого из ваших контейнерных приложений в считанные минуты.

Google Cloud Run [5] является бессерверным и полностью управляется 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$ [6] в течение 1 года, нет причин не заводить его).

Почему Cloud Run – отличный вариант для начинающих

По двум причинам, которые я опишу ниже:

  • Вы познакомитесь с лучшими практиками и программным обеспечением, таким как Docker и CI/CD.
  • Основной каркас будет работать после нажатия кнопки, выбора двух вещей и пяти минут ожидания, и вы сможете получить рабочий HTTPs URL. Куда уж проще?

Шаги по развертыванию

Ниже приведено руководство по настройке и развертыванию Laravel 6 в Cloud Run:

1. Клонируйте Laravel или новый проект Laravel

Начните с клонирования Laravel или используйте composer или Laravel CLI, как указано в официальном руководстве по установке [7].

Я использую composer, чтобы получить последнюю версию Laravel, как показано ниже:

composer global require laravel/installer

Я запустил следующую команду, чтобы получить последнюю версию Laravel:

composer create-project --prefer-dist laravel/laravel laravel6-on-google-cloud-run

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией - 1

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

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

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией - 2

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

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

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией - 3

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 оказалось следующее:

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией - 4

5. Добавьте полный Laravel, откройте Pull Request

Теперь давайте отправим все приложение как pull request в репозиторий GitHub, выполнив следующие команды:

После этого откройте Pull Request в репозитории, подобно этому [9]. Возможно, вы думаете, зачем мне нужен pull request, если я работаю над проектом один?

Ну, что ж, я считаю, что нужно всегда соблюдать системный подход, даже если вы работаете один.
После этого смерджите ваш pull request.

6. Настройка тестов с GitHub actions [10]

Не самая веселая часть. После того как вы смерджите свой pull request, GitHub будет знать, что это проект Laravel. Нажмите на вкладку Actions на странице своего репозитория и вы увидите что-то вроде того, что изображено ниже:

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией - 5

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

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией - 6

Вот так у вас появилась ваша установка CI. Тесты Laravel по умолчанию теперь будут запускаться при каждом git push. Разве сложно?
Спасибо Великому Разуму GitHub!
Больше никакого создания .myCIname.yml файлов!

7. Добавьте docker и выполните docker-compose для запуска приложения локально

А теперь давайте добавим docker и сделаем docker-compose, чтобы запустить приложение локально без PHP или artisan serve.

Эта часть руководства вдохновлена статьей Laravel on Google Cloud Run [11] от Nicolas.

Если вы хотите узнать больше о Docker [12] и Laravel, обратитесь к этой статье [13].

Для начала выполните следующие команды, чтобы обновить ветку 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 6 в Google Cloud Run с непрерывной интеграцией - 7

Если у вас Laravel заработал с Docker, откройте новый pull-request (например, такой [14]) и добавьте 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, как видно ниже:

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией - 8

Только владелец репозитория имеет доступ к вкладке Actions, поэтому другим людям не обязательно знать результаты ваших тестовых сборок

8. Добавляем деплой в Google Cloud button [15].

Теперь давайте развернем эту установку 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 вашего репозитория, например, если ваш репозиторий находится по адресу [16] он изменится на [17], затем сделайте коммит и push.

Ваш Pull Request должен выглядеть примерно так [18].

9. Деплой на Google Cloud Run

После мерджа вашего pull request перейдите на страницу репозитория и нажмите кнопку Run on Google Cloud.

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией - 9

После этого, если вы вошли в аккаунт 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 работает, как показано ниже:

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией - 10

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

  1. После выбора региона, скрипт построил образ docker-контейнера из Dockerfile в репозитории;
  2. Затем он сделал push собранного образа в Google Container Registry;
  3. После этого с помощью gcloud CLI он разворачивает собранный образ в Cloud Run, который возвращает URL – адрес.

10. Ура! Ваше приложение работает!

После того, как вы получите URL, вы увидите ваше приложение, работающее на Google Cloud Run, как показано ниже:

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией - 11

Если вы хотите развернуть другую версию, вы можете изменить свой 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 [19];
  • Перейдите по ссылке: https://github.com/geshan/laravel6-on-google-cloud-run [20];
  • Нажмите синюю кнопку “Run On Google Cloud”;
  • Выберите свой проект;
  • Выберите свой регион;
  • Подождите немного и получить URL-адрес для вашего приложения Laravel как показано ниже. Возрадуйтесь!

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией - 12

Пошаговое руководство по настройке Laravel 6 в Google Cloud Run с непрерывной интеграцией - 13

Заключение

Надеюсь, запуск приложения Laravel на Google cloud run оказался для вас простой задачей. Вы даже смогли запустить тесты с помощью Github actions. Надеюсь, эта статья оказалась для вас полезной.

Чтобы применить подход CI/CD, вы можете прочитать эту статью [21], в ней рассказывается об использовании сборки в облаке. Поскольку один и тот же контейнер работает локально и на продакшене (Google Cloud Run), вам не нужно изучать новый фреймворк, чтобы перейти на бессерверную архитектуру.

Любое веб-приложение в контейнере может запуститься на Google Cloud Run, поэтому я считаю его отличным сервисом!

На этом все, а мы напоминаем о том, что уже 21 и 22 января все желающие могут посетить бесплатный онлайн-интенсив [2], в рамках которого мы создадим Telegram-бота для заказа кофе в заведении и оплаты онлайн. Записаться на второй день интенсива можно тут [22].

Автор: MaxRokatansky

Источник [23]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/343907

Ссылки в тексте:

[1] «Framework Laravel»: https://otus.pw/lkbE/

[2] «Backend-разработчик на PHP»: https://otus.pw/dUJP/

[3] резко возросла: https://trends.google.com/trends/explore?date=2014-10-22%202019-10-21%5E_%5Eamp%5E_%5Eq=laravel,symfony

[4] интересных функций: https://laracasts.com/series/whats-new-in-laravel-6

[5] Google Cloud Run: https://cloud.google.com/run/

[6] кредит в 300$: https://cloud.google.com/free/

[7] установке: https://laravel.com/docs/5.8/installation

[8] http://localhost:8000: http://habr.com/ru/users/rodinvv

[9] этому: https://github.com/geshan/laravel6-on-google-cloud-run/pull/1

[10] GitHub actions: https://github.com/features/actions

[11] Google Cloud Run: https://nsirap.com/posts/010-laravel-on-google-cloud-run/

[12] Docker: https://www.docker.com/

[13] этой статье: https://geshan.com.np/blog/2015/10/getting-started-with-laravel-mariadb-mysql-docker/

[14] такой: https://github.com/geshan/laravel6-on-google-cloud-run/pull/2/files

[15] Google Cloud button: https://github.com/GoogleCloudPlatform/cloud-run-button

[16] адресу: https://github.com/ghaleroshan/laravel6-on-google-cloud-run

[17] на: https://github.com/ghaleroshan/laravel6-on-google-cloud-run.git

[18] так: https://github.com/geshan/laravel6-on-google-cloud-run/pull/3/files

[19] Google Cloud: https://console.cloud.google.com/

[20] https://github.com/geshan/laravel6-on-google-cloud-run: https://github.com/geshan/laravel6-on-google-cloud-run

[21] статью: https://medium.com/google-cloud/simplifying-continuous-deployment-to-cloud-run-with-cloud-build-including-custom-domain-setup-ssl-22d23bed5cd6

[22] можно тут: https://otus.pw/tOe7b/

[23] Источник: https://habr.com/ru/post/484738/?utm_campaign=484738&utm_source=habrahabr&utm_medium=rss