Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


Gitlab Artifacts и Cache


Gitlab Artifacts и Cache


Artifacts

Использование артефактов позволяет job:
1. Подготовить данные
2. Заархивировать их
3. Передать в другой job

Особенности артефактов:
1. Не используется, если явно не определён в job
2. Доступен только в пределах указанной job
3. Хранится в GitLab
4. Можно указать время жизни, по умолчанию — 30 дней

Пример 1

job1, и job2 сохраняют файлы task1.txt и task2.txt как артефакты

job2:
запускается в stage2, который запускается после stage1
загрузит файлы task1.txt и task2.txt как артефакты job1 и позже переопределит их

job3:
запустится в stage3
загрузит артефакты со всех предыдущих этапов
но увидит только последнюю версию файлов task1.txt и task3.txt, написанных job2

.gitlab-ci.yml
stages:
  - stage1
  - stage2
  - stage3

job1:
  stage: stage1
  script:
    - echo "job1 - executing task1" > task1.txt
    - echo "job1 - executing task2" > task2.txt
  artifacts:
    paths:
      - task1.txt
      - task2.txt

job2:
  stage: stage2
  script:
    - cat task1.txt
    - cat task2.txt
    - echo "job2 - executing task1" > task1.txt
    - echo "job2 - executing task2" > task2.txt
  artifacts:
    paths:
      - task1.txt
      - task2.txt

job3:
  stage: stage3
  script:
    - cat task1.txt
    - cat task2.txt

Вывод:
Downloading artifacts
00:01
Downloading artifacts for job1 ()...
Downloading artifacts from coordinator... ok
Downloading artifacts for job2 ()...
Downloading artifacts from coordinator... ok
Executing "step_script" stage of the job script
00:00
Using docker image ...
$ cat task1.txt
job2 - executing task1
$ cat task2.txt
job2 - executing task2

Пример 2 dependencies добавьте явную зависимость job3 от job1

Хотя job3 не зависит от job2, он по-прежнему выполняется после job2
Использование ключевого слова dependencies не изменяет порядок выполнения заданий
Все задания выполняются последовательно в соответствии с порядком этапов
Однако job3 использует ключевое слово dependencies, которое загружает артефакты из job1
job3 не загрузит артефакты из job2, т.к. мы указали явную зависимость только от job1

.gitlab-ci.yml
stages:
  - stage1
  - stage2
  - stage3

job1:
  stage: stage1
  script:
    - echo "job1 - executing task1" > task1.txt
    - echo "job1 - executing task2" > task2.txt
  artifacts:
    paths:
      - task1.txt
      - task2.txt

job2:
  stage: stage2
  script:
    - cat task1.txt
    - cat task2.txt
    - echo "job2 - executing task1" > task1.txt
    - echo "job2 - executing task2" > task2.txt
  artifacts:
    paths:
      - task1.txt
      - task2.txt

job3:
  stage: stage3
  dependencies:
    - job1
  script:
    - cat task1.txt
    - cat task2.txt

Вывод:
Downloading artifacts
00:01
Downloading artifacts for job1 ()...
Downloading artifacts from coordinator... ok
Executing "step_script" stage of the job script
00:01
Using docker image ...
$ cat task1.txt
job1 - executing task1
$ cat task2.txt
job1 - executing task2
Cleaning up project directory and file based variables
00:00
Job succeeded


Caches

Способ сохранить данные между job, этапами пайплайна или разными пайплайнами

Полезен для зависимостей тип - node_modules/, .m2/, venv/ и т.д.

Cache:
1. Не используется, если явно не указать в job или глобально с помощью cache
2. Доступен для всех job, если используется глобально
3. Хранится на GitLab Runner

Для базовой настройки cache в .gitlab-ci.yml требуются три ключевых элемента

пути, ключ, политика (paths, key, policy):
cache:
  key: "${CI_COMMIT_REF_SLUG}"
  paths:
    - node_modules/
    - .npm/
  policy: pull-push

paths — указывает директории или файлы, которые необходимо кэшировать
В этом случае кэшируется директория node_modules, где npm сохраняет зависимости проекта

key — определяет ключ кэша, который используется для ассоциации кэша с конкретными задачами и условиями
В примере ключ задаётся как ${CI_COMMIT_REF_SLUG}, что означает использование уникального идентификатора ветки в качестве ключа
Это позволяет каждой ветке иметь свой собственный кэш, предотвращая конфликты

