Skip to content
Exlogare

GitLab CI без OAuth

Отправка логов GitLab CI в Exlogare через API ingest без OAuth-интеграции.

Exlogare нативно интегрируется с GitLab.com и self-hosted GitLab через OAuth — тогда мы получаем pipeline events и комментарии в MR автоматически. Если хочется попробовать без admin-доступа или OAuth-flow — используйте API ingest: один CI variable + блок after_script.

Когда выбирать ingest вместо OAuth

  • Self-hosted GitLab без admin-доступа для регистрации OAuth application.
  • Изолированная сеть, в которой Exlogare не достаёт ваш GitLab напрямую.
  • Тестируете SaaS только на одном проекте.
  • Нужно один токен использовать в множестве проектов без OAuth flow.

CI/CD variables

В Settings → CI/CD → Variables задайте на уровне проекта (или группы):

  • EXLOGARE_TOKEN — API токен Exlogare с scope ingest. Поставьте Masked.
  • (опционально) EXLOGARE_API_BASEhttps://api.exlogare.net.

.gitlab-ci.yml

stages: [test]

variables:
  EXLOGARE_API_BASE: "https://api.exlogare.net"

.exlogare-on-fail: &exlogare-on-fail
  after_script:
    - |
      if [ "$CI_JOB_STATUS" = "failed" ]; then
        if ! command -v jq >/dev/null; then apt-get update -qq && apt-get install -yqq jq curl; fi
        curl -fsS -X POST "$EXLOGARE_API_BASE/api/ingest/log" \
          -H "Authorization: Bearer $EXLOGARE_TOKEN" \
          -H "Content-Type: application/json" \
          -d "$(jq -n \
            --arg proj "$CI_PROJECT_PATH" \
            --arg pid  "$CI_PIPELINE_ID" \
            --arg jid  "$CI_JOB_ID" \
            --arg jn   "$CI_JOB_NAME" \
            --arg br   "$CI_COMMIT_REF_NAME" \
            --arg sha  "$CI_COMMIT_SHA" \
            --arg url  "$CI_PIPELINE_URL" \
            --arg log  "$(tail -c 9000000 build.log 2>/dev/null || echo '')" \
            '{provider:"gitlab_ci", project:$proj, pipeline_id:$pid, job_id:$jid, job_name:$jn, status:"failed", branch:$br, commit_sha:$sha, pipeline_url:$url, log:$log}') "
      fi

test:
  stage: test
  image: python:3.12
  <<: *exlogare-on-fail
  script:
    - set -o pipefail
    - pytest -q 2>&1 | tee build.log

after_script гарантированно выполняется и при success, и при failure — внутри проверяем $CI_JOB_STATUS == failed. Лог build.log нужно сохранить в script через tee.

Минимальный inline-вариант

Если не нужен YAML-anchor — добавьте after_script прямо в job:

test:
  stage: test
  image: python:3.12
  script:
    - set -o pipefail
    - pytest -q 2>&1 | tee build.log
  after_script:
    - |
      [ "$CI_JOB_STATUS" = "failed" ] || exit 0
      curl -fsS -X POST "$EXLOGARE_API_BASE/api/ingest/log" \
        -H "Authorization: Bearer $EXLOGARE_TOKEN" \
        -H "Content-Type: application/json" \
        -d "$(jq -n --arg log "$(cat build.log)" \
          '{provider:"gitlab_ci", project:"'"$CI_PROJECT_PATH"'", pipeline_id:"'"$CI_PIPELINE_ID"'", job_id:"'"$CI_JOB_ID"'", status:"failed", pipeline_url:"'"$CI_PIPELINE_URL"'", log:$log}')"

Сравнение OAuth vs ingest

OAuth GitLabAPI ingest
Комментарии в MRДаНет (только дашборд + опц. чат)
Auto-discovery всех проектовДаТолько то, что вы заскриптили
УстановкаOAuth + token exchangeодин CI variable + after_script
Self-hosted air-gappedСложноРаботает
Free tierДаДа (3 ключа, 20 анализов на аккаунт за всё время)

Советы

  • tail -c 9000000 build.log — на тяжёлых сюитах, чтобы не упереться в лимит 10 МиБ.
  • EXLOGARE_TOKEN храните только как Masked CI/CD variable — не коммитьте в .gitlab-ci.yml.
  • На GitLab.com dind runners уже имеют curl и jq; на собственных runners — установите оба.