Skip to content

GitLab Support

Lex edited this page Aug 21, 2026 · 3 revisions

GitLab Support

v1 scope: GitHub.com plus self-managed GitLab CE/Free, exactly >= 19.2.4 < 19.3.0. GitLab evidence flows through the authenticated glab CLI (≥ 1.113.0), exactly as GitHub evidence flows through gh. One CLI, one harness, two forges — the platform is declared, never guessed.

Declaring a GitLab origin

specgit init --gitlab-host git.example.com          # bare hostname
specgit init --gitlab-host git.example.com:8443     # non-default port

The declaration persists in spec_git/providers.yaml and is committed, so the team shares it. A github.com origin needs no declaration. Authentication is per host:

glab auth login --hostname git.example.com
glab auth status --hostname git.example.com

Environment contract (mirroring the GitHub side): SPECGIT_GLAB (executable path) and SPECGIT_GLAB_TIMEOUT_MS (default 15000; timeout ⇒ glab_transport, exit 3).

The version window

  • Self-managed GitLab is supported at exactly >= 19.2.4 < 19.3.0, CE/Free tier. Known-good anchor: the v19.2.4-ee release tag.
  • Any version outside the range fails closed: gitlab_version_unsupported, exit 3. The window moves only through an explicit rebaseline delivery — never silent drift.
  • The -ee / -ce suffix is a release-channel marker, not semver pre-release semantics: version comparison strips the suffix first, then compares the x.y.z triple.
  • Version discovery uses the authenticated metadata endpoint (glab api /metadata); metadata.enterprise is informational only, never a gate input.
  • glab floor: 1.113.0.
  • GitLab.com (SaaS) is judged by capability probing, never version pinning — any probe failure ⇒ verdict unknown (exit 3).

Differences from GitHub

Aspect GitHub (gh) GitLab (glab)
Pull request Pull request Merge request, created with the Draft: title prefix
Origin grammar owner/repo group[/subgroup…]/project, depth 2–5, %2F-encoded separators supported
Harness .github/workflows/specgit-accept.yml generated by init No GitHub workflow written (gitlab_harness_pending); bring your own .gitlab-ci.yml — its top-level job keys are detected as required checks
Check runs GitHub check runs on the PR head Pipeline jobs mapped to checks: job name = check name; skipped produces no check run; a failed allow_failure job passes the gate per pipeline semantics; non-final statuses read as pending, fail-closed
Required checks truth Required status checks The verified intersection of the policy list with the latest pipeline's job names when only_allow_merge_if_pipeline_succeeds is on; Ultimate-only status-check primitives are never used
Closing references Full GitHub grammar Common subset: Closes #<iid>, Fixes #<iid> — valid on both platforms
Project identity owner/repo Full path URL-encoded (/%2F) as :id, verified by numeric project id + path comparison
Undeclared origin n/a gitlab_unsupported fails closed at every depth

specgit finish on a declared GitLab origin evaluates all eleven gates through glab; the specgit issue bootstrap works against GitLab (draft MR after branch push, common-subset closing references). Diagnostic codes follow the platform CLI: glab_missing, glab_unauthenticated, glab_transport, gitlab_version_unsupported.

Design principles

  1. Mirror the seam, do not fork the gates. Acceptance evaluation is platform-agnostic; only evidence collection is platform-specific.
  2. One CLI per platform, authenticated, no tokens in state or logs. No direct REST clients.
  3. Fail-closed carries over. Missing glab, unauthenticated glab, an out-of-range server version, or an unreachable instance yields unknown, never accepted. A silently partial paginated list is never consumed (evidence_truncated, exit 3).
  4. Free-tier primitives only, honestly reported. Ultimate-only features are excluded forever.

Non-goals

  • No cross-platform deliveries (one delivery, one platform, one PR/MR).
  • No token storage: glab owns credentials, same as gh.
  • No support for versions outside >= 19.2.4 < 19.3.0 (self-managed) without a rebaseline delivery; no Ultimate-tier primitives, ever.
  • GitHub Enterprise is declaration-and-diagnostics only (non-goal for v1).

Chinese version: GitLab-Support-zh

Clone this wiki locally