Skip to content

v0.8.0 — E2E test suite + schema fixes + operational runbooks

Choose a tag to compare

@nalyk nalyk released this 18 May 14:31
· 37 commits to main since this release
d302623

E2E test infrastructure (reincarnation of #63 by @ecthelion77, Olivier Gintrand) plus three pre-existing schema bugs the suite surfaced on first run against GitLab CE 18.x. Also includes three operational runbooks (release atomicity recovery, ghcr first-publish, release ceremony) that close #47, #49, #51.

Added

  • End-to-end test suite under e2e/ — 81 tests covering all 86 MCP tools
    against a real GitLab CE container. 76 pass + 5 Premium-only skipped on a
    fresh GitLab volume. Originally proposed in #63 by @ecthelion77; reincarnated
    by maintainer onto current main with corrections (see Internal below).
  • .github/workflows/e2e.yml — runs the E2E suite after the build workflow
    completes, using a pre-warmed GitLab CE image.
  • .github/workflows/warm-gitlab.yml — weekly pre-warm of a GitLab CE image
    with migrations already applied, cutting E2E boot time from 8-12 min cold to
    ~2 min. Manual workflow_dispatch available for ad-hoc rebuilds.
  • scripts/check-tool-coverage.sh — coverage gate wired into build.yml
    that fails the build if a new tool is added to src/index.ts without a
    corresponding E2E test. Premium-only tools (group wiki) whitelisted.
  • GITLAB_HOST_PORT env override in e2e/docker-compose.yml for local
    contributors whose host port 8080 is occupied by other services.

Fixed

  • GitLabRepositorySchema now declares path_with_namespace and path
    present in every /projects response from GitLab but Zod was silently
    stripping them, so tool consumers that relied on them (including the
    search_repositories E2E test) saw undefined. Pre-existing bug on main,
    surfaced by the reincarnated suite.
  • approveMergeRequest / unapproveMergeRequest no longer parse responses
    as full MergeRequest objects
    — the /merge_requests/:iid/approve and
    /unapprove endpoints in GitLab CE return a small approval-state object,
    not the full MR. The old code threw Invalid arguments: id, iid, ... required
    on every call. New schema MergeRequestApprovalStateSchema parses both
    variants and tolerates the 204 No Content return from CE on unapprove.
  • WikiPageFormatEnum accepts 'plaintext' — GitLab CE 18.x returns
    'plaintext' on wiki pages created via API without an explicit format,
    in addition to the 4 documented values. Enum was rejecting the response.

Internal

  • Maintainer corrections applied during reincarnation of #63 — node:22-alpine
    digest pin in e2e/Dockerfile; gitlab/gitlab-ce:18.11.3-ce.0 pin in
    docker-compose (was :latest); external_url 'http://gitlab.local' (nominal
    hostname) so nginx listens on container port 80 matching the port mapping;
    monitoring_whitelist = ['0.0.0.0/0', '::/0'] so host-side
    wait-for-gitlab.sh can poll /-/readiness through the docker bridge;
    FIXTURES_DIR default changed from absolute /app/fixtures to relative
    ./fixtures so host runs work; ToolResult type narrowed from any to a
    shaped optional-content union; coverage-script regex tightened to .callTool(
    context to eliminate 5 false positives; .dockerignore added; warm-gitlab.yml
    permissions and :latest push gating hardened. Full per-commit detail on the
    reincarnation PR.

Documentation

  • docs/OPERATIONS.md gained two operational runbooks:
    "Release atomicity & recovery" (closes #47) covering the independent
    failure modes of build.yml and publish.yml plus gh CLI recovery
    commands for each asymmetric case, and "First-publish runbook: ghcr.io
    package" (closes #51) covering the one-time visibility/Actions-access
    setup for a freshly created container package on GitHub.
  • CONTRIBUTING.md gained a "🎯 Release ceremony" section (closes #49)
    documenting the release-driven publish model (since #43): when to cut a
    release, the 8-step maintainer procedure, and the anti-patterns (no
    manual npm publish, no amends to published releases, no CHANGELOG
    rewrites).
  • CLAUDE.md test note refreshed to mention the new e2e/ suite +
    coverage gate, and to list all current unit test files.

Credits

  • E2E suite design and ~80% of the implementation: @ecthelion77 (Olivier Gintrand).
    Cherry-picked with authorship preserved on each of his 5 commits; the squash
    merge to main carries a Co-authored-by: trailer.