BitBucket Pipelines
- BitBucket Pipelines - CI/CD от BitBucket
- Простой - все в одном файлике
Пример
- Все описывается в одном файлике -
bitbucket-pipelines.yml
- Ниже - типичный пример пайплайна для Python-серва: тестим и линтим код, затем деплоим его в GCP:
definitions:
steps:
- step: &test
name: Test & QA | Py2
image: python:2.7
caches:
- pip
script:
- pip install -r requirements-dev.txt
- pytest -v --junitxml=test-reports/report.xml
- flake8 --show-source --statistics
- step: &qa
name: QA | Py3
image: python:3.9
caches:
- pip
script:
- pip install -r reqs3.txt
- mypy
- step: &docs
name: Build docs | Py3
image: python:3.9
caches:
- pip
script:
- pip install -r reqs3.txt
- cd docs/
- mkdocs build
artifacts:
- static/docs/**
- step: &deploy
name: Deploy
image: google/cloud-sdk
deployment: test
script:
- gcloud auth login --cred-file=ci/sa.json
- gcloud app deploy app.yaml
pipelines:
default:
- parallel:
steps:
- step: *test
- step: *qa
custom:
deploy-test:
- parallel:
steps:
- step: *test
- step: *qa
- step: *deploy
deploy-prod:
- parallel:
steps:
- step: *test
- step: *qa
- step: *docs
- step:
<<: *deploy
deployment: prod
Структура bitbucket-pipelines.yml
pipelines
pipelines
- джобы, которые будут запускаться при определенных триггерах
default
- то, что запускается при каждом коммите: тесты, линтинг, сборкаstep
- шаг джобы - запуск одной или нескольких коммандparallel
- запуск несколькихstep
паралелльно
custom
- то, что запускается руками - обычно деплойcustom
- это объект, так что поля в нем именуются произвольно, напр.deploy
- Значения объекта аналогичны
step
изpipelines
step
step
- самая важная часть ci - шаг джобы - запуск одной или нескольких комманд
name
- названиеimage
- Docker-image, в котором будут запускаться командыcaches
- кеш зависимостейscript
- список запускаемых командartifacts
- делает результаты шага доступными в других шагах- полезно когда нужно сбилдить доку
deployment
deployment
- то что собрали и развернули на среду
- Можно просматривать в интерфейсе BB, смотреть какие коммиты развернуты, можно сделать откат
- В контексте
bitbucket-pipelines.yml
- это набор переменных:
Репортинг
- При запуске тестов, можно выводить упавшие тесты в раскрывающихся блоках:
-
Для этого результаты тестов нужно выводить в JUnitXML формате:
pytest --junitxml=test-reports/report.xml
-
Можно использовать этот подход и для других тулов, поддерживающих JUnitXML, но напр. для mypy и flake8 смысла мало в этом - будет 1 блок со всеми ошибками
definitions
definitions
- всякие реюзабельные штуки, используемые в пайплайнах
steps
- переиспользуемые шаги или YAML anchorsstep: &{name}
- каждый шаг помечается&{name}
, а затем используется вpipelines
с помощью*{name}
или<<: *{name}
*{name}
- для простого использования<<: *{name}
- для использования с переопределением переменных или деплоев
services
services
- Docker-имеджы сервисов, используемых в шагах джобы: Postgres, Redis, ...
Определяем сервисы: в нашем случае - Postgres с определенными доступами, чтобы запускать на ней тесты:
definitions:
services:
postgres:
image: postgres
environment:
POSTGRES_DB: test
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 6ZQMAuPEwXepIW
Указываем services
в step
и определяем env (при необходимости):
steps:
- step: &test
name: Test
image: python:3.9
services:
- postgres
script:
- export DATABASE_URL=postgresql://postgres:6ZQMAuPEwXepIW@localhost:5432/test
- pip install -r requirements.txt
- pytest -v --junitxml=test-reports/report.xml
Что еще?
- Можно запускать бб на своей инфре (даже на Винде) - так можно сэкономить
Примеры конфигураций
Сборка через Docker и пуш в Yandex Cloud Container Registry
definitions:
steps:
- step: &build
name: Build and push Docker
# Выставляем services, чтобы был доступ к Docker
services:
- docker
# Опциональное кеширование
caches:
- docker
script:
# >- - многострочная команда
- >-
docker build
--build-arg DATABASE_URL=$DATABASE_URL
-t cr.yandex/$YC_CR/$IMAGE
.
# Логинимся в CR
- docker login --username oauth --password $YC_TOKEN cr.yandex
# Пушим в CR
- docker push cr.yandex/$YC_CR/$IMAGE
Деплой на YC Serverless Containers
На базе деплоя через yc
definitions:
steps:
- step: &deploy
name: Deploty to YC SC
# Ставим yc cli
- curl -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
- source "/root/.bashrc"
# Получаем токен
# https://cloud.yandex.ru/docs/cli/operations/authentication/user
- yc config set token $YC_TOKEN
# Деплой
- >-
yc serverless container revision deploy
--container-id $YC_SC_CONTAINER_ID
--image cr.yandex/$YC_CR/$IMAGE
--service-account-id $YC_SC_SA
--execution-timeout 20s
--memory 256MB
--min-instances 1
--environment DATABASE_URL=$DATABASE_URL