Перейти к содержанию

Actionlint и ShellCheck: ловить ошибки CI до запуска

CI/CD · GitHub Actions · Shell
Не изучено

Добавлено 2026-10-11. Нужны установленные actionlint, ShellCheck и pre-commit; версии зафиксировать в окружении разработчика и CI.

Проблема

Обычный YAML-линтер не замечает неверное поле GitHub Actions или обращение к отсутствующей переменной matrix. Shell-скрипт проходит простую проверку синтаксиса, но ломается на пути с пробелами.

Решение

Actionlint проверяет структуру workflow и выражения Actions; при доступном ShellCheck также анализирует встроенные run. Отдельный запуск ShellCheck нужен для файлов скриптов: содержимое вызываемого ./scripts/deploy.sh не становится автоматически частью проверки workflow.

Пример

Добавить в существующий список repos файла .pre-commit-config.yaml:

repos:
  - repo: local
    hooks:
      - id: actionlint
        name: Проверка GitHub Actions
        entry: actionlint
        language: system
        files: '^\.github/workflows/.*\.ya?ml$'
      - id: shellcheck
        name: Проверка shell-скриптов
        entry: shellcheck
        language: system
        types: [shell]
pre-commit run actionlint --all-files
pre-commit run shellcheck --all-files

Без pre-commit можно проверить workflow и конкретный скрипт напрямую:

actionlint
shellcheck scripts/deploy.sh

Пример выражения в шаге workflow: данные события передаются через переменную окружения, чтобы текст не становился исходным кодом shell.

- name: Показать название PR
  env:
    PR_TITLE: ${{ github.event.pull_request.title }}
  run: printf '%s\n' "$PR_TITLE"

Это фрагмент steps, а не полный workflow. Если GitHub Actions в проекте нет, оставить ShellCheck для скриптов: actionlint не проверяет GitLab CI. Исключения линтера оформлять для конкретного случая с объяснением, без глобального отключения проверок.

Когда применять

При изменении workflow, скриптов бэкапа и деплоя. Дополняет pre-commit для IaC.

Источник

Как применить у себя

  1. Проверить все отслеживаемые workflow и shell-файлы, разобрать текущие замечания.
  2. Подключить те же проверки в CI, чтобы локальный hook нельзя было случайно обойти.
  3. В тестовой ветке добавить неизвестное поле workflow и некавыченную переменную с пробелами; убедиться, что проверки обнаруживают ошибки.
  4. После исправления и успешного CI отметить «Изучено».