Перейти к содержанию

Pipeline


Типы pipeline

Gitlab merge request pipeline

Merge request pipelines

Описание

Запускается в момент создания merge requests. Обычно используется для проверяющего merge requests чтобы определить тесты кода прошли успешно или нет

Условия запуска pipeline:

  • в CI/CD указан rules CI_PIPELINE_SOURCE == "merge_request_event"
  • у вас есть права Developer, Maintainer or Owner роль

.gitlab-ci.yml

stages:
 - test


testyrovanie:
 stage: test
 script:
  - echo "test"
 rules:
  - if: $CI_PIPELINE_SOURCE == "merge_request_event"
 tags:
  - shell


Пример с child pipeline

.gitlab-ci.yml

stages:
 - test
 - build
 - trigger


django tests:
 image: python:3.9-alpine 
 stage: test
 script:
  - pip install -r requirements.txt
  - mkdir db
  - python manage.py test
 tags:
  - docker_test


build docker:
 stage: build
 image: docker:stable
 services:
  - docker:dind
 variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_TLS_CERTDIR: "" 
 script:
  - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
  - docker build -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG} .
  - if [[ "${CI_COMMIT_BRANCH}" == "${CI_DEFAULT_BRANCH}" ]] ; then 
        docker tag ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG} ${CI_REGISTRY_IMAGE}:latest;
        docker push ${CI_REGISTRY_IMAGE}:latest; fi
  - if [[ -z "${CI_COMMIT_TAG}" ]] ; then 
        docker push ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG};
    else
        docker tag ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG} ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG};
        docker push ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}; fi 
 needs: 
  - ["django tests"]
 tags: 
  - docker_test

start cd pipeline:
 stage: trigger
 trigger:
  include:
   - local: .gitlab/deploy.yml
  strategy: depend

.gitlab/deploy.md

stages:
 - deploy

deploy to prod:
 stage: deploy
 script: 
  - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
  - docker pull ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG}
  - docker rm -f ${CI_PROJECT_NAME} || true
  - docker run --name ${CI_PROJECT_NAME} -d -p 80:8000 -v db:/app/db ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG}
 tags: 
  - shell

результат

результат child pipeline

Rules

Ручной запуск deply на PROD

Пример файла .gitlab-ci.yml

deploy to prod:
 stage: deploy
 script: 
  - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
  - docker pull ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG}
  - docker rm -f ${CI_PROJECT_NAME} || true
  - docker run --name ${CI_PROJECT_NAME} -d -p 80:8000 -v db:/app/db ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG}
 rules:
  - when: manual
 tags: 
  - shell
pipeline run manual

Правила для запуска по определенной ветке

Используется когда вам нужно запускать pipeline при коммите в определенную ветку

Пример 1:

stages:
 - primer

rules_on_one_job:
 stage: primer
 script:
  - |
    if [ "$CI_COMMIT_BRANCH" = "$CI_DEFAULT_BRANCH" ]; then
     echo "Pipeline run for head branch"
    elif [ "$CI_COMMIT_BRANCH" = "devel" ]; then
     echo "Pipeline run for branch: devel"
    else
     echo "Pipeline run for other branch: $CI_COMMIT_BRANCH"
    fi
 tags:
  - shell

Пример 2:

stages:
 - primer
 - primer_sec

rules_branch:
 stage: primer
 script:
  - echo "run job commit in main branch"
 rules:
  - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' 
 tags:
  - shell

rules_2_branch:
 stage: primer_sec
 script: 
  - echo "run job commit in '$CI_COMMIT_BRANCH' branch"
 rules:
  - if: '$CI_COMMIT_BRANCH == "devel"'
 tags: 
  - shell

Запуск по тегу

Запускается только когда есть Tag

Пример файла .gitlab-ci.yml

stages:
 - debug

rules_on_one_job:
 stage: debug
 script:
  - echo "create tag"
 rules:
  - if: '$CI_COMMIT_TAG'
 tags: 
  - shell