В прошлых статьях этой серии мы установили Jenkins сервер в Docker контейнере, создали в нем задачу по синхронизацию репозиториев с GitHub, настроили возможность реагировать на GitHub commit-hook и запустили собственный Jenkins slave агент на базе нашего собственного Docker образа. Пришло время следать последний шаг: организовать деплой проекта в Google AppEngine.
Предварительные требования
В этой статье предполагается, что:
- Вы знакомы с Google Cloud и знаете о существовании консольной утилиты gcloud, при помощи которой можно эффективно управлять всеми облачными сервисами Google.
- У вас есть виртуальный или физический сервер с установленным на нем Docker Engine-ом, в котором установлен сервер Jenkins и собранный нами Jenkins slave агент.
Для создания процесса деплоя в Google AppEngine из Jenkins вам необходимо создать отдельную сервисную учетную запись в Google Cloud IAM. Мы выдадим ей все необходимые минимальные привилегии, необходимые Jenkins для публикации вашего кода.
Набор необходимых привилегий:
- AppEngine Admin (непосредственно для деплоя и переключения трафика)
- Storage Object Creator (возможность загрузить код на Cloud Storage)
- Storage Object Viewer (возможность читать код с Cloud Storage)
Чтобы настроить эти привилегии, перейдите в меню управления Google Cloud - IAM & admin - Service accounts
:
Нажмите на CREATE SERVICE ACCOUNT
и заполните форму следующим образом:
Нажмите на CREATE
и сохраните .json файл с аутентификационной информацией. Он понадобится далее для делегирования Jenkins возможности делать делой вашего проекта.
Создание проекта и деплой
После создания необходимой для Jenkins сервисной учетной записи в Google Cloud можно переходить к созданию и настройке проекта в Jenkins. Для этого в Jenkins необходимо создать 2 переменные окружения, в которых будет храниться аутентификационная информация для утилиты gcloud, необходимая ей для подключения к Google Cloud. Мы создадим эти переменные на уровне Jenkins slave ноды-контейнера. Перейдем в настройки ноды, созданной нами в прошлой статье Jenkins - Manage Jenkins - Manage Nodes
:
Переходим в ноду jenkins_slave
и выбираем в меню Configure
:
Спускаемся вниз до Node Properties
, устанавливаем галочку в Environment variables
и нажимаем кнопку Add
2 раза:
Далее необходимо создать 2 переменные:
- GCP_PROJECT_ID: имя вашего проекта в Google Cloud
- GCP_SECRET_KEY: base64 строка .json файла, полученного нами при создании сервисной учетной записи для Jenkins
$ cat my_json_secret_key.json | base64
И нажимаем кнопку Save
. Далее можно переходить к созданию в Jenkins проекта для автоматизации деплоя.
Создание проекта в Jenkins для деплоя кода в Google AppEngine
Для создания проекта для сборки\деплоя вашего кода в Jenkins перейдите в меню Jenkins - New Item
.
Задаем имя задачи, например, test_project - Deploy
, тип проекта – Freestyle project
.
В разделе General - GitHub project
указываем URL вашего репозитория, в моем случае – это https://github.com/andreivmaksimov/test_project/
.
В разделе Source Code Management - GitHub
устанавливаем параметры доступа к нашему репозиторию, а в качестве Build Triggers
выбираем GitHub hook trigger GITScm polling
:
В качестве Build step
выбираем Execute shell
. Используем следующее содержание:
echo $GCP_SECRET_KEY | base64 -d --ignore-garbage > $HOME/.gcloud_secret_key.json gcloud auth activate-service-account --key-file $HOME/.gcloud_secret_key.json gcloud config set project $GCP_PROJECT_ID pip install -t lib -r requirements.txt gcloud app deploy app.yaml --project $GCP_PROJECT_ID --quiet #--log-http --verbosity=debug
Суть этого шага в том, чтобы взять закодированное в base64 содержимое аутентификационного ключа и сохранить его в файле на локальной системе, активировать на основании него сервисную учетную запись, и определить проект, в который будет происходить деплой. В самом конце скачать все зависимости этого Python демо-проекта и вызвать деплой. В качестве результата демонстрирую выполнившуюся задачу:
Обратите внимание на закомментированные параметры --log-http
и --verbosity=debug
. Эти параметры нужны вам для того, чтобы отследить возможные ошибки в процессе настройки автоматического деплоя. В зависимости от вашего проекта, у вас могут быть не включены те или иные необходимые для автоматизации API. При использовании этих флагов в сообщениях возможных ошибок от Google будут прилетать ссылки, говорящие вам о том, куда зайти и что нажать, чтобы все заработало. Ребята реально постарались! Очень качественный API!
Ну и собственно наше приложение
Заключение
Надеюсь, вам понравилась серия статей, посвященная автоматизации деплоя в Google Cloud при помощи Jenkins. На самом деле, продемонстрированный подход работает похожим образом и для Azure, и AWS, и DigitalOcean, и многих-многих других облаков. Возможно, в ближайшее время я выпущу еще несколько статей, посвященных Jenkins, где сконцентрируюсь, напрмиер, на построении Jenkins Pipeline. Все будет зависеть от вашего интереса. Присылайте ваши вопросы, пожелания и предложения! Также буду очень рад, если кто-то из вас точно так же как и я, готов делиться своими наработками в виде интересных статей или видео-материалов. Само собой не безвозмездно 😉
Источники информации
- Базовый образ для Jenkins slave агента: https://hub.docker.com/r/google/cloud-sdk/
- Инструкции для сборки jenkins_slave взяты из: https://hub.docker.com/r/evarga/jenkins-slave/~/dockerfile/
- Установка openjdk-1.8 (для поддержки slave.jar Jenkins-a): https://xmoexdev.com/wordpress/installing-openjdk-8-debian-jessie/
- Настройка gcloud https://circleci.com/docs/1.0/google-auth/