В современной разработке автоматизация процессов (CI/CD) играет ключевую роль. GitHub Actions предоставляет мощный инструментарий для создания рабочих процессов (workflows), но часто разработчики сталкиваются с необходимостью передать результаты работы одного этапа на другой. Именно здесь на сцену выходят артефакты.
В этой статье мы подробно разберем, что такое артефакты, чем они отличаются от кэша и как настроить их передачу между джобами на практическом примере.
Что такое артефакты в GitHub Actions?
Артефакты — это файлы или коллекции файлов, которые создаются в процессе выполнения workflow. Это могут быть бинарные файлы (сборки), отчеты о тестировании, скриншоты ошибок или любые другие данные, которые генерируются динамически.
Ключевые особенности артефактов:
- Срок хранения: По умолчанию артефакты хранятся до 90 дней (срок можно настроить под свои нужды, например, до 5 дней).
- Объем: Вы можете хранить значительные объемы данных (лимиты зависят от типа вашего аккаунта GitHub).
- Доступность: Артефакты можно скачивать через веб-интерфейс GitHub после завершения workflow или использовать их внутри других джобов.
Артефакты vs Кэш: в чем разница?
Часто возникает путаница между кэшированием и артефактами.
- Кэш используется для файлов, которые не меняются между запусками (например, зависимости
node_modules). Его цель — ускорить сборку. - Артефакты используются для файлов, которые генерируются заново при каждом запуске (результаты тестов, билд проекта). Их цель — сохранить результат работы.
Как работать с артефактами: Upload и Download
Для взаимодействия с артефактами используются два официальных экшена:
actions/upload-artifact: загружает файлы в хранилище GitHub.actions/download-artifact: скачивает ранее загруженные файлы для дальнейшего использования.
Практический пример: передача данных между тремя джобами
Рассмотрим сценарий, где мы последовательно обрабатываем данные, сохраняя результат в артефакт.
Шаг 1: Создание и загрузка артефакта
В первом джобе (FirstJob) мы создаем текстовый файл с результатом вычисления и загружаем его.
jobs:
FirstJob:
runs-on: ubuntu-latest
steps:
- name: Create math expression
run: echo "4" > math_result.txt
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: math-result-key
path: math_result.txt
retention-days: 5
Здесь name — это уникальный ключ, по которому мы будем обращаться к файлу, а path — путь к самому файлу.
Шаг 2: Модификация данных
Во втором джобе (IntermediateJob) мы скачиваем файл, производим с ним манипуляции (например, умножаем значение на 2) и перезаписываем артефакт.
IntermediateJob:
needs: FirstJob
runs-on: ubuntu-latest
steps:
- name: Download Artifact
uses: actions/download-artifact@v3
with:
name: math-result-key
- name: Multiply Expression
run: |
VALUE=$(cat math_result.txt)
echo $((VALUE * 2)) > math_result.txt
- name: Update Artifact
uses: actions/upload-artifact@v3
with:
name: math-result-key
path: math_result.txt
Шаг 3: Финальный результат
В последнем джобе мы скачиваем обновленный файл и выводим его содержимое в консоль.
FinalJob:
needs: IntermediateJob
runs-on: ubuntu-latest
steps:
- name: Download Final Result
uses: actions/download-artifact@v3
with:
name: math-result-key
- name: Print Result
run: cat math_result.txt
Почему важно использовать needs?
По умолчанию все джобы в GitHub Actions запускаются параллельно. Чтобы передача артефактов работала корректно, необходимо использовать параметр needs. Это гарантирует, что второй джоб не начнет работу, пока первый не загрузит файл в облако.
Заключение
Использование артефактов — это стандарт индустрии при настройке сложных CI/CD процессов. Они позволяют не только разделять логику на независимые этапы, но и обеспечивают прозрачность: вы всегда можете зайти в GitHub Actions и скачать «билд» или отчет, чтобы проверить, что именно пошло не так.
Настраивайте параметры retention-days, чтобы не забивать хранилище ненужными данными, и используйте последнюю версию экшенов для стабильной работы ваших пайплайнов.

