Skip to content
Exlogare

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

Обязательные поля

ПолеТипЗаметки
providerstringНазвание CI-вендора. Подойдёт практически любая строка — buildkite, AppVeyor, GitHub Actions, My CI 1.0 все валидны. Мы автоматически нормализуем её в lowercase-слаг (до 32 символов): пробелы, слеши, скобки и прочие неподдерживаемые символы заменяются на _, повторы схлопываются, а слаг обрезается так, чтобы начинаться и заканчиваться на [a-z0-9].
projectstringИдентификатор проекта / репо для группировки.
statusstringСтатус в нижнем регистре — см. ниже.
logstringЛог упавшего шага, до 10 МиБ.

Опциональные метаданные

ПолеЗаметки
pipeline_idУникальный id запуска (run id / build id / workflow id).
job_idid упавшего шага внутри запуска.
job_nameЧеловекочитаемое имя шага.
branchВетка / ref.
commit_shaХэш коммита.
pipeline_urlПрямая ссылка на страницу сборки.
build_numberDisplay-номер (например #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_idjob_idbranchcommit_sha
BuildkiteBUILDKITE_BUILD_IDBUILDKITE_JOB_IDBUILDKITE_BRANCHBUILDKITE_COMMIT
AppVeyorAPPVEYOR_BUILD_IDAPPVEYOR_REPO_BRANCHAPPVEYOR_REPO_COMMIT
GoCDGO_PIPELINE_COUNTERGO_STAGE_COUNTERGO_REVISION
ConcourseBUILD_IDBUILD_JOB_NAME
Bamboobamboo_buildKeybamboo_planKeybamboo_planRepository_branchbamboo_planRepository_revision

Если вашей CI нет в списке — отправляйте те значения, которые есть.