Make ci/lint page context aware:
- Create ci/lints controller inside project/ - Move js pages to be inside projects/ - Copy view ci/lint view to be inside project folder - Remove ci/lint view and js files Closes #43603
This commit is contained in:
parent
7c02d0cff3
commit
80f9aff34b
|
@ -0,0 +1,3 @@
|
||||||
|
import CILintEditor from '../ci_lint_editor';
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', () => new CILintEditor());
|
|
@ -4,20 +4,5 @@ module Ci
|
||||||
|
|
||||||
def show
|
def show
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
|
||||||
@content = params[:content]
|
|
||||||
@error = Gitlab::Ci::YamlProcessor.validation_message(@content)
|
|
||||||
@status = @error.blank?
|
|
||||||
|
|
||||||
if @error.blank?
|
|
||||||
@config_processor = Gitlab::Ci::YamlProcessor.new(@content)
|
|
||||||
@stages = @config_processor.stages
|
|
||||||
@builds = @config_processor.builds
|
|
||||||
@jobs = @config_processor.jobs
|
|
||||||
end
|
|
||||||
|
|
||||||
render :show
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
class Projects::Ci::LintsController < Projects::ApplicationController
|
||||||
|
before_action :ensure_user_access
|
||||||
|
|
||||||
|
def show
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@content = params[:content]
|
||||||
|
@error = Gitlab::Ci::YamlProcessor.validation_message(@content, yaml_processor_options)
|
||||||
|
@status = @error.blank?
|
||||||
|
|
||||||
|
if @error.blank?
|
||||||
|
@config_processor = Gitlab::Ci::YamlProcessor.new(@content, yaml_processor_options)
|
||||||
|
@stages = @config_processor.stages
|
||||||
|
@builds = @config_processor.builds
|
||||||
|
@jobs = @config_processor.jobs
|
||||||
|
end
|
||||||
|
|
||||||
|
render :show
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def yaml_processor_options
|
||||||
|
{ project: @project, sha: project.repository.commit.sha }
|
||||||
|
end
|
||||||
|
|
||||||
|
def ensure_user_access
|
||||||
|
return access_denied! unless can?(current_user, :create_pipeline, @project)
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,27 +1,6 @@
|
||||||
- page_title "CI Lint"
|
- page_title "CI Lint"
|
||||||
- page_description "Validate your GitLab CI configuration file"
|
|
||||||
- content_for :library_javascripts do
|
|
||||||
= page_specific_javascript_tag('lib/ace.js')
|
|
||||||
|
|
||||||
%h2 Check your .gitlab-ci.yml
|
.center
|
||||||
|
= image_tag 'illustrations/feature_moved.svg'
|
||||||
.ci-linter
|
%h3 GitLab CI Linter has been moved
|
||||||
.row
|
%p To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the "CI Lint" button.
|
||||||
= form_tag ci_lint_path, method: :post do
|
|
||||||
.form-group
|
|
||||||
.col-sm-12
|
|
||||||
.file-holder
|
|
||||||
.js-file-title.file-title.clearfix
|
|
||||||
Content of .gitlab-ci.yml
|
|
||||||
#ci-editor.ci-editor= @content
|
|
||||||
= text_area_tag(:content, @content, class: 'hidden form-control span1', rows: 7, require: true)
|
|
||||||
.col-sm-12
|
|
||||||
.pull-left.prepend-top-10
|
|
||||||
= submit_tag('Validate', class: 'btn btn-success submit-yml')
|
|
||||||
.pull-right.prepend-top-10
|
|
||||||
= button_tag('Clear', type: 'button', class: 'btn btn-default clear-yml')
|
|
||||||
|
|
||||||
.row.prepend-top-20
|
|
||||||
.col-sm-12
|
|
||||||
.results.ci-template
|
|
||||||
= render partial: 'create' if defined?(@status)
|
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
- page_title "CI Lint"
|
||||||
|
- page_description "Validate your GitLab CI configuration file"
|
||||||
|
- content_for :library_javascripts do
|
||||||
|
= page_specific_javascript_tag('lib/ace.js')
|
||||||
|
|
||||||
|
%h2 Check your .gitlab-ci.yml
|
||||||
|
|
||||||
|
.ci-linter
|
||||||
|
.row
|
||||||
|
= form_tag project_ci_lint_path(@project), method: :post do
|
||||||
|
.form-group
|
||||||
|
.col-sm-12
|
||||||
|
.file-holder
|
||||||
|
.js-file-title.file-title.clearfix
|
||||||
|
Content of .gitlab-ci.yml
|
||||||
|
#ci-editor.ci-editor= @content
|
||||||
|
= text_area_tag(:content, @content, class: 'hidden form-control span1', rows: 7, require: true)
|
||||||
|
.col-sm-12
|
||||||
|
.pull-left.prepend-top-10
|
||||||
|
= submit_tag('Validate', class: 'btn btn-success submit-yml')
|
||||||
|
.pull-right.prepend-top-10
|
||||||
|
= button_tag('Clear', type: 'button', class: 'btn btn-default clear-yml')
|
||||||
|
|
||||||
|
.row.prepend-top-20
|
||||||
|
.col-sm-12
|
||||||
|
.results.ci-template
|
||||||
|
= render partial: 'create' if defined?(@status)
|
|
@ -10,6 +10,6 @@
|
||||||
"no-pipelines-svg-path" => image_path('illustrations/pipelines_pending.svg'),
|
"no-pipelines-svg-path" => image_path('illustrations/pipelines_pending.svg'),
|
||||||
"can-create-pipeline" => can?(current_user, :create_pipeline, @project).to_s,
|
"can-create-pipeline" => can?(current_user, :create_pipeline, @project).to_s,
|
||||||
"new-pipeline-path" => can?(current_user, :create_pipeline, @project) && new_project_pipeline_path(@project),
|
"new-pipeline-path" => can?(current_user, :create_pipeline, @project) && new_project_pipeline_path(@project),
|
||||||
"ci-lint-path" => can?(current_user, :create_pipeline, @project) && ci_lint_path,
|
"ci-lint-path" => can?(current_user, :create_pipeline, @project) && project_ci_lint_path(@project),
|
||||||
"reset-cache-path" => can?(current_user, :admin_pipeline, @project) && reset_cache_project_settings_ci_cd_path(@project) ,
|
"reset-cache-path" => can?(current_user, :admin_pipeline, @project) && reset_cache_project_settings_ci_cd_path(@project) ,
|
||||||
"has-gitlab-ci" => (@project.has_ci? && @project.builds_enabled?).to_s } }
|
"has-gitlab-ci" => (@project.has_ci? && @project.builds_enabled?).to_s } }
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Move ci/lint under project's namespace
|
||||||
|
merge_request: 17729
|
||||||
|
author:
|
||||||
|
type: added
|
|
@ -1,5 +1,5 @@
|
||||||
namespace :ci do
|
namespace :ci do
|
||||||
resource :lint, only: [:show, :create]
|
resource :lint, only: :show
|
||||||
|
|
||||||
root to: redirect('')
|
root to: redirect('')
|
||||||
end
|
end
|
||||||
|
|
|
@ -423,6 +423,10 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
|
||||||
resource :repository, only: [:show], controller: :repository
|
resource :repository, only: [:show], controller: :repository
|
||||||
end
|
end
|
||||||
|
|
||||||
|
namespace :ci do
|
||||||
|
resource :lint, only: [:show, :create]
|
||||||
|
end
|
||||||
|
|
||||||
# Since both wiki and repository routing contains wildcard characters
|
# Since both wiki and repository routing contains wildcard characters
|
||||||
# its preferable to keep it below all other project routes
|
# its preferable to keep it below all other project routes
|
||||||
draw :wiki
|
draw :wiki
|
||||||
|
|
|
@ -4,7 +4,7 @@ module Gitlab
|
||||||
# Base GitLab CI Configuration facade
|
# Base GitLab CI Configuration facade
|
||||||
#
|
#
|
||||||
class Config
|
class Config
|
||||||
def initialize(config)
|
def initialize(config, opts = {})
|
||||||
@config = Loader.new(config).load!
|
@config = Loader.new(config).load!
|
||||||
|
|
||||||
@global = Entry::Global.new(@config)
|
@global = Entry::Global.new(@config)
|
||||||
|
|
|
@ -7,8 +7,8 @@ module Gitlab
|
||||||
|
|
||||||
attr_reader :cache, :stages, :jobs
|
attr_reader :cache, :stages, :jobs
|
||||||
|
|
||||||
def initialize(config)
|
def initialize(config, opts = {})
|
||||||
@ci_config = Gitlab::Ci::Config.new(config)
|
@ci_config = Gitlab::Ci::Config.new(config, opts)
|
||||||
@config = @ci_config.to_hash
|
@config = @ci_config.to_hash
|
||||||
|
|
||||||
unless @ci_config.valid?
|
unless @ci_config.valid?
|
||||||
|
@ -73,11 +73,11 @@ module Gitlab
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.validation_message(content)
|
def self.validation_message(content, opts = {})
|
||||||
return 'Please provide content of .gitlab-ci.yml' if content.blank?
|
return 'Please provide content of .gitlab-ci.yml' if content.blank?
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Gitlab::Ci::YamlProcessor.new(content)
|
Gitlab::Ci::YamlProcessor.new(content, opts)
|
||||||
nil
|
nil
|
||||||
rescue ValidationError => e
|
rescue ValidationError => e
|
||||||
e.message
|
e.message
|
||||||
|
|
|
@ -0,0 +1,123 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Projects::Ci::LintsController do
|
||||||
|
let(:project) { create(:project, :repository) }
|
||||||
|
let(:user) { create(:user) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
sign_in(user)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'GET #show' do
|
||||||
|
context 'with enough privileges' do
|
||||||
|
before do
|
||||||
|
project.add_developer(user)
|
||||||
|
|
||||||
|
get :show, namespace_id: project.namespace, project_id: project
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should be success' do
|
||||||
|
expect(response).to be_success
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should render show page' do
|
||||||
|
expect(response).to render_template :show
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should retrieve project' do
|
||||||
|
expect(assigns(:project)).to eq(project)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'without enough privileges' do
|
||||||
|
before do
|
||||||
|
project.add_guest(user)
|
||||||
|
|
||||||
|
get :show, namespace_id: project.namespace, project_id: project
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should respond with 404' do
|
||||||
|
expect(response).to have_gitlab_http_status(404)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'POST #create' do
|
||||||
|
let(:remote_file_path) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
|
||||||
|
|
||||||
|
let(:remote_file_content) do
|
||||||
|
<<~HEREDOC
|
||||||
|
before_script:
|
||||||
|
- apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
|
||||||
|
- ruby -v
|
||||||
|
- which ruby
|
||||||
|
- gem install bundler --no-ri --no-rdoc
|
||||||
|
- bundle install --jobs $(nproc) "${FLAGS[@]}"
|
||||||
|
HEREDOC
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:content) do
|
||||||
|
<<~HEREDOC
|
||||||
|
include:
|
||||||
|
- #{remote_file_path}
|
||||||
|
|
||||||
|
rubocop:
|
||||||
|
script:
|
||||||
|
- bundle exec rubocop
|
||||||
|
HEREDOC
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with a valid gitlab-ci.yml' do
|
||||||
|
before do
|
||||||
|
WebMock.stub_request(:get, remote_file_path).to_return(body: remote_file_content)
|
||||||
|
project.add_developer(user)
|
||||||
|
|
||||||
|
post :create, namespace_id: project.namespace, project_id: project, content: content
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should be success' do
|
||||||
|
expect(response).to be_success
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'render show page' do
|
||||||
|
expect(response).to render_template :show
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should retrieve project' do
|
||||||
|
expect(assigns(:project)).to eq(project)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with an invalid gitlab-ci.yml' do
|
||||||
|
let(:content) do
|
||||||
|
<<~HEREDOC
|
||||||
|
rubocop:
|
||||||
|
scriptt:
|
||||||
|
- bundle exec rubocop
|
||||||
|
HEREDOC
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
project.add_developer(user)
|
||||||
|
|
||||||
|
post :create, namespace_id: project.namespace, project_id: project, content: content
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should assign errors' do
|
||||||
|
expect(assigns[:error]).to eq('jobs:rubocop config contains unknown keys: scriptt')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'without enough privileges' do
|
||||||
|
before do
|
||||||
|
project.add_guest(user)
|
||||||
|
|
||||||
|
post :create, namespace_id: project.namespace, project_id: project, content: content
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should respond with 404' do
|
||||||
|
expect(response).to have_gitlab_http_status(404)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,10 +1,14 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe 'CI Lint', :js do
|
describe 'CI Lint', :js do
|
||||||
before do
|
let(:project) { create(:project, :repository) }
|
||||||
sign_in(create(:user))
|
let(:user) { create(:user) }
|
||||||
|
|
||||||
visit ci_lint_path
|
before do
|
||||||
|
project.add_developer(user)
|
||||||
|
sign_in(user)
|
||||||
|
|
||||||
|
visit project_ci_lint_path(project)
|
||||||
find('#ci-editor')
|
find('#ci-editor')
|
||||||
execute_script("ace.edit('ci-editor').setValue(#{yaml_content.to_json});")
|
execute_script("ace.edit('ci-editor').setValue(#{yaml_content.to_json});")
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe 'ci/lints/show' do
|
describe 'projects/ci/lints/show' do
|
||||||
include Devise::Test::ControllerHelpers
|
include Devise::Test::ControllerHelpers
|
||||||
|
let(:project) { create(:project, :repository) }
|
||||||
|
|
||||||
describe 'XSS protection' do
|
describe 'XSS protection' do
|
||||||
let(:config_processor) { Gitlab::Ci::YamlProcessor.new(YAML.dump(content)) }
|
let(:config_processor) { Gitlab::Ci::YamlProcessor.new(YAML.dump(content)) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
assign(:project, project)
|
||||||
assign(:status, true)
|
assign(:status, true)
|
||||||
assign(:builds, config_processor.builds)
|
assign(:builds, config_processor.builds)
|
||||||
assign(:stages, config_processor.stages)
|
assign(:stages, config_processor.stages)
|
||||||
|
@ -64,6 +66,7 @@ describe 'ci/lints/show' do
|
||||||
|
|
||||||
context 'when the content is valid' do
|
context 'when the content is valid' do
|
||||||
before do
|
before do
|
||||||
|
assign(:project, project)
|
||||||
assign(:status, true)
|
assign(:status, true)
|
||||||
assign(:builds, config_processor.builds)
|
assign(:builds, config_processor.builds)
|
||||||
assign(:stages, config_processor.stages)
|
assign(:stages, config_processor.stages)
|
||||||
|
@ -83,6 +86,7 @@ describe 'ci/lints/show' do
|
||||||
|
|
||||||
context 'when the content is invalid' do
|
context 'when the content is invalid' do
|
||||||
before do
|
before do
|
||||||
|
assign(:project, project)
|
||||||
assign(:status, false)
|
assign(:status, false)
|
||||||
assign(:error, 'Undefined error')
|
assign(:error, 'Undefined error')
|
||||||
end
|
end
|
Loading…
Reference in New Issue