Merge branch '41209-ci-linter-fails-on-gitlab-ci-blob-viewer' into 'master'

Resolve "CI linter fails to work"

Closes #41209

See merge request gitlab-org/gitlab-ce!16922
This commit is contained in:
Kamil Trzciński 2018-02-07 13:09:56 +00:00
commit ead97c55ea
7 changed files with 44 additions and 27 deletions

View File

@ -16,10 +16,7 @@ module Ci
@builds = @config_processor.builds @builds = @config_processor.builds
@jobs = @config_processor.jobs @jobs = @config_processor.jobs
end end
rescue
@error = 'Undefined error'
@status = false
ensure
render :show render :show
end end
end end

View File

@ -394,7 +394,7 @@ module Ci
@config_processor ||= begin @config_processor ||= begin
Gitlab::Ci::YamlProcessor.new(ci_yaml_file) Gitlab::Ci::YamlProcessor.new(ci_yaml_file)
rescue Gitlab::Ci::YamlProcessor::ValidationError, Psych::SyntaxError => e rescue Gitlab::Ci::YamlProcessor::ValidationError => e
self.yaml_errors = e.message self.yaml_errors = e.message
nil nil
rescue rescue

View File

@ -0,0 +1,5 @@
---
title: 'Handle all Psych YAML parser exceptions (fixes #41209)'
merge_request:
author:
type: fixed

View File

@ -6,6 +6,8 @@ module Gitlab
def initialize(config) def initialize(config)
@config = YAML.safe_load(config, [Symbol], [], true) @config = YAML.safe_load(config, [Symbol], [], true)
rescue Psych::Exception => e
raise FormatError, e.message
end end
def valid? def valid?

View File

@ -85,7 +85,7 @@ module Gitlab
begin begin
Gitlab::Ci::YamlProcessor.new(content) Gitlab::Ci::YamlProcessor.new(content)
nil nil
rescue ValidationError, Psych::SyntaxError => e rescue ValidationError => e
e.message e.message
end end
end end

View File

@ -38,6 +38,16 @@ describe Gitlab::Ci::Config::Loader do
end end
end end
context 'when there is an unknown alias' do
let(:yml) { 'steps: *bad_alias' }
describe '#initialize' do
it 'raises FormatError' do
expect { loader }.to raise_error(Gitlab::Ci::Config::Loader::FormatError, 'Unknown alias: bad_alias')
end
end
end
context 'when yaml config is empty' do context 'when yaml config is empty' do
let(:yml) { '' } let(:yml) { '' }

View File

@ -1394,11 +1394,15 @@ EOT
describe "Error handling" do describe "Error handling" do
it "fails to parse YAML" do it "fails to parse YAML" do
expect {Gitlab::Ci::YamlProcessor.new("invalid: yaml: test")}.to raise_error(Psych::SyntaxError) expect do
Gitlab::Ci::YamlProcessor.new("invalid: yaml: test")
end.to raise_error(Gitlab::Ci::YamlProcessor::ValidationError)
end end
it "indicates that object is invalid" do it "indicates that object is invalid" do
expect {Gitlab::Ci::YamlProcessor.new("invalid_yaml")}.to raise_error(Gitlab::Ci::YamlProcessor::ValidationError) expect do
Gitlab::Ci::YamlProcessor.new("invalid_yaml")
end.to raise_error(Gitlab::Ci::YamlProcessor::ValidationError)
end end
it "returns errors if tags parameter is invalid" do it "returns errors if tags parameter is invalid" do
@ -1688,37 +1692,36 @@ EOT
end end
describe "#validation_message" do describe "#validation_message" do
context "when the YAML could not be parsed" do subject { Gitlab::Ci::YamlProcessor.validation_message(content) }
it "returns an error about invalid configutaion" do
content = YAML.dump("invalid: yaml: test")
expect(Gitlab::Ci::YamlProcessor.validation_message(content)) context "when the YAML could not be parsed" do
.to eq "Invalid configuration format" let(:content) { YAML.dump("invalid: yaml: test") }
end
it { is_expected.to eq "Invalid configuration format" }
end end
context "when the tags parameter is invalid" do context "when the tags parameter is invalid" do
it "returns an error about invalid tags" do let(:content) { YAML.dump({ rspec: { script: "test", tags: "mysql" } }) }
content = YAML.dump({ rspec: { script: "test", tags: "mysql" } })
expect(Gitlab::Ci::YamlProcessor.validation_message(content)) it { is_expected.to eq "jobs:rspec tags should be an array of strings" }
.to eq "jobs:rspec tags should be an array of strings"
end
end end
context "when YAML content is empty" do context "when YAML content is empty" do
it "returns an error about missing content" do let(:content) { '' }
expect(Gitlab::Ci::YamlProcessor.validation_message(''))
.to eq "Please provide content of .gitlab-ci.yml" it { is_expected.to eq "Please provide content of .gitlab-ci.yml" }
end end
context 'when the YAML contains an unknown alias' do
let(:content) { 'steps: *bad_alias' }
it { is_expected.to eq "Unknown alias: bad_alias" }
end end
context "when the YAML is valid" do context "when the YAML is valid" do
it "does not return any errors" do let(:content) { File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml')) }
content = File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml'))
expect(Gitlab::Ci::YamlProcessor.validation_message(content)).to be_nil it { is_expected.to be_nil }
end
end end
end end