-
Notifications
You must be signed in to change notification settings - Fork 0
API Reference
This document provides reference documentation for the gitlab-ci-lint API packages.
Main CLI application entry point.
rootCmd - Main Cobra command for linting
Usage:
gitlab-ci-lint [flags] <file>-
runLint()- Main linting logic
Interactive setup wizard for configuration.
rootCmd - Setup Cobra command
Usage:
gitlab-ci-lint setupConfiguration management with multi-source loading.
type Config struct {
GitLab GitLabConfig
Auth AuthConfig
Validation ValidationConfig
Output OutputConfig
}Configuration for the application.
type GitLabConfig struct {
Instance string // GitLab instance URL
Timeout time.Duration // API timeout
}type AuthConfig struct {
Token string // Personal access token
Netrc bool // Use .netrc for credentials
}type ValidationConfig struct {
SkipAPI bool // Skip API validation
Strict bool // Use strict YAML parsing
Project string // Default project (ID or path)
}type OutputConfig struct {
Format string // Output format: text|json|yaml
Verbose bool // Verbose output
Color string // Color mode: auto|always|never
}func GetDefaults() ConfigReturns default configuration values.
func NewLoader(flags *ConfigFlags) *LoaderCreates a new configuration loader.
func (l *Loader) Load() (*Config, error)Loads configuration from all sources with proper priority.
func WriteConfig(path string, cfg *Config) errorWrites configuration to file with atomic operation and secure permissions.
GitLab API client for CI linting.
type Client struct {
instance string
token string
httpClient *http.Client
}GitLab API client.
type LintRequest struct {
Content string `json:"content"`
DryRun bool `json:"dry_run,omitempty"`
IncludeJobs bool `json:"include_jobs,omitempty"`
}Request body for CI lint API.
type LintResponse struct {
Valid bool `json:"valid"`
Errors []APIError `json:"errors,omitempty"`
Warnings []string `json:"warnings,omitempty"`
MergedYaml string `json:"merged_yaml,omitempty"`
}Response from CI lint API.
type APIError struct {
Message string `json:"message"`
}Error from GitLab API.
func NewClient(instance, token string, timeout time.Duration) *ClientCreates a new GitLab API client.
func (c *Client) Lint(ctx context.Context, content []byte, projectRef string) (*LintResponse, error)Validates a CI configuration using the GitLab API.
Parameters:
-
ctx- Context for cancellation -
content- CI configuration file content -
projectRef- Project reference (ID or path), empty for global validation
Returns: LintResponse or error
func (c *Client) ValidateToken(ctx context.Context) errorValidates the current token by calling /api/v4/user.
func ExtractTokenFromNetrc(instance string) (string, error)Attempts to find credentials in .netrc file.
Status: Not yet implemented
func NormalizeInstanceURL(instance string) stringNormalizes a GitLab instance URL:
- Adds
https://scheme if missing - Removes trailing slashes
- Trims whitespace
Validation logic for CI configurations.
type Validator interface {
Validate(content []byte) Result
}Interface for validation operations.
type Result struct {
Valid bool
Errors []Error
Warnings []Warning
Stage string // "local" or "api"
}Result of a validation operation.
type Error struct {
Message string
Line int
Column int
Content string // Error line content
}Validation error with context.
type Warning struct {
Message string
Line int
}Validation warning.
type LocalValidator struct {
strict bool
}Validates YAML syntax locally.
Methods:
NewLocalValidator(strict bool) *LocalValidatorValidate(content []byte) Result
type APIValidator struct {
client *gitlab.Client
project string
}Validates using GitLab API.
Methods:
NewAPIValidator(client *gitlab.Client, project string) *APIValidatorValidate(content []byte) Result
Output formatting for validation results.
type Formatter struct {
colorizer *Colorizer
verbose bool
}Handles output formatting.
type Colorizer struct {
mode string // "auto", "always", "never"
}Terminal color handling.
func NewFormatter(colorSetting string, verbose bool) *FormatterCreates a new output formatter.
func (f *Formatter) FormatResult(w io.Writer, format string, results []validator.Result, filename string)Formats and writes validation results.
Parameters:
-
w- Writer for output -
format- Output format: "text", "json", "yaml" -
results- Validation results -
filename- File being validated
func (f *Formatter) FormatMessage(w io.Writer, level, message string)Formats a generic message.
Parameters:
-
level- Message level: "error", "warning", "info" -
message- Message content
func NewColorizer(mode string) *ColorizerCreates a new colorizer.
func (c *Colorizer) Color(color, text string) stringApplies color to text if enabled.
Colors: "red", "green", "yellow", "blue", "gray"
Setup validation for the configuration wizard.
func ValidateToken(instance, token string) (*TokenValidationResult, error)Validates a GitLab personal access token.
Returns: TokenValidationResult with validity status and username (if valid)
func DetectInstanceType(instance string) (*InstanceInfo, error)Detects the GitLab instance type and version.
Returns: InstanceInfo with version and instance name
func TestConnection(ctx context.Context, instance string) errorTests connectivity to a GitLab instance.
type TokenValidationResult struct {
Valid bool
Username string
Error string
}Result of token validation.
type InstanceInfo struct {
Version string
InstanceName string
URL string
}Information about a GitLab instance.
Exit code constants.
const (
ExitSuccess = 0
ExitGeneralError = 1
ExitValidationError = 10
)ExitSuccess: All validations passed
ExitGeneralError: Runtime error (file not found, auth failed, etc.)
ExitValidationError: CI configuration invalid
Version information injected at build time.
var (
Version string // Version string (e.g., "v1.2.3")
Commit string // Git commit hash
BuildDate string // Build timestamp (UTC)
)These are set via -ldflags during build:
go build \
-ldflags "-X github.com/InkyQuill/gitlab-ci-lint/pkg/version.Version=v1.2.3" \
-o gitlab-ci-lintpackage main
import (
"github.com/InkyQuill/gitlab-ci-lint/internal/config"
"github.com/InkyQuill/gitlab-ci-lint/internal/validator"
)
func main() {
// Load configuration
loader := config.NewLoader(&config.ConfigFlags{})
cfg, _ := loader.Load()
// Create validator
localValidator := validator.NewLocalValidator(cfg.Validation.Strict)
// Read CI file
content := []byte("image: alpine\nbuild:\n script: echo test")
// Validate
result := localValidator.Validate(content)
if !result.Valid {
// Handle errors
for _, err := range result.Errors {
println(err.Message)
}
}
}package main
import (
"context"
"github.com/InkyQuill/gitlab-ci-lint/internal/gitlab"
)
func main() {
client := gitlab.NewClient(
"https://gitlab.com",
"glpat-token",
30*time.Second,
)
// Validate token
err := client.ValidateToken(context.Background())
if err != nil {
panic(err)
}
// Lint CI configuration
content := []byte("image: alpine")
resp, err := client.Lint(context.Background(), content, "")
if err != nil {
panic(err)
}
println("Valid:", resp.Valid)
}package main
import (
"os"
"github.com/InkyQuill/gitlab-ci-lint/internal/output"
"github.com/InkyQuill/gitlab-ci-lint/internal/validator"
)
func main() {
formatter := output.NewFormatter("auto", true)
results := []validator.Result{
{Stage: "local", Valid: true},
}
formatter.FormatResult(os.Stdout, "text", results, ".gitlab-ci.yml")
}For more examples, see the examples directory.