Файл gitlab-ci.yml
Файл .gitlab-ci.yml
является ключевым элементом в экосистеме GitLab CI/CD
, определяя как должны выполняться автоматизированные задачи по тестированию, сборке и развертыванию вашего проекта. Файл использует YAML
человекочитаемый формат данных для конфигурации пайплайнов. Понимание структуры и синтаксиса этого файла позволит вам эффективно настраивать процессы CI/CD
для ваших проектов.
Синтаксис файл gitlab-ci.yml
В файле конфигурации .gitlab-ci.yml
используется ряд ключевых элементов синтаксиса, позволяющих настроить поведение пайплайнов. Подробнее рассмотрим основные элементы.
stages
определение этапов пайплайнаИспользуется для определения различных этапов пайплайна, которые выполняются последовательно. Этапы позволяют группировать задачи jobs
, которые могут выполняться параллельно в пределах одного этапа, но сам этап будет ожидать завершения всех задач, прежде чем перейти к следующему:
stages:
- build
- test
- deploy
В этом примере определены три этапа: build
, test
и deploy
. Задачи, относящиеся к сборке проекта, будут группироваться в этап build
, задачи тестирования в test
, задачи развертывания в deploy
.
job
часть пайплайна, которая дает инструкции к выполнению задач
Это часть пайплайна, которая дает инструкции к выполнению задач. Как мы уже говорили, задачи распределены по этапам. Если двум задачам назначить один этап, задачи будут запускаться параллельно, если нет обратных условий. Например, задача на этапе сборки может компилировать код, а задача на этапе тестирования, запускать тесты. В приведенном примере описаны три задачи Job
: build_job
, test_job
, deploy_job
с соответствующими, назначенными им этапами:
build_job:
stage: build
script:
- echo "Сборка кода..."
test_job:
stage: test
script:
- echo "Запуск тестов..."
deploy_job:
stage: deploy
script:
- echo "Развертывание приложения..."
script
набор командОпределяет набор команд, выполняющихся в одной задаче. Можно назвать эту часть конфигурации одной из самых важных — именно тут прописываются все команды, которые должны быть выполнены в конкретной задаче:
build:
image: ubuntu:24.04
stage: build
tags:
- cloud-runner
script:
- docker build -t "image:tag" -t "image:latest" --push.
before_script
дополнительные скрипты, выполняется до scriptСекция используется для определения команд или скриптов, которые должны быть выполнены перед каждой задачей job
в пайплайне. Это полезно для выполнения общих подготовительных шагов, таких как установка зависимостей, авторизация в сервисах или настройка окружения.
before_script:
- echo "Выполнение предварительных скриптов..."
- setup-environment.sh
В этом примере перед каждой задачей будут выполнены команды для вывода сообщения в лог и запуска скрипта setup-environment.sh
.
after_script
дополнительные скрипты, выполняется после scriptСекция определяет команды или скрипты, которые выполняются после каждой задачи, независимо от её исхода, успех или неудача. Это можно использовать для очистки ресурсов, логирования информации или отправки уведомлений.
after_script:
- echo "Завершающие действия..."
- cleanup-environment.sh
Здесь после завершения каждой задачи будут выполнены команды для вывода сообщения и запуска скрипта cleanup-environment.sh
для очистки окружения.
variables
определение и использование переменныхВ секции можно определить переменные окружения, которые будут доступны во всех задачах пайплайна. Эти переменные можно использовать для конфигурации поведения задач, без необходимости жестко кодировать конфигурационные значения прямо в файле .gitlab-ci.yml
:
variables:
PROJECT_ENV: "production"
DEPLOY_PATH: "/var/www/html"
В этом примере определены две переменные: PROJECT_ENV
и DEPLOY_PATH
, которые затем могут быть использованы в скриптах задач для определения среды проекта и пути развертывания соответственно.
include
повторное использование конфигурацийПозволяет включить в текущий .gitlab-ci.yml
внешние YAML-файлы
. Это полезно для повторного использования общих конфигураций в нескольких проектах или для разделения большого файла конфигурации на более мелкие и управляемые части:
include:
- project: 'my-group/my-project'
ref: master
file: '/templates/.template.yml'
- local: '/ci/common.yml'
Здесь конфигурация включает файл из другого проекта my-group/my-project
и локальный файл /ci/common.yml
. Это позволяет легко переиспользовать настройки CI/CD
между разными проектами и упрощает управление конфигурацией.
artifacts
файлы, которые создаются во время выполнения задачиФайлы, которые создаются во время выполнения задачи. Они сохраняются, а затем их можно использовать повторно в других задачах. Так, можно сохранить результаты тестирования или передать скомпилированные файлы между задачами:
artifacts:
paths:
- build/
expire_in: 1 week
cache
дает возможность сохранить в кэшеДает возможность сохранить в кэше зависимости или любые иные сложно воспроизводимые данные, созданные во время выполнения задач. С помощью этой функции можно ускорить выполнения пайплайнов за счет отсутствия необходимости выполнять долгие операции каждый раз:
cache:
paths:
- project-venv
image
образ контейнераУказывает образ контейнера, который будет использоваться для выполнения задачи. Это заранее настроенное окружение с установленными зависимостями. Например, можно использовать образ с установленной версией Ruby для задач, связанных с этим языком программирования:
image: ruby:2.7
services
позволяют запускать дополнительные контейнерыПозволяют запускать дополнительные контейнеры, которые нужны для выполнения задач, например, базы данных. Элемент помогает в тестировании, когда требуется наличие внешнего работающего сервиса:
services:
- mysql:9
only и except
условия для выполнения или пропуска задачЭти ключи выделяют условия для выполнения или пропуска задач. Например, задачи могут выполняться только на определённых ветках репозитория или, наоборот, пропускаться для определенных тегов:
only:
- master
- develop
except:
- v.*
rules
условия для выполнения или пропуска задачПравила предлагают более гибкие условия для выполнения задач по сравнению с only
и except
. Например, можно задать условия выполнения задач в зависимости от имени ветки или результата предыдущих задач:
rules:
- if: $CI_COMMIT_BRANCH
exists:
- Dockerfile
tags
назначение Runner'а на основе теговИспользуются для назначения задач конкретным Runner'ам на основе тегов. Это позволяет контролировать, на каких Runner'ах будут выполняться определенные задачи, основываясь на их спецификации, такой как тип операционной системы, доступные ресурсы или специализированное оборудование.
build-job:
stage: build
script:
- build-project.sh
tags:
- linux
- docker
В этом примере задача build-job
будет направлена на выполнение только на тех Runner'ах, которые помечены тегами linux и docker. Это обеспечивает, что задача сборки проекта будет выполняться в среде, подходящей для сборки Linux-проектов, использующих Docker.
environment
управляет развертыванием задач в определенные средыОкружение управляет развертыванием задач в определенные среды, например, в тестовую или продакшн. Это помогает автоматически разворачивать и тестировать код в различных условиях:
environment:
name: production
url: https://prod.example.com
interruptible
позволяет прерывать задачиКлюч позволяет прерывать задачи, если запускается новая сборка. Это полезно для экономии ресурсов, когда более старая сборка уже не актуальна:
build:
stage: build
script:
- echo "This build can be canceled."
interruptible: true
parallel
позволяет запускать несколько экземпляров задачи одновременноПараллельность позволяет запускать несколько экземпляров задачи одновременно. Например, можно параллельно запускать тесты с различными параметрами, чтобы ускорить процесс:
parallel:
matrix:
- TEST_SUITE: ["unit", "integration"]
workflow
контроль запуска пайплайновПозволяет управлять запуском пайплайнов на основе заданных условий. Это может быть полезно для предотвращения запуска пайплайнов в ненужные моменты, например, когда изменения вносятся только в определенные файлы или каталоги, или в зависимости от переменных среды или веток. Это может помочь сократить количество ненужных запусков пайплайнов, экономя ресурсы и время:
workflow:
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
- if: '$CI_PIPELINE_SOURCE == "schedule"'
- changes:
- path/to/directory/**
- "*.config"
В этом примере пайплайн будет запущен, если выполнено одно из следующих условий: коммит сделан в ветку main, пайплайн запущен по расписанию, или были изменены файлы в указанной директории или файлы конфигурации на верхнем уровне.
Основные элементы синтаксиса.
Работа с Jobs
Конфигурация задачи в CI/CD
представляет собой инструмент для организации и управления пайплайнами непрерывной интеграции и доставки. Благодаря гибкости настройки этапов, зависимостей и условий выполнения задач, разработчики могут создавать сложные пайплайны, оптимизированные под конкретные потребности проекта, что способствует ускорению процессов разработки и обеспечению высокого качества продукта.
Конфигурация Stages
Конфигурация этапов stages
в CI/CD
играет важную роль в организации и управлении жизненным циклом разработки программного обеспечения. Она позволяет разработчикам структурировать пайплайн развертывания таким образом, чтобы различные задачи jobs
, такие как сборка build
, тестирование test
, развертывание deploy
, выполнялись в определенном, логически обоснованном порядке. Этот подход не только обеспечивает четкое
разделение ответственности между различными этапами разработки, но и повышает эффективность и надежность процессов.
Порядок, в котором этапы перечислены в секции stages файла .gitlab-ci.yml
, непосредственно определяет последовательность их выполнения в пайплайне. Эти этапы организуются таким образом, чтобы каждый последующий этап начинался только после полного и успешного завершения всех задач предыдущего этапа. Это гарантирует, что все необходимые предварительные условия и зависимости удовлетворены перед переходом к следующему шагу:
stages:
- build
- test
- deploy
GitLab CI/CD
предоставляет два механизма для управления зависимостями между задачами, dependencies
и needs
:
dependencies
Ключ позволяет задаче наследовать и использовать артефакты, сгенерированные предыдущими задачами. Это означает, что задача может оперировать результатами работы других задач, но её выполнение будет отложено до полного завершения всех задач текущего этапа. Это обеспечивает строгую последовательность выполнения, но может привести к ненужным задержкам.
test1:
stage: test
dependencies:
- compile
needs
Директива позволяет задаче начать выполнение немедленно после завершения указанных зависимостей, не ожидая окончания всех задач на текущем этапе. Это способствует параллельному выполнению и может значительно сократить общее время выполнения пайплайна, ускоряя процесс CI/CD
test2:
stage: test
needs:
- compile
Одной из основных преимуществ структурирования пайплайнов с использованием stages
является возможность параллельного выполнения задач внутри одного этапа. Это позволяет оптимизировать использование ресурсов и сократить общее время выполнения пайплайна. GitLab автоматически запускает все задачи одного этапа параллельно, если только не ограничено зависимостями dependencies
или потребностями needs
:
stages:
- build
- test
- deploy
build_job_1:
stage: build
script:
- echo "Building part 1..."
build_job_2:
stage: build
script:
- echo "Building part 2..."
Определение и настройка Jobs
Jobs
задача является основным строительным блокам пайплайнов в GitLab CI/CD
. Каждая задача определяет набор операций, которые должны быть выполнены: это может быть сборка кода, выполнение тестов, развертывание приложения и т.д.
Ключевой элемент каждой задачи script
, содержит команды или скрипты, выполняемые в рамках задачи.
test-job:
stage: test
script:
- echo "Запуск тестов..."
- run-tests.sh
В этом примере задача test-job
находится на этапе test
и выполняет две команды: вывод сообщения и запуск скрипта run-tests.sh
.
Дириктивы only и except
only
и except
это директивы, позволяющие контролировать когда задача должна выполняться, основываясь на различных условиях, таких как ветки, теги или переменные среды.
only
определяет условия, при которых задача будет выполняться. Если условия совпадают, задача включается в пайплайн:
deploy-job:
stage: deploy
script:
- deploy-application.sh
only:
- master
- tags
Здесь deploy-job
будет выполняться только если изменения сделаны в ветке master
или если был установлен тег.
except
указывает условия, при которых задача не будет выполняться. Если условия совпадают, задача исключается из пайплайна:
experimental-test-job:
stage: test
script:
- experimental-tests.sh
except:
- master
В этом примере experimental-test-job
будет исключена из выполнения, если изменения сделаны в ветке master
.
Очистка
GitLab CI/CD позволяет автоматизировать процессы очистки с помощью директивы on_stop
в определении окружения, где environment
позволяет определить окружение, в котором выполняется задача. Это может быть любая среда, например, тестовая, стейджинг или продуктовая. Каждое окружение может иметь свою уникальную конфигурацию и жизненный цикл. Директива on_stop
в определении environment
используется для указания задачи, которая должна быть выполнена
для остановки или удаления этого окружения. Это особенно полезно для временных окружений, создаваемых для ревью кода или тестирования, которые необходимо очистить после использования:
stop_review:
stage: deploy
variables:
GIT_STRATEGY: none
script:
- echo "Removing review environment..."
when: manual
environment:
name: review/$CI_COMMIT_REF_NAME
action: stop
only:
- branches
except:
- main
С появлением и развитием контейнеризации, GitLab CI/CD
обеспечивает интеграцию с Docker
и Kubernetes
, позволяя легко собирать, тестировать и развертывать контейнеризированные приложения. Использование services
для запуска вспомогательных сервисов, таких как базы данных или кэширующие системы, упрощает тестирование приложений в условиях, максимально приближенных к продуктовой среде:
test:
stage: test
services:
- postgres:latest
script:
- echo "Testing with PostgreSQL..."
Переменные
Переменные в GitLab CI/CD
предоставляют механизм для динамической настройки пайплайнов. Они могут быть использованы для конфигурации задач на лету, позволяя задавать различные параметры без необходимости изменения самого файла .gitlab-ci.yml
. Переменные могут быть определены на уровне GitLab CI/CD
пайплайна в файле .gitlab-ci.yml
, на уровне проекта или группы в настройках GitLab
, а также могут быть предоставлены как переменные
среды в Runner
.
Переменные могут быть использованы для разнообразных целей в пайплайне, включая:
- Конфигурацию задач: определение специфических параметров, необходимых для выполнения скриптов сборки, тестирования и развертывания
- Управление средами: указание среды, в которую будет производиться развертывание, или настройка параметров, специфичных для среды
- Передачу секретов: безопасное предоставление чувствительной информации, такой как пароли, токены доступа или ключи API, без их явного указания в файле
.gitlab-ci.yml
deploy:
stage: deploy
script:
- deploy-to-env.sh $DEPLOY_ENV
variables:
DEPLOY_ENV: staging
В этом примере переменная DEPLOY_ENV
используется для определения среды развертывания в задаче deploy
. Значение staging
указано напрямую в конфигурации задачи, однако оно может быть легко изменено или переопределено на уровне проекта или группы через настройки GitLab
, а также может быть задано динамически через переменные среды в Runner
.
Переменные в GitLab CI/CD
могут быть определены на нескольких уровнях:
Файл .gitlab-ci.yml
непосредственное определение переменных в конфигурации пайплайна позволяет задать стандартные значения или специфичные настройки для задачНастройки проекта или группы
переменные, заданные на уровне проекта или группы в GitLab, автоматически применяются ко всем пайплайнам в рамках этого проекта или группы. Это удобно для глобальных настроек или секретов.Переменные среды Runner
эти переменные могут быть заданы на уровне Runner и являются полезными для конфигурации окружения, в котором выполняются задачи
Одной из ключевых особенностей переменных в GitLab CI/CD
является возможность их переопределения на разных уровнях. Это позволяет, например, задать значение переменной по умолчанию в файле .gitlab-ci.yml
, но при необходимости изменить его на уровне проекта для конкретного запуска пайплайна или даже передать другое значение через переменные среды Runner
, обеспечивая тем самым высокую степень гибкости и адаптации к различным условиям выполнения задач.
Артефакты
Артефакты это файлы и директории, генерируемые в результате выполнения задач в пайплайне. Они используются для сохранения важных результатов работы, таких как результаты сборки, тестовые отчеты, логи, или любые другие данные, которые необходимо сохранить после завершения задачи. Артефакты могут быть переданы между задачами в рамках одного пайплайна или сохранены для доступа после его завершения:
test:
stage: test
script:
- run-tests.sh
artifacts:
paths:
- test-results/
expire_in: 2 days
when: always
В приведенном примере задача test
генерирует артефакты в директории test-results
, которые сохраняются на срок до 2 дней. Опция when: always
гарантирует сохранение артефактов независимо от результата выполнения задачи.
Кэширование
Кэширование предназначено для временного хранения файлов и директорий, которые используются между различными запусками задач. Это особенно актуально для зависимостей проекта, позволяя не загружать их каждый раз, когда выполняется пайплайн. Кэширование сокращает время на сборку и тестирование, оптимизируя использование ресурсов:
build:
stage: build
script:
- npm install
cache:
paths:
- node_modules/
key: ${CI_COMMIT_REF_SLUG}
В данном примере paths
указывает директории или файлы, которые необходимо кэшировать. В этом случае кэшируется директория. node_modules
указывает где npm
сохраняет зависимости проекта. key
определяет ключ кэша, который используется для ассоциации кэша с конкретными задачами и условиями. В примере ключ кэша задается как ${CI_COMMIT_REF_SLUG}
, что означает использование уникального идентификатора ветки в качестве ключа. Это
позволяет каждой ветке иметь свой собственный кэш, предотвращая конфликты и некорректное использование зависимостей между различными ветками.
GitLab CI/CD предоставляет различные стратегии управления кэшем, такие как:
policy: pull
кэш будет только загружаться, но не обновляться в результате выполнения задачиpolicy: push
кэш будет обновляться после выполнения задачи, но не загружаться при ее стартеpolicy: pull-push
(по умолчанию) кэш будет загружаться перед выполнением задачи и обновляться после ее завершения
Преимущества кэширования:
Уменьшение времени сборки
за счет повторного использования уже скачанных или сгенерированных данных.Экономия ресурсов
уменьшает нагрузку на сеть и серверы хранения, поскольку уменьшается количество необходимых загрузок из внешних источников.Гибкость конфигурации
ключи кэша и стратегии позволяют настроить кэширование с учетом специфики проекта и рабочих процессов
Хотя артефакты и кэширование служат различным целям, вместе они обеспечивают гладкое и быстрое выполнение пайплайнов в GitLab CI/CD
. Артефакты обеспечивают сохранение и передачу важных результатов работы между задачами или после завершения пайплайна, в то время как кэширование ускоряет пайплайны, позволяя повторно использовать данные между запусками. Использование обоих механизмов позволяет разработчикам оптимизировать CI/CD
процессы, сокращая время ожидания и повышая
эффективность разработки.