Комментарии (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 или программно