Workflow step
- name: Notify Nerve
if: always()
env:
NERVE_DSN: ${{ secrets.NERVE_DSN }}
run: |
go install github.com/nerve-ink/nerve-cli/cmd/nerve@latest
echo "backend deploy ${{ job.status }}" | nerve send
Почему не просто webhook
Sender DSN умеет только отправлять зашифрованные сигналы. Он не читает историю, не подключается как агент и не выполняет команды.
Только ошибки, без шума
Для большинства репозиториев лучше не отправлять каждый успешный build. Success-сообщения быстро превращают канал в фон. Оставьте push для ситуаций, где нужно действие: failed tests, failed deploy, failed migration, failed smoke test.
- name: Notify only on failure
if: failure()
env:
NERVE_DSN: ${{ secrets.NERVE_DSN }}
run: |
go install github.com/nerve-ink/nerve-cli/cmd/nerve@latest
echo "FAILED: ${{ github.repository }} / ${{ github.ref_name }}
run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
| nerve send --severity critical
Что класть в сообщение
- репозиторий, ветку и environment;
- статус job и ссылку на Actions run;
- короткий human-readable контекст: deploy, tests, migration;
- не класть secrets, полный лог, токены и stack trace с credentials.
Organization secret
Если репозиториев много, создайте organization secret NERVE_DSN и разрешите его только нужным production repos. Тогда все workflow используют один паттерн, а ротация sender DSN делается в одном месте.
Pull request безопасность
Не отправляйте Nerve-сигналы из workflow, который выполняет недоверенный код из fork-а. Для public repos безопаснее ограничить уведомления push-ами в protected branches или production environment jobs.
if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main'
Smoke test после deploy
Самый ценный сигнал — не “workflow завершился”, а “после deploy production endpoint реально отвечает”. Добавьте отдельный шаг curl/smoke и шлите critical только если проверка не прошла.