Merge branch 'require-all-templates-to-include-default-stages' into 'master'

Require all templates to use default stages

Closes #59992

See merge request gitlab-org/gitlab-ce!26954
This commit is contained in:
Sean McGivern 2019-04-05 10:18:10 +00:00
commit 39eb16aab2
18 changed files with 63 additions and 49 deletions

View file

@ -0,0 +1,5 @@
---
title: Require all templates to use default stages
merge_request: 26954
author:
type: fixed

View file

@ -73,17 +73,13 @@ module Gitlab
def build_config(config, project:, sha:, user:)
initial_config = Gitlab::Config::Loader::Yaml.new(config).load!
if project
process_external_files(initial_config, project: project, sha: sha, user: user)
else
initial_config
end
end
def process_external_files(config, project:, sha:, user:)
Config::External::Processor.new(config,
project: project,
sha: sha || project.repository.root_ref_sha,
sha: sha || project&.repository&.root_ref_sha,
user: user,
expandset: Set.new).perform
end

View file

@ -21,7 +21,9 @@ module Gitlab
private
def validate_content!
if content.nil?
if context.project&.repository.nil?
errors.push("Local file `#{location}` does not have project!")
elsif content.nil?
errors.push("Local file `#{location}` does not exist!")
elsif content.blank?
errors.push("Local file `#{location}` is empty!")

View file

@ -6,6 +6,7 @@ stages:
- environment
- build
- test
- deploy
- internal
- alpha
- beta

View file

@ -24,10 +24,6 @@ before_script:
- yes | android-sdk-linux/tools/bin/sdkmanager --licenses
- set -o pipefail
stages:
- build
- test
lintDebug:
stage: build
script:

View file

@ -60,6 +60,7 @@ variables:
stages:
- build
- test
- deploy # dummy stage to follow the template guidelines
- review
- dast
- staging

View file

@ -14,9 +14,11 @@ variables:
KITCHEN_LOCAL_YAML: ".kitchen.dokken.yml"
stages:
- build
- lint
- unit
- test
- functional
- deploy
foodcritic:
stage: lint
@ -29,7 +31,7 @@ cookstyle:
- chef exec cookstyle .
chefspec:
stage: unit
stage: test
script:
- chef exec rspec spec

View file

@ -18,6 +18,7 @@ before_script:
stages:
- test
- build
- deploy
format:
stage: test

View file

@ -15,6 +15,7 @@
image: mono:latest
stages:
- build
- test
- deploy

View file

@ -1,7 +1,9 @@
image: ayufan/openshift-cli
stages:
- build # dummy stage to follow the template guidelines
- test
- deploy # dummy stage to follow the template guidelines
- review
- staging
- production

View file

@ -9,6 +9,8 @@ before_script:
stages:
- validate
- build
- test
- deploy
validate:

View file

@ -4,6 +4,7 @@ image: alpine:latest
stages:
- build
- test
- deploy
.serverless:build:image:

View file

@ -2,7 +2,9 @@
# This file assumes an own GitLab CI runner, setup on a macOS system.
stages:
- build
- test
- archive
- deploy
build_project:
stage: build

View file

@ -24,6 +24,7 @@ before_script:
stages:
- validate
- build
- test
- deploy
validate:

View file

@ -12,6 +12,8 @@
stages:
- build
- test
- deploy
variables:
LC_ALL: "en_US.UTF-8"

View file

@ -16,6 +16,12 @@ module Gitlab
end
alias_method :key, :name
def full_name
Pathname.new(@path)
.relative_path_from(self.class.base_dir)
.to_s
end
def content
@finder.read(@path)
end

View file

@ -3,46 +3,32 @@
require 'spec_helper'
describe "CI YML Templates" do
ABSTRACT_TEMPLATES = %w[Serverless].freeze
# These templates depend on the presence of the `project`
# param to enable processing of `include:` within CI config.
PROJECT_DEPENDENT_TEMPLATES = %w[Auto-DevOps DAST].freeze
using RSpec::Parameterized::TableSyntax
def self.concrete_templates
Gitlab::Template::GitlabCiYmlTemplate.all.reject do |template|
ABSTRACT_TEMPLATES.include?(template.name)
end
subject { Gitlab::Ci::YamlProcessor.new(content) }
where(:template_name) do
Gitlab::Template::GitlabCiYmlTemplate.all.map(&:full_name)
end
def self.abstract_templates
Gitlab::Template::GitlabCiYmlTemplate.all.select do |template|
ABSTRACT_TEMPLATES.include?(template.name)
end
end
with_them do
let(:content) do
<<~EOS
include:
- template: #{template_name}
describe 'concrete templates with CI/CD jobs' do
concrete_templates.each do |template|
it "#{template.name} template should be valid" do
# Trigger processing of included files
project = create(:project, :test_repo) if PROJECT_DEPENDENT_TEMPLATES.include?(template.name)
expect { Gitlab::Ci::YamlProcessor.new(template.content, project: project) }
.not_to raise_error
end
end
end
describe 'abstract templates without concrete jobs defined' do
abstract_templates.each do |template|
it "#{template.name} template should be valid after being implemented" do
content = template.content + <<~EOS
concrete_build_implemented_by_a_user:
stage: build
stage: test
script: do something
EOS
expect { Gitlab::Ci::YamlProcessor.new(content) }.not_to raise_error
end
it 'is valid' do
expect { subject }.not_to raise_error
end
it 'require default stages to be included' do
expect(subject.stages).to include(*Gitlab::Ci::Config::Entry::Stages.default)
end
end
end

View file

@ -626,8 +626,8 @@ module Gitlab
context "when an array is provided" do
let(:include_content) { ["/local.gitlab-ci.yml"] }
it "does not return any error" do
expect { subject }.not_to raise_error
it "returns a validation error" do
expect { subject }.to raise_error(Gitlab::Ci::YamlProcessor::ValidationError, /does not have project/)
end
end
@ -643,11 +643,18 @@ module Gitlab
let(:include_content) do
[
'https://gitlab.com/awesome-project/raw/master/.before-script-template.yml',
'/templates/.after-script-template.yml',
{ template: 'Auto-DevOps.gitlab-ci.yml' }
]
end
before do
WebMock.stub_request(:get, 'https://gitlab.com/awesome-project/raw/master/.before-script-template.yml')
.to_return(
status: 200,
headers: { 'Content-Type' => 'application/json' },
body: 'prepare: { script: ls -al }')
end
it "does not return any error" do
expect { subject }.not_to raise_error
end