-
Notifications
You must be signed in to change notification settings - Fork 0
Basic Usage
Inky Quill edited this page Feb 1, 2026
·
1 revision
This document provides practical examples of using GitLab CI Lint.
gitlab-ci-lint .gitlab-ci.ymlOutput:
✓ Local validation passed
✓ API validation passed
Configuration .gitlab-ci.yml is valid
cat > invalid.yml <<EOF
image: alpine:latest
build:
stage: build
script: echo "test" # Wrong indentation
EOF
gitlab-ci-lint invalid.ymlOutput:
✗ Local validation failed
Error: mapping values are not allowed in this context
Line: 5
Column: 4
Content: script: echo "test"
gitlab-ci-lint .gitlab-ci.ymlHuman-readable with colors and symbols.
gitlab-ci-lint --output json .gitlab-ci.ymlOutput:
{
"file": ".gitlab-ci.yml",
"valid": true,
"results": [
{
"stage": "local",
"valid": true,
"errors": [],
"warnings": []
},
{
"stage": "api",
"valid": true,
"errors": [],
"warnings": []
}
]
}Use in scripts:
valid=$(gitlab-ci-lint --output json .gitlab-ci.yml | jq -r '.valid')
if [ "$valid" = "true" ]; then
echo "Valid!"
figitlab-ci-lint --output yaml .gitlab-ci.ymlOutput:
file: .gitlab-ci.yml
valid: true
results:
- stage: local
valid: true
errors: []
warnings: []
- stage: api
valid: true
errors: []
warnings: []Skip API validation for faster feedback:
gitlab-ci-lint --skip-api .gitlab-ci.ymlUse cases:
- Development iterations
- Offline work
- Syntax-only validation
- Pre-commit hooks
Show detailed information:
gitlab-ci-lint --verbose .gitlab-ci.ymlShows:
- Validation steps
- API endpoint URLs
- Warnings (even if valid)
- Token validation
Detects TTY, enables colors for terminals:
gitlab-ci-lint .gitlab-ci.ymlForce colors (useful for CI logs):
gitlab-ci-lint --color always .gitlab-ci.yml | less -RDisable colors (useful for logging):
gitlab-ci-lint --color never .gitlab-ci.yml > validation.logValidate with project context (job references, variables):
# By project ID
gitlab-ci-lint --project 123 .gitlab-ci.yml
# By project path
gitlab-ci-lint --project mygroup/myproject .gitlab-ci.yml
# With nested groups
gitlab-ci-lint --project mygroup/subgroup/project .gitlab-ci.ymlUse when:
- CI file references other jobs
- Using project variables
- Need context-aware validation
export GCL_INSTANCE="https://gitlab.example.com"
export GCL_TOKEN="glpat-xxxxxxxxxxxx"
gitlab-ci-lint .gitlab-ci.ymlgitlab-ci-lint \
--instance https://gitlab.example.com \
--token glpat-xxxxxxxxxxxx \
.gitlab-ci.yml# ~/.tools-config/.gitlab-ci-lint/config.yaml
gitlab:
instance: "https://gitlab.example.com"
timeout: 60s
auth:
token: "glpat-xxxxxxxxxxxx"#!/bin/bash
gitlab-ci-lint .gitlab-ci.yml
case $? in
0)
echo "✓ Valid configuration"
;;
1)
echo "✗ Runtime error (check auth/network)"
exit 1
;;
10)
echo "✗ Invalid CI configuration"
exit 1
;;
esac.PHONY: validate-ci
validate-ci:
@echo "Validating CI configuration..."
@if gitlab-ci-lint .gitlab-ci.yml; then \
echo "✓ Valid"; \
else \
echo "✗ Invalid"; \
exit 1; \
filint:
stage: test
script:
- gitlab-ci-lint .gitlab-ci.yml
allow_failure: false# Quick syntax check
gitlab-ci-lint --skip-api .gitlab-ci.yml
# Full validation
gitlab-ci-lint .gitlab-ci.yml
# If valid, commit
git add .gitlab-ci.yml
git commit -m "Update CI configuration"# Validate all CI files in a project
find . -name ".gitlab-ci.yml" -o -name "*.gitlab-ci.yml" | while read file; do
echo "Validating $file..."
gitlab-ci-lint "$file"
done# .git/hooks/pre-commit
#!/bin/bash
echo "Validating CI configuration..."
for file in $(git diff --cached --name-only | grep -E '\.(gitlab-ci|ci)\.yml$'); do
if ! gitlab-ci-lint "$file"; then
echo "✗ Invalid CI configuration in $file"
exit 1
fi
done
echo "✓ All CI files are valid"Make executable:
chmod +x .git/hooks/pre-commit# Test against staging GitLab
gitlab-ci-lint --instance https://staging.gitlab.com .gitlab-ci.yml
# Test against production GitLab
gitlab-ci-lint --instance https://gitlab.com .gitlab-ci.yml# Local validation only
gitlab-ci-lint --skip-api .gitlab-ci.yml > local.txt
# Full validation
gitlab-ci-lint .gitlab-ci.yml > full.txt
# Compare
diff local.txt full.txt# Get validity status
gitlab-ci-lint --output json .gitlab-ci.yml | jq -r '.valid')
# Count errors
errors=$(gitlab-ci-lint --output json .gitlab-ci.yml | \
jq '[.results[].errors] | add | length')
echo "Found $errors errors"
# Extract error messages
gitlab-ci-lint --output json .gitlab-ci.yml | \
jq -r '.results[].errors[]?.message'# Enable verbose output
gitlab-ci-lint --verbose .gitlab-ci.yml
# With colors forced
gitlab-ci-lint --verbose --color always .gitlab-ci.yml | less -R
# Save debug output
gitlab-ci-lint --verbose .gitlab-ci.yml 2>&1 | tee debug.log# Fast, syntax-only validation
alias gcl='gitlab-ci-lint --skip-api'
gcl .gitlab-ci.yml# .git/hooks/pre-push
#!/bin/bash
gitlab-ci-lint --skip-api .gitlab-ci.yml || {
echo "CI configuration is invalid. Commit aborted."
exit 1
}# In your GitLab CI
validate:
stage: test
script:
- gitlab-ci-lint --token $CI_JOB_TOKEN .gitlab-ci.yml
only:
changes:
- .gitlab-ci.yml#!/bin/bash
# Periodic validation check
result=$(gitlab-ci-lint --output json .gitlab-ci.yml)
valid=$(echo "$result" | jq -r '.valid')
if [ "$valid" != "true" ]; then
errors=$(echo "$result" | jq -r '.results[].errors[]?.message' | head -5)
echo "Alert: CI configuration invalid!"
echo "Errors: $errors"
# Send alert (e.g., Slack, email)
fi# ~/.bashrc or ~/.zshrc
alias gcl='gitlab-ci-lint'
alias gclv='gitlab-ci-lint --verbose'
alias gclj='gitlab-ci-lint --output json'# Project-specific config
cat > .gitlab-ci-lint.yaml <<EOF
gitlab:
instance: "https://gitlab.example.com"
project: "mygroup/myproject"
validation:
strict: false
output:
format: "text"
verbose: true
EOF
gitlab-ci-lint --config .gitlab-ci-lint.yaml .gitlab-ci.ymlcat .gitlab-ci.yml | gitlab-ci-lint /dev/stdin# Generate completion script
gitlab-ci-lint completion bash > /etc/bash_completion.d/gitlab-ci-lint
gitlab-ci-lint completion zsh > /usr/local/share/zsh/site-functions/_gitlab-ci-lint
# Reload shell
source ~/.bashrc # or ~/.zshrc