k3nny 4f6855b9ab
ci / vet, staticcheck, test, build (push) Successful in 2m5s
feat(cli): inject GitLab predefined variables into the simulation context
Two categories of predefined variables are now injected automatically:

1. Always-available (CI=true, GITLAB_CI=true): set at lowest priority for
   every non-empty context so that rules:if: expressions like '$CI == "true"'
   evaluate correctly without requiring --var.

2. MR-specific (CI_MERGE_REQUEST_IID, CI_MERGE_REQUEST_SOURCE_BRANCH_NAME,
   CI_MERGE_REQUEST_TARGET_BRANCH_NAME, …): injected as placeholder values
   when --source merge_request_event is given, so MR-gated jobs evaluate
   as active rather than silently skipped. CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
   is derived from --branch when provided.

All injected defaults are non-pinned: --var overrides them, and pipeline
variables: blocks can also override via Inject(). The empty context (no
flags at all) is unchanged — no predefined vars are injected.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 23:30:25 +02:00
2026-06-11 23:56:09 +02:00
2026-06-11 20:40:39 +02:00
2026-06-10 22:40:42 +02:00
2026-06-26 00:22:42 +02:00
2026-06-26 00:22:42 +02:00
2026-06-07 20:13:03 +02:00

glint logo

glint

License Release

Disclaimer: This tool was built through iterative AI-assisted development with Claude. It is experimental, incomplete, and not intended for production use. Coverage of GitLab CI keywords is best-effort and may lag behind GitLab's evolving spec. Use it at your own discretion — no correctness guarantees are made. Contributions and bug reports are welcome.

A local tool to validate and lint .gitlab-ci.yml pipelines without needing a GitLab server.

What it does

  • Lints — 45 rules covering pipeline structure, keyword constraints, needs:/dependencies: graphs, expression reachability, and deprecations (GL001GL045); run glint explain <ID> for any rule
  • Resolves includes — local files, HTTPS URLs, GitLab project templates, and CI/CD Catalog components, with offline cache support and HTTP proxy support (--proxy flag or proxy: in .glint.yml)
  • Renders merged pipelineglint render resolves all includes and extends: chains into a single flat YAML file, matching what GitLab CI actually processes
  • Simulates context--branch, --tag, --source flags evaluate rules:if: and only/except to show which jobs would be active, manual, or skipped; --context branch=main --context branch=develop prints a multi-column comparison table across multiple contexts in one run
  • Multiple output formats--format text (default, colorized and column-aligned), json, sarif (GitHub Code Scanning / GitLab SAST), junit, github (PR annotations); exits 2 on errors, 10 on warnings only
  • Project config.glint.yml for rule suppression, severity overrides, token/URL/proxy defaults; # glint: ignore RULE for per-job inline suppression; --no-warn flag to suppress all warnings
  • Graph visualizationglint graph prints a terminal job tree (default); glint graph includes emits a Mermaid include-dependency graph; glint graph pipeline renders a GitLab CI-style SVG/PNG; --format mermaid or --format html for alternative pipeline output; --no-skipped hides jobs that would not run in the given context
  • LSP serverglint lsp starts a Language Server Protocol server over stdin/stdout; connect with any LSP client to get inline diagnostics (rule ID as code, error/warning severity) in VS Code, Neovim, Emacs, JetBrains, etc.
  • VS Code extensioneditors/vscode/ wraps the LSP server; inline squiggles for every glint rule directly in the editor

See FEATURES.md for the complete feature reference and lint rules table, and ROADMAP.md for planned improvements.

Requirements

  • Go 1.21 or later
  • Task (optional, for development tasks)

Installation

git clone https://git.k3nny.fr/k3nny/glint
cd glint
go build -o glint ./cmd/glint/...

Or with Task:

task build

Usage

glint [OPTIONS] <COMMAND>

Commands:
  check    Lint a pipeline file — exits 0 (clean), 2 (errors), or 10 (warnings only)
  render   Resolve all includes and extends into a single merged YAML file
  graph    Visualise the pipeline as a job tree or Mermaid graph
  explain  Show description and fix for a lint rule (e.g. glint explain GL007)
  lsp      Start a Language Server Protocol server (stdin/stdout)

