Перейти до вмісту

Модуль 2.11: Cloud Build та CI/CD

Складність: [MEDIUM] | Час на виконання: 2 год | Передумови: Модуль 2.6 (Artifact Registry), Модуль 2.7 (Cloud Run)

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

У вересні 2022 року процес деплою в одному швидкозростаючому стартапі виглядав так: старший інженер заходив по SSH на сервер, робив git pull, збирав Docker-образ вручну і перезапускав контейнер. Поки в команді було 3 людини, це працювало. Коли стало 15 — це перетворилося на катастрофу. Одного разу “деплой-інженер” випадково залишив прапорець дебагу, і всі паролі користувачів почали писатися відкритим текстом у логи. Помилку помітили лише через три дні.

CI/CD (Continuous Integration / Continuous Deployment) — це не розкіш, а фундамент надійної розробки. Це механізм, який робить доставку коду автоматичною, перевіреною та безпечною. Cloud Build — це безсерверна платформа Google, яка збирає, тестує та деплоїть ваш код, не вимагаючи від вас управління жодним сервером.

У цьому модулі ви навчитеся писати конфігурації cloudbuild.yaml, налаштовувати автоматичні запуски (triggers) з GitHub та будувати конвеєри, які самі деплоять код у Cloud Run після успішних тестів.


Архітектура Cloud Build

Розділ «Архітектура Cloud Build»

Кожен запуск Cloud Build відбувається в новому, ефемерному середовищі. Ваш конвеєр складається з кроків (steps). Кожен крок — це окремий Docker-контейнер, який виконує одну задачу (напр. “зібрати код” або “запустити тести”). Всі кроки мають доступ до спільної папки /workspace.

  • Build: Один запуск вашого конвеєра.
  • Step: Окрема дія всередині білда.
  • Builder: Docker-образ, який надає інструменти для кроку (напр. gcr.io/cloud-builders/docker).
  • Trigger: Автоматика, що запускає білд (наприклад, при кожному git push у гілку main).

cloudbuild.yaml: Серце конвеєра

Розділ «cloudbuild.yaml: Серце конвеєра»

Ось приклад простого конвеєра для Cloud Run:

steps:
# 1. Збірка образу
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/app:$SHORT_SHA', '.']
# 2. Пуш у реєстр
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/app:$SHORT_SHA']
# 3. Деплой у Cloud Run
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: gcloud
args:
- 'run'
- 'deploy'
- 'my-app'
- '--image=us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/app:$SHORT_SHA'
- '--region=us-central1'

Тригери: Автоматизація з GitHub/GitLab

Розділ «Тригери: Автоматизація з GitHub/GitLab»

Ви можете підключити ваш репозиторій до Cloud Build.

  • Push triggers: Кожен коміт автоматично запускає білд.
  • PR triggers: Запускає тільки тести, щоб перевірити код перед злиттям у main.
  • Tag triggers: Запускає деплой у продакшн тільки коли ви створюєте тег версії (напр. v1.2.0).

Безпека в конвеєрі

Розділ «Безпека в конвеєрі»

Cloud Build працює від імені сервісного акаунта. За замовчуванням у нього мало прав. Порада: Завжди створюйте власний SA для білдів і надавайте йому тільки ті права, які йому потрібні (напр. run.admin та artifactregistry.writer). Ніколи не зберігайте паролі в cloudbuild.yaml — підключайте їх із Secret Manager.


ПомилкаЧому це стаєтьсяЯк виправити
Послідовні кроки для всьогоЦе дефолтна поведінкаВикористовуйте waitFor, щоб запускати незалежні кроки (напр. лінтинг та білд) паралельно
Жорстке прописання ID проєктуЗаважає перевикористаннюВикористовуйте вбудовану змінну $PROJECT_ID
Відсутність тестів у CI”Ми тестуємо локально”Конвеєр — це єдине джерело істини. Якщо тести не пройшли в CI, деплой має зупинитися
Низький таймаут для важких білдівДефолт — 10 хвилинВстановіть timeout: 1200s (20 хв) для великих проєктів

1. Що таке /workspace в Cloud Build?

Це спільна папка, яка автоматично монтується в кожен контейнер-крок під час одного білда. Це дозволяє одному кроку створити файл (напр. бінарник), а наступному — використати його.

2. Чи можна використовувати будь-який Docker-образ як крок у Cloud Build?

Так. Ви не обмежені образами від Google. Ви можете вказати будь-який образ із Docker Hub або Artifact Registry як name для вашого кроку.


Практична вправа: Мій перший конвеєр

Розділ «Практична вправа: Мій перший конвеєр»
  1. Створіть репозиторій на GitHub із простим Python-додатком та Dockerfile.
  2. Напишіть cloudbuild.yaml, який збирає образ і пушить його в Artifact Registry.
  3. Налаштуйте Trigger у консолі Cloud Build, підключивши ваш GitHub.
  4. Зробіть push у GitHub і спостерігайте за білдом у консолі GCP.

Переходьте до Модуля 2.12: Архітектурні патерни GCP — ви дізнаєтеся про Landing Zones, Identity-Aware Proxy та отримаєте огляд Anthos та GKE для масштабування ваших контейнерів.