GitLab не нашёл artifacts после cd: путь считается от каталога проекта
Команда сборки завершилась успешно и напечатала путь к отчёту, но Runner сообщает no matching files. В script перед сборкой выполняется cd build, а artifacts.paths содержит report.txt. Автор ожидает, что загрузчик продолжит работать из build. На самом деле пути артефактов задаются относительно каталога проекта, а не последнего cd в script.
Другая разновидность той же проблемы: инструмент пишет в /tmp/report.txt, а в artifacts.paths указан абсолютный путь. Сборщик артефактов рассчитан на файлы внутри checkout. Удобнее сразу направить результат в выделенную папку CI_PROJECT_DIR либо скопировать туда готовый отчёт перед завершением job.
Зададим один явный корень
Пример создаёт результат после cd, а в artifacts указывает путь от корня проекта. Он не требует реальной системы сборки и позволяет проверить только расположение файла.
build-report:
image: alpine:3.22
script:
- mkdir -p "$CI_PROJECT_DIR/build/reports"
- cd "$CI_PROJECT_DIR/build"
- printf '%s\n' 'checks=4' 'failed=0' > reports/summary.txt
- test -s "$CI_PROJECT_DIR/build/reports/summary.txt"
artifacts:
paths:
- build/reports/summary.txt
После успешной job архив должен содержать build/reports/summary.txt. Проверка test использует полный путь, поэтому её смысл не зависит от текущего каталога. В YAML путь артефакта остаётся относительным: так видно, что именно будет собрано из рабочего дерева.
Если инструмент жёстко пишет в /tmp, после его успешного выполнения создайте папку в CI_PROJECT_DIR и скопируйте нужный файл туда. Затем проверьте размер или формат уже скопированного результата. Не расширяйте artifacts.paths на весь /tmp: там могут находиться чужие временные файлы и секретные данные.
Когда файл появляется позже script
after_script выполняется до загрузки артефактов, поэтому он может подготовить дополнительный диагностический файл. Однако его ошибки по умолчанию не равнозначны отказу основной команды. Если наличие отчёта обязательно для следующей job, создавайте и проверяйте его в script либо отдельной проверке с осмысленным статусом.
По умолчанию обычные artifacts загружаются для успешных jobs. Для диагностики неуспешного запуска можно задать when: always. Это не исправляет неправильный путь и не создаёт отсутствующий файл. Сначала убедитесь, что файл действительно сформирован к моменту upload, затем меняйте политику сохранения.
Если программа пишет результат постепенно и падает посередине, непустой файл ещё не доказывает полноту. Для отчёта с форматом проверьте штатный признак завершения или разберите документ. Условие test -s в учебном примере показывает расположение и наличие данных, но рабочая проверка должна соответствовать назначению результата.
Диагностика перед расширением масок
Добавьте в script вывод pwd и проверку конкретного полного пути. При необходимости покажите ограниченный список файлов каталога reports. Обычно этого достаточно, чтобы увидеть дополнительный уровень вложенности или ошибку имени. Полный рекурсивный листинг всего checkout создаёт шум и может раскрыть ненужные файлы.
Проверьте регистр имени: Summary.txt и summary.txt на Linux различаются. Также посмотрите, не переместила ли команда упаковки файл после создания. В логах должна быть последняя проверка того пути, который указан в artifacts, а не только сообщение инструмента о первоначальном выходном файле.
Когда артефакт появился в интерфейсе, скачайте его и проверьте внутренний путь. Следующая job получает именно это дерево файлов. Устранение ошибки upload завершено лишь тогда, когда потребитель может открыть ожидаемый результат без дополнительного угадывания каталогов.
В программе GitLab CI/CD есть artifacts, зависимости jobs и диагностика pipeline. Откройте программу и продолжите к сборке, где путь результата определён один раз и остаётся понятным от команды производителя до проверки и доставки.
Ещё по теме
Продолжить на практике
- GitLab CI/CD: автоматизация сборки и деплоя ↗
От первого .gitlab-ci.yml до pipeline, который тестирует код, собирает образ и выкладывает приложение. Runners, artifacts, cache, registry, окружения и безопасный откат — на одном практическом проекте.
