|
|
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"`
|
|
|
// В реальном GitLab CI конфигурация может позволять
|
|
|
// описывать job'ы не только в секции "jobs", но и на верхнем уровне.
|
|
|
// Для упрощения в этом примере предполагаем, что все job'ы
|
|
|
// расположены под ключом "jobs".
|
|
|
}
|
|
|
|
|
|
// Job описывает структуру задачи (job).
|
|
|
type Job struct {
|
|
|
Name string `yaml:"-"`
|
|
|
Stage string `yaml:"stage,omitempty"`
|
|
|
Dependencies []string `yaml:"dependencies,omitempty"`
|
|
|
Needs []*Need `yaml:"needs,omitempty"`
|
|
|
Script interface{} `yaml:"script,omitempty"` // может быть строкой или списком строк
|
|
|
Run interface{} `yaml:"run,omitempty"` // для альтернативного описания шагов
|
|
|
Rules interface{} `yaml:"rules,omitempty"` // для динамических правил
|
|
|
// ... могут быть и другие поля
|
|
|
|
|
|
Line int `yaml:"-"` // Строка в файле
|
|
|
Column int `yaml:"-"` // Позиция в строке
|
|
|
DependencyLines map[string]struct {
|
|
|
Line int
|
|
|
Column int
|
|
|
} `yaml:"-"` // Строки и позиции зависимостей
|
|
|
}
|
|
|
|
|
|
// Need описывает одну зависимость в разделе needs
|
|
|
type Need struct {
|
|
|
Name string `yaml:"name"`
|
|
|
// могут быть и другие поля, напр. "artifacts: true/false" и т.д.
|
|
|
}
|
|
|
|
|
|
// MaxJobNameLength здесь зададим некоторые константы, используемые для валидации
|
|
|
const (
|
|
|
MaxJobNameLength = 63 // Примерно, как Ci::BuildNeed::MAX_JOB_NAME_LENGTH
|
|
|
)
|