ну примерно вот так:
image: # имя докер-образа
stages:
- build
- tests
- deploy
build_my_project:
stage: build
tags:
- тэг раннера где запустить
script:
- ... # собственно действия для билда
- ...
- ...
- ...
artifacts:
name: как будет обзываться артефакт сборки
paths:
- путь до файлов в артефакт
expire_in: 1 hour # сколько ему жить
test1:
stage: tests
tags:
- тэг раннера где запустить
needs:
- build
scripts:
- # действия по выполнению теста
test2:
stage: tests
tags:
- тэг раннера где запустить
scripts:
- # действия по выполнению теста 2
deploy_to_dev:
stage: deploy
tags:
- тэг раннера где запустить
needs:
- tests
rules:
- if: $CI_COMMIT_BRANCH == "development"
scripts:
- # действия деплою в dev
deploy_to_prod:
stage: deploy
tags:
- тэг раннера где запустить
needs:
- tests
rules:
- if: $CI_COMMIT_BRANCH == "master"
scripts:
- # действия деплою в dev
словами: на первом шаге - build выполнится то что прописано в scripts (последовательно, по строкам)
на втором шаге - test -
параллельно выполнится два (ну или сколько надо блоков тестов)
на третьем - deploy - выполнится или deploy_to_prod или deploy_to_dev или ничего в зависимости от того в какой ветке идет сборка ($CI_COMMIT_BRANCH)
image: # имя докер-образа - имя соответсвующего docker-образа с подготовленной средой разработки (node:14 - для npm, mcr.microsoft.com/dotnet/sdk:6.0 - для .net6 и так далее)
можно и любой свой
needs: - описывает от каких шагов зависит шаг (это относительно свежее, ранее более жесткое dependencies:)