Установить общий локальный кэш для всех заданий на одном раннере .gitlab-ci.yml:
default:
 cache:
   path:
      - some_dir/path/to/folder/*.txt
      - some_dir/path/to/file

Привязать общий локальный кэш для всех заданий на одном раннере к конкретной ветви:
default:
 cache:
   key: $CI_COMMIT_REF_NAME
   path:
     - relative/path/to/folder/*.ext
     - relative/path/to/another_folder/
     - relative/path/to/file

Основа вашей стратегии кэширования

Ключ кэша определяет, когда GitLab создает новый кэш, а когда повторно использует существующий

Неправильный выбор ключа является наиболее распространенной ошибкой кэширования

Это приводит:
к сбоям в работе кэша (ненужная перестройка)
к загрязнению кэша (использование устаревших зависимостей)

Вот наиболее эффективные ключевые стратегии

# Стратегия 1: Кэш для конкретной ветки (подходит для большинства проектов)
cache:
  key: "${CI_COMMIT_REF_SLUG}"
  paths:
    - node_modules/

# Стратегия 2: Блокировка хэша файла (лучше всего подходит для кэширования зависимостей)
cache:
  key:
    files:
      - test.txt
  paths:
    - node_modules/

# Стратегия 3: Составной ключ (максимальная точность)
cache:
  key: "${CI_COMMIT_REF_SLUG}-${CI_PROJECT_ID}"
  paths:
    - node_modules/
    - .gradle/

Подход к хэшированию файла блокировки (стратегия 2) особенно эффективен
Создает новый кэш только при фактическом изменении зависимостей
Если test.txt не изменился, то будет повторно использован существующий кэш даже в разных ветвях

Политики кэширования: Контролируют загрузку и выгрузочное поведение

GitLab предлагает три политики кэширования, которые контролируют загрузку и выгружаемый кэш:
pull-push (по умолчанию): Загружает кэш в начале задания, загружает в конце
pull: загружает только кэш, никогда не обновляет его (идеально для заданий с большим объемом чтений)
push: загружает только кэш, не загружает (используется для заданий по созданию кэша)

Используйте разные политики для разных типов заданий, оптимизируя производительность конвейера

stages:
  - setup
  - test
  - build

# Это задание создает/обновляет кэш
setup_dependencies:
  stage: setup
  script:
    - npm ci
  cache:
    key:
      files:
        - package-lock.json
    paths:
      - node_modules/
    policy: push

# Эти задания считываются только из кэша
test_unit:
  stage: test
  script:
    - npm run test:unit
  cache:
    key:
      files:
        - package-lock.json
    paths:
      - node_modules/
    policy: pull

build_production:
  stage: build
  script:
    - npm run build
  cache:
    key:
      files:
        - package-lock.json
    paths:
      - node_modules/
    policy: pull

Простой пример кэширования Node.js Зависимости

В этом примере определяется глобальный кэш для node_modules/
Кэш используется как при сборке, так и при тестировании в конвейере
Область действия кэша определяется именем ветви с использованием предопределенной переменной ${CI_COMMIT_REF_SLUG}

stages:
  - build
  - test

cache:
  key: "npm-${CI_COMMIT_REF_SLUG}" # Расширяет область действия кэша до имени ветви
  paths:
    - node_modules/

build-job:
  stage: build
  script:
    - npm install  # Загружает и кэширует модули узлов
    - npm run build
  # Ключевое слово "cache" здесь неявно использует глобальные настройки кэша

test-job:
  stage: test
  script:
    - npm install  # Повторно использует кэш 'node_modules/' из задания build-job
    - npm run test

Простой пример кэширования на Python

В этом примере определяется глобальный кэш для всех заданий в конвейере
В кэше хранится кэш pip и виртуальная среда для каждой ветви

variables:
  # Измените каталог кэша pip на находящийся внутри каталога проекта
  # , чтобы мы могли кэшировать его как локальный артефакт.
  PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
  VENV_PATH: "$CI_PROJECT_DIR/venv"

image: python:3.10

cache:
  # Расширяет область действия кэша до имени ветви
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .cache/pip
    - venv/

before_script:
  - python --version
  # Создание и активация виртуальной среды
  - pip install virtualenv
  - virtualenv $VENV_PATH
  - source $VENV_PATH/bin/activate
  # Установить зависимости из файла requirements.txt
  - pip install -r requirements.txt

stages:
  - build
  - test

build_job:
  stage: build
  script:
    - echo "Build phase (dependencies are already installed)"
    # Add your build commands here

test_job:
  stage: test
  script:
    - echo "Test phase (dependencies are already installed)"
    # Run tests using the cached venv
    - pytest

 


Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.
Весь материал на сайте носит ознакомительный характер,
за его использование другими людьми, автор ответственности не несет.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект