package gitlabcivalidator import "gopkg.in/yaml.v3" // ValidationOptions описывает настройки валидации. type ValidationOptions struct { VerifyProjectSHA bool // нужно ли проверять SHA проекта ProjectSHA string // какой SHA нужно проверить } // GitLabCIConfig описывает структуру корневого объекта .gitlab-ci.yml type GitLabCIConfig struct { Default interface{} `yaml:"default,omitempty"` Include interface{} `yaml:"include,omitempty"` BeforeScript interface{} `yaml:"before_script,omitempty"` Image interface{} `yaml:"image,omitempty"` Services interface{} `yaml:"services,omitempty"` AfterScript interface{} `yaml:"after_script,omitempty"` Variables interface{} `yaml:"variables,omitempty"` VariablesNode *yaml.Node `yaml:"-"` Stages []string `yaml:"stages,omitempty"` Cache interface{} `yaml:"cache,omitempty"` Workflow interface{} `yaml:"workflow,omitempty"` Jobs map[string]*Job `yaml:"jobs,omitempty"` Changes interface{} `yaml:"changes,omitempty"` Paths interface{} `yaml:"paths,omitempty"` // В реальном GitLab CI конфигурация может позволять // описывать job'ы не только в секции "jobs", но и на верхнем уровне. // Для упрощения в этом примере предполагаем, что все job'ы // расположены под ключом "jobs". } type Artifacts struct { Paths []string `yaml:"paths"` } // Job описывает структуру задачи (job). type Job struct { Name string `yaml:"-"` Stage string `yaml:"stage,omitempty"` Dependencies []string `yaml:"dependencies,omitempty"` Needs []string `yaml:"-"` // отключаем автоматическое декодирование Script interface{} `yaml:"script,omitempty"` // может быть строкой или списком строк Trigger interface{} `yaml:"trigger,omitempty"` // для описания trigger Run interface{} `yaml:"run,omitempty"` // для альтернативного описания шагов Rules interface{} `yaml:"rules,omitempty"` // для динамических правил Artifacts *Artifacts `yaml:"artifacts,omitempty"` // блок artifacts When string `yaml:"when,omitempty"` StartIn string `yaml:"start_in,omitempty"` Only interface{} `yaml:"only,omitempty"` OnlyLine int `yaml:"-"` OnlyColumn int `yaml:"-"` Except interface{} `yaml:"except,omitempty"` Variables interface{} `yaml:"variables,omitempty"` VariablesNode *yaml.Node `yaml:"-"` Line int `yaml:"-"` // Строка в файле Column int `yaml:"-"` // Позиция в строке DependencyLines map[string]struct { Line int Column int } `yaml:"-"` // Строки и позиции зависимостей NeedLines map[string]struct { Line int Column int } `yaml:"-"` } // MaxJobNameLength здесь зададим некоторые константы, используемые для валидации const ( MaxJobNameLength = 63 MaxVariableNameLength = 63 )