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:
commit
39eb16aab2
18 changed files with 63 additions and 49 deletions
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Require all templates to use default stages
|
||||
merge_request: 26954
|
||||
author:
|
||||
type: fixed
|
|
@ -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
|
||||
|
|
4
lib/gitlab/ci/config/external/file/local.rb
vendored
4
lib/gitlab/ci/config/external/file/local.rb
vendored
|
@ -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!")
|
||||
|
|
|
@ -6,6 +6,7 @@ stages:
|
|||
- environment
|
||||
- build
|
||||
- test
|
||||
- deploy
|
||||
- internal
|
||||
- alpha
|
||||
- beta
|
||||
|
|
|
@ -24,10 +24,6 @@ before_script:
|
|||
- yes | android-sdk-linux/tools/bin/sdkmanager --licenses
|
||||
- set -o pipefail
|
||||
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
|
||||
lintDebug:
|
||||
stage: build
|
||||
script:
|
||||
|
|
|
@ -60,6 +60,7 @@ variables:
|
|||
stages:
|
||||
- build
|
||||
- test
|
||||
- deploy # dummy stage to follow the template guidelines
|
||||
- review
|
||||
- dast
|
||||
- staging
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@ before_script:
|
|||
stages:
|
||||
- test
|
||||
- build
|
||||
- deploy
|
||||
|
||||
format:
|
||||
stage: test
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
image: mono:latest
|
||||
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
- deploy
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -9,6 +9,8 @@ before_script:
|
|||
|
||||
stages:
|
||||
- validate
|
||||
- build
|
||||
- test
|
||||
- deploy
|
||||
|
||||
validate:
|
||||
|
|
|
@ -4,6 +4,7 @@ image: alpine:latest
|
|||
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
- deploy
|
||||
|
||||
.serverless:build:image:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -24,6 +24,7 @@ before_script:
|
|||
stages:
|
||||
- validate
|
||||
- build
|
||||
- test
|
||||
- deploy
|
||||
|
||||
validate:
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
- deploy
|
||||
|
||||
variables:
|
||||
LC_ALL: "en_US.UTF-8"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue