|
|
package gitlabcivalidator
|
|
|
|
|
|
// 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"`
|
|
|
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"`
|
|
|
|
|
|
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 // Примерно, как Ci::BuildNeed::MAX_JOB_NAME_LENGTH
|
|
|
)
|