Generic CI ingest
Один эндпоинт для любой CI/CD платформы — Buildkite, AppVeyor, своя in-house CI.
POST /api/ingest/log — универсальный ingest-эндпоинт. Используйте его, когда нет нативного маршрута для вашего CI: Buildkite, AppVeyor, GoCD, Concourse, Bamboo, своя CI.
Если ваша интеграция живёт в shell-скрипте, проще начать с Exlogare CLI: exl ingest отправляет те же поля в /api/ingest/log, но читает лог из файла/stdin и сам собирает JSON.
exl ingest --provider buildkite --project myorg/myrepo --status failed --log-file build.log
Обязательные поля
| Поле | Тип | Заметки |
|---|---|---|
provider | string | Название CI-вендора. Подойдёт практически любая строка — buildkite, AppVeyor, GitHub Actions, My CI 1.0 все валидны. Мы автоматически нормализуем её в lowercase-слаг (до 32 символов): пробелы, слеши, скобки и прочие неподдерживаемые символы заменяются на _, повторы схлопываются, а слаг обрезается так, чтобы начинаться и заканчиваться на [a-z0-9]. |
project | string | Идентификатор проекта / репо для группировки. |
status | string | Статус в нижнем регистре — см. ниже. |
log | string | Лог упавшего шага, до 10 МиБ. |
Опциональные метаданные
| Поле | Заметки |
|---|---|
pipeline_id | Уникальный id запуска (run id / build id / workflow id). |
job_id | id упавшего шага внутри запуска. |
job_name | Человекочитаемое имя шага. |
branch | Ветка / ref. |
commit_sha | Хэш коммита. |
pipeline_url | Прямая ссылка на страницу сборки. |
build_number | Display-номер (например #482). |
pipeline_id + job_id используются для идемпотентного дедупа — если они есть, отправляйте.
Статусы
Принимаются любые строки, но распознаются:
success, passed, ok, failed, failure, error, errored, cancelled, canceled, timeout, timedout, aborted, killed, running, pending, queued, skipped, blocked.
Неизвестные значения принимаются как есть и показываются в дашборде.
Минимальный пример
Через CLI:
exl ingest \
--provider buildkite \
--project myorg/myrepo \
--status failed \
--log-file build.log
То же напрямую через API:
curl -fsS -X POST https://api.exlogare.net/api/ingest/log \
-H "Authorization: Bearer $EXLOGARE_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"provider": "buildkite",
"project": "myorg/myrepo",
"status": "failed",
"log": "...build log..."
}'
Buildkite — пример
# .buildkite/pipeline.yml
steps:
- label: ":hammer: test"
command: |
set -o pipefail
pnpm test 2>&1 | tee /tmp/build.log
- wait: ~
continue_on_failure: true
- label: ":satellite: send-failure-log"
if: build.state == "failed"
command: |
curl -fsS -X POST https://api.exlogare.net/api/ingest/log \
-H "Authorization: Bearer $$EXLOGARE_TOKEN" \
-H "Content-Type: application/json" \
-d "$(jq -n \
--arg pid "$BUILDKITE_BUILD_ID" \
--arg jid "$BUILDKITE_JOB_ID" \
--arg br "$BUILDKITE_BRANCH" \
--arg sha "$BUILDKITE_COMMIT" \
--arg url "$BUILDKITE_BUILD_URL" \
--arg log "$(cat /tmp/build.log)" \
'{provider:"buildkite", project:"$BUILDKITE_PIPELINE_SLUG", pipeline_id:$pid, job_id:$jid, status:"failed", branch:$br, commit_sha:$sha, pipeline_url:$url, log:$log}')"
Соответствие env-переменных
pipeline_id | job_id | branch | commit_sha | |
|---|---|---|---|---|
| Buildkite | BUILDKITE_BUILD_ID | BUILDKITE_JOB_ID | BUILDKITE_BRANCH | BUILDKITE_COMMIT |
| AppVeyor | APPVEYOR_BUILD_ID | — | APPVEYOR_REPO_BRANCH | APPVEYOR_REPO_COMMIT |
| GoCD | GO_PIPELINE_COUNTER | GO_STAGE_COUNTER | GO_REVISION | — |
| Concourse | BUILD_ID | BUILD_JOB_NAME | — | — |
| Bamboo | bamboo_buildKey | bamboo_planKey | bamboo_planRepository_branch | bamboo_planRepository_revision |
Если вашей CI нет в списке — отправляйте те значения, которые есть.