Commit bf505737 authored by Stan Hu's avatar Stan Hu

Fix 500 error in CI lint when included templates are an array

Previously the following syntax would fail in the linter with an
error 500:

```
include:
  template:
    - License-Management.gitlab-ci.yml
    - Dependency-Scanning.gitlab-ci.yml
    - SAST.gitlab-ci.yml
```

Now the error will call out specifically that the value
is not a string.

Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/66605
parent f7e36934
---
title: Fix 500 error in CI lint when included templates are an array
merge_request: 32232
author:
type: fixed
...@@ -2170,6 +2170,14 @@ include: ...@@ -2170,6 +2170,14 @@ include:
- template: Auto-DevOps.gitlab-ci.yml - template: Auto-DevOps.gitlab-ci.yml
``` ```
Multiple `include:template` files:
```yaml
include:
- template: Android-Fastlane.gitlab-ci.yml
- template: Auto-DevOps.gitlab-ci.yml
```
All [nested includes](#nested-includes) will be executed only with the permission of the user, All [nested includes](#nested-includes) will be executed only with the permission of the user,
so it is possible to use project, remote or template includes. so it is possible to use project, remote or template includes.
......
...@@ -26,6 +26,10 @@ module Gitlab ...@@ -26,6 +26,10 @@ module Gitlab
location.present? location.present?
end end
def invalid_location_type?
!location.is_a?(String)
end
def invalid_extension? def invalid_extension?
location.nil? || !::File.basename(location).match?(YAML_WHITELIST_EXTENSION) location.nil? || !::File.basename(location).match?(YAML_WHITELIST_EXTENSION)
end end
...@@ -71,7 +75,9 @@ module Gitlab ...@@ -71,7 +75,9 @@ module Gitlab
end end
def validate_location! def validate_location!
if invalid_extension? if invalid_location_type?
errors.push("Included file `#{location}` needs to be a string")
elsif invalid_extension?
errors.push("Included file `#{location}` does not have YAML extension!") errors.push("Included file `#{location}` does not have YAML extension!")
end end
end end
......
...@@ -41,6 +41,12 @@ describe Gitlab::Ci::Config::External::File::Base do ...@@ -41,6 +41,12 @@ describe Gitlab::Ci::Config::External::File::Base do
end end
describe '#valid?' do describe '#valid?' do
context 'when location is not a string' do
let(:location) { %w(some/file.txt other/file.txt) }
it { is_expected.not_to be_valid }
end
context 'when location is not a YAML file' do context 'when location is not a YAML file' do
let(:location) { 'some/file.txt' } let(:location) { 'some/file.txt' }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment