← Назад к вопросам

Что такое артефакты в GitLab?

1.0 Junior🔥 142 комментариев
#MLOps и инфраструктура

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Артефакты в GitLab CI/CD

Артефакты — это файлы, созданные во время выполнения CI/CD пайплайна, которые сохраняются для последующего использования. Это критичная часть DevOps процесса.

Что такое артефакты

Артефакты — это любые файлы, которые нужно:

  • Сохранить после выполнения job'а
  • Передать между stage'ями
  • Скачать для анализа/развертывания
# Пример .gitlab-ci.yml
stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - python -m pip install -r requirements.txt
    - python -m pytest tests/ --cov=src --cov-report=html
    - mkdir -p dist
    - python setup.py bdist_wheel
  artifacts:
    paths:
      - dist/                    # папка с собранным пакетом
      - htmlcov/                 # отчёт о покрытии
    expire_in: 30 days           # хранить 30 дней
    when: always                 # сохранить при успехе и ошибке

test:
  stage: test
  dependencies:
    - build                      # зависит от артефактов build'а
  script:
    - pip install dist/*.whl     # использует артефакт из build
    - pytest integration_tests/
  artifacts:
    reports:
      junit: test-results.xml    # специальный артефакт для отчётов

deploy:
  stage: deploy
  dependencies:
    - build
  script:
    - ls -la dist/               # используем артефакты из build
    - pip install dist/*.whl
    - gunicorn app:app

Типы артефактов

1. Обычные файлы и папки

build_artifact:
  script:
    - mkdir build
    - gcc main.c -o build/app
  artifacts:
    paths:
      - build/app                # один файл
      - build/                   # вся папка
      - dist/**/*.whl            # паттерны

2. Reports (специальные артефакты)

test:
  script:
    - pytest --junitxml=report.xml
    - coverage xml
    - pylint src/ --exit-zero > pylint.txt
  artifacts:
    reports:
      junit: report.xml          # результаты тестов
      coverage_report:           # покрытие кода
        coverage_format: cobertura
        path: coverage.xml
      # GitLab будет показывать эти отчёты в UI

3. Dependency Artifacts

# Один job создаёт, другой потребляет

compile:
  stage: build
  script:
    - python -m py_compile src/
    - cp -r src/ compiled/
  artifacts:
    paths:
      - compiled/
    name: "compiled-$CI_COMMIT_SHA"  # уникальное имя

upload:
  stage: deploy
  dependencies:
    - compile  # явно указываем зависимость
  script:
    - ls compiled/  # артефакты из compile доступны
    - aws s3 sync compiled/ s3://mybucket/

Практический пример: ML Pipeline

stages:
  - data-prep
  - train
  - evaluate
  - deploy

data-preprocessing:
  stage: data-prep
  script:
    - python scripts/download_data.py
    - python scripts/preprocess.py
    - python scripts/split_data.py
  artifacts:
    paths:
      - data/train.csv
      - data/test.csv
      - data/validation.csv
    expire_in: 60 days

train_model:
  stage: train
  script:
    - pip install -r requirements.txt
    - python train.py
    - python -m pickle model.pkl > model_info.txt
  artifacts:
    paths:
      - model.pkl          # обученная модель
      - scaler.pkl         # preprocessor
      - metrics.json       # метрики обучения
      - model_info.txt     # информация о модели
    expire_in: 90 days

evaluate:
  stage: evaluate
  dependencies:
    - data-preprocessing  # нужны данные
    - train_model         # нужна модель
  script:
    - python evaluate.py
    - python -m pytest tests/
  artifacts:
    reports:
      junit: test-results.xml
    paths:
      - reports/confusion_matrix.png
      - reports/roc_curve.png
      - evaluation_metrics.json

deploy_prod:
  stage: deploy
  dependencies:
    - train_model
  script:
    - pip install dist/*.whl
    - python -c "import pickle; m=pickle.load(open('model.pkl', 'rb')); print('Model loaded')"
    - docker build -t myapp:$CI_COMMIT_SHA .
    - docker push registry.gitlab.com/myapp:$CI_COMMIT_SHA

Управление артефактами

Срок хранения (expire_in)

build:
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - dist/
    expire_in: 1 week      # удалится через неделю
    # expire_in: 30 days
    # expire_in: never     # хранить навсегда
    # expire_in: 1h        # удалится через час

Условное сохранение (when)

test:
  script:
    - pytest --junitxml=report.xml || true
  artifacts:
    paths:
      - report.xml
    when: always           # сохранить при успехе И ошибке
    # when: on_success    # только при успехе (default)
    # when: on_failure    # только при ошибке
    # when: never         # никогда

Исключение файлов

build:
  script:
    - make build
  artifacts:
    paths:
      - build/
    exclude:
      - build/**/*.o       # исключить временные файлы
      - build/temp/

Скачивание артефактов

# Из UI GitLab — кнопка Download в pipeline

# Через CLI
git clone https://gitlab.com/project.git
cd project

# Скачать артефакты определённого pipeline
git ls-remote --refs https://gitlab.com/project.git | head -1

# Через GitLab API
curl -o artifacts.zip \
  -L https://gitlab.example.com/api/v4/projects/1/jobs/42/artifacts \
  --header "PRIVATE-TOKEN: your_access_token"

Практическое использование в Data Science

# train.py
import json
import pickle
import joblib
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, f1_score

# Обучение
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)

# Сохранение
with open('model.pkl', 'wb') as f:
    pickle.dump(model, f)

# Метрики
y_pred = model.predict(X_test)
metrics = {
    'accuracy': float(accuracy_score(y_test, y_pred)),
    'f1': float(f1_score(y_test, y_pred)),
    'model_type': 'RandomForest',
    'params': {
        'n_estimators': 100,
        'max_depth': None
    }
}

with open('metrics.json', 'w') as f:
    json.dump(metrics, f, indent=2)

print("Model saved as model.pkl")
print(f"Metrics: {metrics}")
# .gitlab-ci.yml
train:
  stage: train
  image: python:3.9
  script:
    - pip install -r requirements.txt
    - python train.py
  artifacts:
    paths:
      - model.pkl
      - metrics.json
    reports:
      dotenv: metrics.json  # экспортировать в переменные
    expire_in: 30 days

Best Practices

# ✅ Хорошо
# 1. Давать значимые имена
artifacts:
  name: "model-${CI_COMMIT_SHA}-${CI_BUILD_ID}"
  paths:
    - dist/

# 2. Устанавливать разумные сроки хранения
artifacts:
  expire_in: 30 days  # не навсегда

# 3. Исключать лишние файлы
artifacts:
  paths:
    - dist/
  exclude:
    - dist/**/*.map    # не нужны source maps

# 4. Использовать dependencies для явности
deploy:
  dependencies:
    - build
    - test

# ❌ Плохо
# 1. Сохранять ВСЕХ файлы
artifacts:
  paths:
    - .                # все файлы! плохо!

# 2. Бесконечное хранение
artifacts:
  expire_in: never    # заполнит disk!

# 3. Не указывать dependencies
# Тогда job скачивает ВСЕ артефакты, замедляя выполнение

Вывод

  • Артефакты = результаты job'ов (модели, отчёты, бинарники)
  • Между job'ами передаются через dependencies
  • Для ML сохраняем: модели, метрики, визуализации
  • expire_in — важно управлять диском
  • Reports — автоматически отображаются в GitLab UI
  • API — можно скачивать через curl или программно