DevOps на Openshift: Автоматизация создания проектов Openshift из Jenkins Pipeline

Эта статья открывает небольшой цикл, посвящённый Openshift Container Platform и его возможностям как инструмента DevOps.

Продукт Openshift Container Platform от компании Red Hat является полноценным PaaS решением, позволяющем запускать и автоматически контролировать жизненный цикл приложений, работающих в контейнерах. Платформа, из коробки, даёт возможность запускать приложения, написанные на различных языках программирования: PHP, Ruby, Python, Java,.NET, использовать различные базы данных: PostgreSQL, MySql, MongoDB и многое другое. Благодаря реализованной сетевой изоляции и модели безопасности, в рамках одного кластера Openshift можно легко реализовать изоляцию сред на dev, test, stage и prod. Автоматическая балансировка нагрузки и отказоустойчивость так же являются ключевыми особенностями решения. 

Кроме PaaS, Openshift является полноценным DevOps решением, поддерживающим из коробки:

  • Работу с Jenkins
  • Возможность реализации Jenkins Pipeline
  • Запуск всех необходимых для полноценного ведения разработки инструментов - Gitlab(Gogs), Nexus, Sonarqube, Eclipse Che, Jenkins
  • Поддержка модели разворачивания Blue/Green 
  • Поддержка модели разворачивания A/B
  • Автоматическое управление жизненным циклом приложений

Если в вашей компании есть:

  • Активная разработка приложений
  • Требования к отказоустойчивости приложений
  • Требования к балансировке нагрузки
  • Требование по автоматическому переключению приложений на новые версии без простоя
  • Требования по одновременной работе нескольких команд (в том числе внешних подрядчиков)

тогда вам стоит внимательно посмотреть на продукт Openshift!

В рамках этой статьи я бы хотел описать Pipeline, который мы модернизируем для полноценной демонстрации возможностей DevOps в рамках Openshift и рассказать первые шаги по этому Pipeline.

За основу был взят демонстрационный проект, который достаточно легко разворачивается из шаблона и показывает работу Jenkins Pipeline по переносу между средами простого web-приложения, запускаемого на Wildfly или Red Hat EAP 7. Переде деплоем на stage окружение pipeline останавливается и ждёт ручного ввода - на этом этапе проверяется dev окружение, на основании чего сборка продвигается дальше.

Для начала, администратору кластера или пользователю с необходимыми правами потребуется создать 3 проекта: cicd, dev и stage. В проекте cicd будут развёрнуты все необходимые инструменты:

При работе Jenkins использует сервисный аккаунт в Openshift. Для того, чтобы в рамках Pipeline была возможность разворачивать приложения в других проектах этому пользователю необходимо выдать соответствующие права:

oc policy add-role-to-user edit system:serviceaccount:cicd:jenkins -n dev
oc policy add-role-to-user edit system:serviceaccount:cicd:jenkins -n stage

Одна из первых вещей, о котрых нас спросили наши заказчики, просмотрев демо - можно ли автоматизировать создание проектов и делать это прямо из Pipeline? Ответ на этот вопрос - да, это возможно. Так как Pipeline это просто исполняемый код, написанный на языке Groovy из которого можно, в том числе, вызывать shell-команды, то мы это реализовали следующим образом:

script {
              try {
                sh "oc new-project ${env.DEV_PROJECT} --display-name='Tasks - ${env.DEV_PROJECT}'"
                sh "oc policy add-role-to-user edit system:serviceaccount:cicd:jenkins -n ${env.DEV_PROJECT}"
                sh "oc create quota -n ${env.DEV_PROJECT} compute --scopes=NotTerminating --hard=cpu=2,memory=2G"
                sh "oc create quota -n ${env.DEV_PROJECT} logical --hard=pods=5,services=2,secrets=20,persistentvolumeclaims=2"
                sh "oc project ${env.DEV_PROJECT}"
              } catch(Exception e) {
                println("Dev project already exists")
              }

            }

Прямо в таком виде этот код не заработает, так как сервисному аккаунту jenkins не хватит прав. Это можно решить, назначив нужные роли. 

# Grant Jenkins required permissions
# Role to create projects
oc adm policy add-cluster-role-to-user self-provisioner system:serviceaccount:cicd:jenkins
# Role to create quotas inside projects
oc create clusterrole quota-editor --verb=create,get,list,update,watch --resource=resourcequotas
oc adm policy add-cluster-role-to-user quota-editor system:serviceaccount:cicd:jenkins

Это одно из немногих улучшений к базовому демо-проекту, которое мы внесли. Дальше - больше...

30.11.2018