Книга предназначена для желающих разобраться в проектировании информационных систем, которые не рассыпаются в процессе эксплуатации. В ней раскрыты темы производительности, масштабирования, надежности, внедрения, эксплуатации и администрирования.
Хотя англоязычный оригинал появился более 10 лет назад, изложенная автором информация еще актуальна. В книге содержатся ценные уроки, основанные на реальных неудачах и плохо продуманных действиях.
Kubernetes – один из ключевых элементов современной облачной экосистемы. Авторы книги рассматривают особенности создания контейнеров и работы с ними, рассказывают о возможностях, ограничениях, плюсах и минусах популярных инструментов установки Kubernetes: kops, kubeadm и Kubespray.
После прочтения вы сможете построить собственное облачное приложение и создадите инфраструктуру для его поддержки. Настроите среду разработки и конвейер непрерывного развертывания, а также научитесь управлять жизненным циклом контейнера и расходом ресурсов.
Основной посыл книги: DevOps – это не только технологии и процессы, но и люди, а также взаимодействие между ними.
Авторы раскрывают понятие DevOps, как культурное движение, которое требует изменений внутри организации. Они предлагают несколько подходов по улучшению командной работы, выделяют принципы создания единства между командами и приводят примеры эффективного использования рабочих инструментов в компании.
Издание знакомит читателей с техническими, культурными и управленческими аспектами DevOps, а также с принципами правильной организации работы.
Технически более детальное продолжение Проекта «Феникс». Авторы рассказывают об основных принципах DevOps в виде трех путей: поток, обратная связь и непрерывное обучение.
В разделе «Поток» рассмотрены непрерывная интеграция и доставка приложения (CI/CD). В «Обратной связи» говорится о телеметрии, тестировании и анализе данных для улучшения качества программных продуктов. Раздел «Непрерывное обучение» посвящен улучшению продукта, инструментариям и документации.
В книге также рассмотрены реальные кейсы известных компаний с примерами и путями решения проблем.
Авторы: Джин Ким, Патрик Дебуа, Джон Уиллис и Джез Хамбл. Читать →
Проект «Феникс» – вымышленная история о компании Parts Unlimited. IT-менеджер Билл узнает, что новый важный проект не укладывается в сроки и выходит за рамки возможностей бюджета. Генеральный директор дает Биллу 90 дней на улаживание проблем по проекту, либо увольняет весь отдел главного героя.
В этой художественной книге рассматриваются реалистичные сценарии работы в IT-компании. Проект «Феникс» предлагает читателям ряд эффективных инструментов и подходов в рамках практик DevOps.
Авторы: Джун Ким, Джонг Хан Ким, Бер К., Спаффорд Д. Читать →
* в этом примере мы до того, как начнем проходить по всем заданиям сборки, определим переменную с версией, прочитав ее из файла, и передадим артефактом в качестве системной переменной VERSION.
Image
https://docs.gitlab.com/ee/ci/yaml/#image
Задаем имя образа, если наше задание выполняется в контейнере docker:
TASK_NAME:
...
image: debian:11
Before_script
https://docs.gitlab.com/ee/ci/yaml/#before_script
Данная опция определяет список команд, которые должны выполняться перед опцией script и после получения артефактов.
Основная часть, где выполняются задания сценария, описана в опции script. Рассмотрим ее подробнее.
1. Описание массива команд. Мы просто перечисляем списком те команды, которые необходимо последовательно выполнить нашему сценарию в конкретной задаче:
TASK_NAME:
...
script:
- command1
- command2
2. Длинные команды, разбитые на несколько строк. Нам может потребоваться выполнить команды в виде скрипта (с операторами сравнения, например). В этом случае будет удобна многострочная запись. Ее можно указать разными способами.
* в артефакты попадут все файлы, название которых заканчивается на txt, файлы ${PKG_NAME}.deb и ${PKG_NAME}.rpm, а также каталог configs. Где ${PKG_NAME} — переменная (подробнее о переменных ниже).
В других заданиях, которые будут выполняться после, можно использовать артефакты, обращаясь к ним по именам, например:
* в этом примере мы исключаем каталог .git, в котором, как правило, хранятся метаданные репозитория. ** обратите внимание, что в отличие от paths, exclude не берет файлы и каталоги рекурсивно и нужно явно указывать объекты.
Extends
https://docs.gitlab.com/ee/ci/yaml/#extends
Позволяет вынести часть сценария в отдельный блок и объединить его с заданием. Чтобы это лучше понять, рассмотрим конкретный пример:
Для управления поведением выполнения задач могут использоваться директивы с правилами и условиями. Подробнее мы их рассмотрим ниже, а в данном разделе просто перечислим их.
Rules
https://docs.gitlab.com/ee/ci/yaml/#rules
Правила, при соблюдении которых наше задание может быть запущено. Примеры работы с директивой rules приведены ниже.
When
https://docs.gitlab.com/ee/ci/yaml/#when
Определяет условия запуска задания, например, только ручной запуск или через определенный интервал времени. Примеры работы приведены ниже.
Needs
https://docs.gitlab.com/ee/ci/yaml/#needs
Тоже набор правил, требующий определенных условий для запуска задачи. Все директивы условий и правил описаны ниже.
Правила и условия
Мы можем выполнять или пропускать задания, в зависимости от выполнения определенных условий. Для этого существует несколько полезных директив, которые мы рассмотрим в данном разделе.
Rules
Регламентирует различные правила, определенные с помощью:
if
changes
exists
allow_failure
variables
1. Оператор if. Позволяем проверить условие, например, если переменная равна определенному значению:
* в данном примере задание будет выполняться, если коммит прошел в основной ветке и если администратор подтвердил запуск.
Needs
Позволяет задавать условия выполнения заданий только при наличии определенного артефакта или выполненного задания. С помощью правил данного типа можно контролировать порядок выполнения задач.
Рассмотрим примеры.
1. Artifacts. Принимает значение true (по умолчанию) и false. Для запуска задания нужно, чтобы на предыдущих этапах были загружены артефакты. Запись:
TASK_NAME:
...
needs:
- artifacts: false
… позволяет начать выполнение задания без этого.
2. Job. Позволяет начать выполнение задачи только после завершения другого задания:
TASK_NAME:
...
needs:
- job: createBuild
* в нашем примере задача начнет выполняться не раньше завершения задачи с названием createBuild.
Переменные
В данном разделе будут рассмотрены пользовательские переменные, которые мы можем использовать в сценарии на свое усмотрение, а также некоторые встроенные переменные, которые могут менять процесс работы конвейера.
Пользовательские переменные
Задаются с помощью директивы variables.
Можно определить глобально для всех заданий:
variables:
PKG_VER: "1.1.1"
Или для конкретного задания:
TASK_NAME:
...
variables:
PKG_VER: "1.1.1"
Теперь можно использовать нашу переменную в сценарии. Для этого ставим перед ее названием знак доллара, а также стоит заключить его в фигурные скобки, например:
script:
- echo ${PKG_VER}
Переменные Gitlab
Данный тип переменных поможет нам управлять процессом сборки. Перечислим данные переменные с описанием их свойств:
ПЕРЕМЕННАЯ
ОПИСАНИЕ
ПРИМЕР
LOG_LEVEL
Определяет уровень журнала. Варианты: debug, info, warn, error, fatal, и panic. Имеет более низкий приоритет, по сравнению с аргументами командной строки —debug, —log-level.
LOG_LEVEL: warning
CI_DEBUG_TRACE
Включение или отключение ведения журнала отладки. Принимает значения true или false.
CI_DEBUG_TRACE: true
CONCURRENT
Ограничивает количество заданий, которые могут выполняться одновременно.
CONCURRENT: 5
GIT_STRATEGY
Способ загрузки файлов из репозитория. Возможны варианты: clone, fetch, и none (не загружать).
GIT_STRATEGY: none
Дополнительные параметры
В данном разделе мы рассмотрим различные опции, которые не вошли в другие разделы.
1. Workflow. Позволяем задать общие правила запуска для всего конвейера. Рассмотрим пример с официального сайта:
Не будет запущен, если название коммита содержит текст draft.
Будет запущен, если пайплайн сработал после merge request.
Будет запущен, если изменения внесены в основную ветку репозитория.
2. Значения по умолчанию. Задаются в директиве default. Опции с данными значениями будут использоваться во всех заданиях или могут быть переопределены на уровне конкретного задания.
Пример:
default:
image: centos:7
tags:
- ci-test
* мы определили опцию с именем образа (например, образа docker) и тег (теги могут быть необходимы для запуска некоторых runner).
3. Импорт конфигурации из другого файла yml. Может быть полезным, например, для написания общей части сценария, которую мы захотим применять ко всем pipeline или для разделения громоздкого сценария на составные части. Выполняется с помощью опции include. Имеет различные варианты подгрузки файлов. Рассмотрим их подробнее.
а) подключение локального файла (local):
include:
- local: .gitlab/ci/build.yml
б) коллекции шаблонов (template):
include:
- template: Custom/.gitlab-ci.yml
* в данном примере мы подключим к нашему сценарию содержимое файла Custom/.gitlab-ci.yml.
* давайте разберемся, что происходит в нашем примере.
Мы создали задачу apt-cache. Точка в начале названия говорит системе, что данную задачу не нужно стартовать автоматически при запуске pipeline. Созданная задача состоит из двух секций script и after_script. Секций может быть больше.
Мы выполняем стадию install. В одной из строк выполнения мы вызываем apt-cache (только команды из раздела script).
При выполнении стадии update мы вызываем apt-cache два раза — первый выполняет команды раздела script, второй — after_script.