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 с scopeingest. Поставьте Masked.- (опционально)
EXLOGARE_API_BASE—https://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 GitLab | API 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
dindrunners уже имеютcurlиjq; на собственных runners — установите оба.