Добавьте надёжную обработку ошибок и очищающий trap в хрупкий скрипт деплоя
Скрипт деплоя скачивает отчёт во временный файл, преобразует его и загружает, но никогда не удаляет временный файл, а сбой в середине оставляет мусорный файл и скрипт идёт дальше, будто ничего не сломалось.
Ограничения: временный файл должен удаляться на ЛЮБОМ пути выхода (успех, ошибка или сигнал); сбой в середине конвейера обязан прервать выполнение.
#!/usr/bin/env bash
tmp=$(mktemp)
curl -s "$REPORT_URL" > "$tmp"
jq '.rows' "$tmp" > report.json
upload report.jsonДобавьте строгий режим и trap очистки.
Включите строгий режим через set -euo pipefail, чтобы упавшая команда, сломанная стадия конвейера или неустановленная переменная прерывали работу. Сразу после mktemp повесьте trap 'rm -f "$tmp"' EXIT: ловушка EXIT срабатывает при нормальном завершении, при аварийном выходе и при пойманном сигнале, поэтому временный файл всегда удаляется.
- ✗Вешать
trapдоmktemp, из-за чего ранний сбой не запускает очистку - ✗Верить, что один
set -eсам удаляет временные файлы безtrap - ✗Ставить trap лишь на
SIGINTилиRETURN, пропуская путь аварийного выхода
- →Почему вешать
trapнаEXIT, а не наSIGINTиSIGTERMпо отдельности? - →Как ведёт себя
set -eдля команды, чей сбой вы сознательно допускаете?
Решение
Скрипт держит временный файл, но не убирает его и не проверяет сбои. Нужны две вещи: строгий режим и одна ловушка очистки, повешенная сразу после создания файла.
#!/usr/bin/env bash
set -euo pipefail
tmp=$(mktemp)
trap 'rm -f "$tmp"' EXIT # снимаем файл на любом пути выхода
curl -sf "$REPORT_URL" > "$tmp" # -f: HTTP-ошибка → ненулевой код → abort
jq '.rows' "$tmp" > report.json
upload report.jsonset -euo pipefail—-eроняет скрипт на первой упавшей команде,-uловит неустановленную переменную (например пустой$REPORT_URL),-o pipefailделает сбой любой стадии конвейера видимым.trap 'rm -f "$tmp"' EXITвешается сразу послеmktemp. ЛовушкаEXITвыполняется при нормальном завершении, приset -e-аварии и при пойманном сигнале — поэтому временный файл удаляется всегда, ровно один обработчик.curl -sfдобавляет-f, чтобы HTTP 404/500 давали ненулевой код иset -eпрерывал работу вместо загрузки битого отчёта.