Pipelines
.gitlab-ci.yml
- это yaml файл в котором определяются инструкции для gitlab-ci
Есть список предопределенных переменных которые можно использовать в джобах
https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
Пайплайны это топлевел компоненты ci/cd
Пайпланы состоят из:
- Jobs - определяют что делать (сборка, тесты итд)
- Stages - определяют когда запускать джобы (запускать тесты после сборки итд)
Джобы выполняются раннерами, несколько джоб в одном стейдже выполняются параллельно
Если все джобы в стейдже выполнились успешно, то пайплайн переходит на следующий стейдж, если хоть одна джоба зафейлилась, то пайплайн завершается
Types of pipelines
- Basic pipelines - запускает все в каждом стейдже по порядку
- Directed Acyclic Graph Pipeline (DAG) pipelines - базируется на отношениях между джобами и благодаря этому может работать быстрее чем basic pipeline
- Multi-project pipelines - комбинация пайплайнов из разных проектов
- Parent-Child pipelines - можно разбить сложный пайплайн на один родительский и несколько дочерних сабпайплайнов которые будут триггериться родительским (все в рамках одного проекта)
- Pipelines for Merge Requests - запускаются только для MR'ов, а не для каждого коммита
- Pipelines for Merged Results - are merge request pipelines that act as though the changes from the source branch have already been merged into the target branch
- Merge Trains - используй pipelines for merged results чтобы ставить их в очередь на слияние один за другим
Configure a pipeline
Пайплайн и его компоненты конфигурируются в конфиге для каждого проекта отдельно
Когда раннер подбирает джобу, гитлаб предоставляет раннеру метадату о джобе (ветвь, коммит, тэг итд) и раннер на основе этого что-то делает
Pipeline type | Refspecs |
---|---|
Pipeline for Branches |
+<sha>:refs/pipelines/<id> and +refs/heads/<name>:refs/remotes/origin/<name>
|
Pipeline for Tags |
+<sha>:refs/pipelines/<id> and +refs/tags/<name>:refs/tags/<name>
|
Pipeline for Merge Requests | +<sha>:refs/pipelines/<id> |
Пайплайны могут быть также запущены вручную с вручную указанными переменными
Когда пайплайн запускается вручную, то страница 'Run Pipeline' показывает все top-level переменные определенные в .gitlab-ci.yml
с description и value и позволяет их переопределить для этого ручного запуска
Пример пайплайна:
variables:
DEPLOY_ENVIRONMENT:
value: "staging" # Deploy to staging by default
description: "The deployment target. Change this variable to 'canary' or 'production' if needed."
THIS_VAR_WILL_ALSO_BE_SHOWN:
value: "testvalue"
description: "test descr for test var"
THIS_VAR_WILL_NOT_BE_SHOW: "value"
stages:
- document
pages:
stage: document
image:
name: mjdk/diagrams:latest
entrypoint:
- env
script:
- python docs/components.py
- mkdir -p public
- cp eks_cluster.png public/
artifacts:
paths:
- public
Ключевое слово when
может принимать значение manual
: when:manual
Тогда джоба не будет запускаться автоматически, а только по клику пользователя
stages:
- test
- test2
- final
a:
stage: test
script:
- echo 0
b:
stage: test
script:
- echo 1
c:
stage: test
script:
- echo 2
d:
stage: test2
script:
- echo 3
e:
stage: final
when: manual
script:
- echo 4
f:
stage: final
when: manual
script:
- echo 5
Видно что final
требует ручного вмешательства:
Как видно, можно запустить сразу весь стейдж, либо каждую джобу по отдельности
Каждый пользователь имеет квоты на использование шаред раннеров в личных проектах
Каждая группа также имеет квоты на использование шаред раннеров в проектах внутри этой группы
0 1 2 3 4 5 6 7
AAAAAAA
BBBBBBB
CCCC
Длительность пайплайна считается так:
(4 - 1) + (7 - 6) => 4
Pipeline quota usage считается так:
2 + 2 + 1 => 5
Visualize pipelines
stages: ["pre", "test", "test2", "final"]
pre:
stage: pre
script: ["echo pre"]
a:
stage: test
needs: ["pre"]
script: ["echo 0"]
b:
stage: test
needs: ["pre"]
script: ["echo 1"]
c:
stage: test
needs: ["pre"]
script: ["echo 2"]
d:
stage: test2
when: manual
needs: ["pre", "a", "b", "c"]
script: ["echo 3"]
e:
stage: final
needs: ["pre", "a", "b", "c", "d"]
script: ["echo 4"]
f:
stage: final
needs: ["d"]
script: ["echo 5"]
No Comments