Run glint <command> --help for all flags. See FEATURES.md for the complete feature reference.

Integrations

Pre-commit hook

Add to .pre-commit-config.yaml in your repository to run glint automatically whenever .gitlab-ci.yml changes:

repos:
  - repo: https://git.k3nny.fr/k3nny/glint
    rev: v0.3.0
    hooks:
      - id: glint

Requires pre-commit and Go 1.21+. On first run, pre-commit builds glint from source automatically.

GitLab CI component

Copy templates/check.yml into your repository and include it as a local file, or publish this repository to a GitLab CI/CD Catalog and reference it as a component:

# As a local include (copy templates/check.yml to your repo first):
include:
  - local: .gitlab/glint-check.yml

# As a Catalog component (after publishing to a GitLab instance):
include:
  - component: $CI_SERVER_FQDN/k3nny/glint/check@v0.3.0
    inputs:
      stage: validate          # optional, default: validate
      allow_failure: true      # optional, default: false

The component downloads the glint Linux binary, runs glint check, and respects all inputs defined in the spec: block.

GitHub Actions

Copy action.yml from this repository, or mirror this repo to GitHub as k3nny/glint and reference it directly:

- uses: k3nny/glint@v0.3.0
  with:
    file: .gitlab-ci.yml   # optional, default: .gitlab-ci.yml
    args: '--format sarif' # optional

The action downloads the glint Linux binary into $RUNNER_TEMP and runs glint check. Only Linux runners are supported (matches the available release binary).

VS Code extension

Clone this repository and load the extension from editors/vscode/:

cd editors/vscode
npm install          # install dependencies (once)
npm run compile      # compile TypeScript → out/

Then in VS Code: Run → Start Debugging (F5) — this opens an Extension Development Host with glint diagnostics active for any .gitlab-ci.yml you open.

Make sure glint is on your PATH, or set glint.executablePath in VS Code settings to the full path of the binary.

To package a .vsix for local installation:

task ext-package     # produces glint-X.Y.Z.vsix
code --install-extension glint-X.Y.Z.vsix

Development

This project uses Task as a task runner.

task              # list available tasks
task build        # compile the binary
task test         # run Go unit tests
task lint-go      # run go vet
task validate     # run the binary against all testdata fixtures
task ci           # full check: vet → test → build → validate
task fuzz         # run fuzz tests for the YAML parser (Ctrl-C to stop; FUZZ_TIME=60s to set duration)
task changelog    # regenerate CHANGELOG.md from git history via git-cliff
task changelog-next  # preview unreleased section (dry-run, no file written)
task ext-install     # install VS Code extension npm dependencies
task ext-compile     # compile the VS Code extension TypeScript source
task ext-package     # package the VS Code extension as a .vsix
task build-windows  # cross-compile for Windows x64 (requires a tagged commit → glint-<tag>.exe)
task build-linux    # cross-compile for Linux x64 (requires a tagged commit → glint-<tag>-linux-amd64)
task clean        # remove build artifacts

Optional tools:

  • git-cliff — changelog generator used by task changelog. Install with brew install git-cliff or cargo install git-cliff.

Project structure

.
├── cmd/glint/     # CLI entrypoint
├── internal/
│   ├── cicontext/      # CI variable context, rules:if: evaluator, job reachability
│   ├── fetcher/        # GitLab API client (project include fetching)
│   ├── graph/          # Mermaid and SVG/PNG graph generators
│   ├── linter/         # lint rules and findings
│   ├── model/          # pipeline data structures and YAML parser
│   └── resolver/       # extends: resolution and project include merging
├── testdata/           # sample pipelines used for manual validation
├── Taskfile.yml
└── go.mod
S
Description
A local tool to validate and lint .gitlab-ci.yml pipelines without needing a GitLab server.
Readme 1.8 MiB
v0.4.1 Latest
2026-06-26 23:58:14 +02:00
Languages
Go 99.7%
TypeScript 0.2%
Ruby 0.1%