Добавьте надёжную обработку ошибок и очищающий 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.json
неустановленную переменную (например пустой $REPORT_URL), -o pipefail делает сбой любой стадии конвейера видимым.
выполняется при нормальном завершении, при set -e-аварии и при пойманном сигнале — поэтому временный файл удаляется всегда, ровно один обработчик.
прерывал работу вместо загрузки битого отчёта.
set -euo pipefail—-eроняет скрипт на первой упавшей команде,-uловитtrap 'rm -f "$tmp"' EXITвешается сразу послеmktemp. ЛовушкаEXITcurl -sfдобавляет-f, чтобы HTTP 404/500 давали ненулевой код иset -e