Почему разделение важно
CI-система является ценной целью. Workflow secret, который умеет деплоить, откатывать, перезапускать сервисы и читать логи, слишком силен. В Nerve workflow получает sender DSN: он может только отправить encrypted signal в pipe.
Failure signal из workflow
- name: Notify Nerve on failure
if: failure() && github.ref == 'refs/heads/main'
env:
NERVE_DSN: ${{ secrets.NERVE_DSN }}
run: |
go install github.com/nerve-ink/nerve-cli/cmd/nerve@latest
echo "CI failed repo=${{ github.repository }} run=${{ github.run_id }}" \
| nerve send --severity critical
Подтвержденное действие на host
Remediation action должен жить на host, deployment controller или отдельной management VM, а не внутри workflow context. Nerve agent может открывать reviewed wrappers: restart-api, collect-diagnostics, rollback-last-release.
Граница pull request
Не отправляйте action-oriented сигналы из workflows, которые запускают произвольный код из fork. Ограничьте такие уведомления protected branches, protected environments или manually approved deployment jobs.
Что CI должен передать
В notification полезно включить repository, branch, run ID, commit SHA, environment и ссылку на failed job. Не отправляйте cloud credentials, database URLs и длинные логи, где могут быть secrets.
Что остается вне CI
Rollback credentials, права на restart service и diagnostic access должны жить на action host. Так GitHub Actions остается удобным источником сигналов, но workflow secret не превращается в production access.
Проверка на staging
Перед production включите отдельный staging workflow или protected environment. Он должен отправить тот же формат сообщения, но action host будет staging-agent, а не production-agent. Так проще проверить route, текст push и allowlist.
Безопасные первые actions
- собрать логи упавшего сервиса;
- показать current release и health check status;
- перезапустить один stateless service;
- откатиться на previous known-good release через wrapper.