Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
a4a389a0
Commit
a4a389a0
authored
Nov 17, 2017
by
Matija Čupić
Committed by
Eric Eastwood
Nov 28, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
BE for automatic pipeline when enabling Auto DevOps
Fix
https://gitlab.com/gitlab-org/gitlab-ce/issues/38962
parent
a7f6ab95
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
371 additions
and
133 deletions
+371
-133
app/controllers/projects/pipelines_settings_controller.rb
app/controllers/projects/pipelines_settings_controller.rb
+13
-5
app/helpers/auto_devops_helper.rb
app/helpers/auto_devops_helper.rb
+16
-0
app/services/projects/update_service.rb
app/services/projects/update_service.rb
+9
-1
app/workers/create_pipeline_worker.rb
app/workers/create_pipeline_worker.rb
+16
-0
changelogs/unreleased/38962-automatically-run-a-pipeline-when-auto-devops-is-turned-on-in-project-settings.yml
...ine-when-auto-devops-is-turned-on-in-project-settings.yml
+5
-0
config/sidekiq_queues.yml
config/sidekiq_queues.yml
+1
-0
spec/controllers/projects/pipelines_settings_controller_spec.rb
...ontrollers/projects/pipelines_settings_controller_spec.rb
+28
-4
spec/helpers/auto_devops_helper_spec.rb
spec/helpers/auto_devops_helper_spec.rb
+100
-0
spec/services/projects/update_service_spec.rb
spec/services/projects/update_service_spec.rb
+147
-123
spec/workers/create_pipeline_worker_spec.rb
spec/workers/create_pipeline_worker_spec.rb
+36
-0
No files found.
app/controllers/projects/pipelines_settings_controller.rb
View file @
a4a389a0
...
@@ -6,13 +6,20 @@ class Projects::PipelinesSettingsController < Projects::ApplicationController
...
@@ -6,13 +6,20 @@ class Projects::PipelinesSettingsController < Projects::ApplicationController
end
end
def
update
def
update
if
@project
.
update
(
update_params
)
Projects
::
UpdateService
.
new
(
project
,
current_user
,
update_params
).
tap
do
|
service
|
if
service
.
execute
flash
[
:notice
]
=
"Pipelines settings for '
#{
@project
.
name
}
' were successfully updated."
flash
[
:notice
]
=
"Pipelines settings for '
#{
@project
.
name
}
' were successfully updated."
if
service
.
run_auto_devops_pipeline?
CreatePipelineWorker
.
perform_async
(
project
.
id
,
current_user
.
id
,
project
.
default_branch
,
:web
,
ignore_skip_ci:
true
,
save_on_errors:
false
)
end
redirect_to
project_settings_ci_cd_path
(
@project
)
redirect_to
project_settings_ci_cd_path
(
@project
)
else
else
render
'show'
render
'show'
end
end
end
end
end
private
private
...
@@ -21,6 +28,7 @@ class Projects::PipelinesSettingsController < Projects::ApplicationController
...
@@ -21,6 +28,7 @@ class Projects::PipelinesSettingsController < Projects::ApplicationController
:runners_token
,
:builds_enabled
,
:build_allow_git_fetch
,
:runners_token
,
:builds_enabled
,
:build_allow_git_fetch
,
:build_timeout_in_minutes
,
:build_coverage_regex
,
:public_builds
,
:build_timeout_in_minutes
,
:build_coverage_regex
,
:public_builds
,
:auto_cancel_pending_pipelines
,
:ci_config_path
,
:auto_cancel_pending_pipelines
,
:ci_config_path
,
:run_auto_devops_pipeline_implicit
,
:run_auto_devops_pipeline_explicit
,
auto_devops_attributes:
[
:id
,
:domain
,
:enabled
]
auto_devops_attributes:
[
:id
,
:domain
,
:enabled
]
)
)
end
end
...
...
app/helpers/auto_devops_helper.rb
View file @
a4a389a0
...
@@ -8,6 +8,22 @@ module AutoDevopsHelper
...
@@ -8,6 +8,22 @@ module AutoDevopsHelper
!
project
.
ci_service
!
project
.
ci_service
end
end
def
show_run_auto_devops_pipeline_checkbox_for_instance_setting?
(
project
)
return
false
if
project
.
repository
.
gitlab_ci_yml
if
project
&
.
auto_devops
&
.
enabled
.
present?
!
project
.
auto_devops
.
enabled
&&
current_application_settings
.
auto_devops_enabled?
else
current_application_settings
.
auto_devops_enabled?
end
end
def
show_run_auto_devops_pipeline_checkbox_for_explicit_setting?
(
project
)
return
false
if
project
.
repository
.
gitlab_ci_yml
!
project
.
auto_devops_enabled?
end
def
auto_devops_warning_message
(
project
)
def
auto_devops_warning_message
(
project
)
missing_domain
=
!
project
.
auto_devops
&
.
has_domain?
missing_domain
=
!
project
.
auto_devops
&
.
has_domain?
missing_service
=
!
project
.
kubernetes_service
&
.
active?
missing_service
=
!
project
.
kubernetes_service
&
.
active?
...
...
app/services/projects/update_service.rb
View file @
a4a389a0
...
@@ -15,7 +15,7 @@ module Projects
...
@@ -15,7 +15,7 @@ module Projects
return
error
(
"Could not set the default branch"
)
unless
project
.
change_head
(
params
[
:default_branch
])
return
error
(
"Could not set the default branch"
)
unless
project
.
change_head
(
params
[
:default_branch
])
end
end
if
project
.
update_attributes
(
params
.
except
(
:default_branch
)
)
if
project
.
update_attributes
(
update_params
)
if
project
.
previous_changes
.
include?
(
'path'
)
if
project
.
previous_changes
.
include?
(
'path'
)
project
.
rename_repo
project
.
rename_repo
else
else
...
@@ -31,8 +31,16 @@ module Projects
...
@@ -31,8 +31,16 @@ module Projects
end
end
end
end
def
run_auto_devops_pipeline?
params
.
dig
(
:run_auto_devops_pipeline_explicit
)
==
'true'
||
params
.
dig
(
:run_auto_devops_pipeline_implicit
)
==
'true'
end
private
private
def
update_params
params
.
except
(
:default_branch
,
:run_auto_devops_pipeline_explicit
,
:run_auto_devops_pipeline_implicit
)
end
def
renaming_project_with_container_registry_tags?
def
renaming_project_with_container_registry_tags?
new_path
=
params
[
:path
]
new_path
=
params
[
:path
]
...
...
app/workers/create_pipeline_worker.rb
0 → 100644
View file @
a4a389a0
class
CreatePipelineWorker
include
Sidekiq
::
Worker
include
PipelineQueue
enqueue_in
group: :creation
def
perform
(
project_id
,
user_id
,
ref
,
source
,
params
=
{})
project
=
Project
.
find
(
project_id
)
user
=
User
.
find
(
user_id
)
params
=
params
.
deep_symbolize_keys
Ci
::
CreatePipelineService
.
new
(
project
,
user
,
ref:
ref
)
.
execute
(
source
,
**
params
)
end
end
changelogs/unreleased/38962-automatically-run-a-pipeline-when-auto-devops-is-turned-on-in-project-settings.yml
0 → 100644
View file @
a4a389a0
---
title
:
Add the option to automatically run a pipeline after updating AutoDevOps settings
merge_request
:
15380
author
:
type
:
changed
config/sidekiq_queues.yml
View file @
a4a389a0
...
@@ -28,6 +28,7 @@
...
@@ -28,6 +28,7 @@
- [build, 2]
- [build, 2]
- [pipeline, 2]
- [pipeline, 2]
- [pipeline_processing, 5]
- [pipeline_processing, 5]
- [pipeline_creation, 4]
- [pipeline_default, 3]
- [pipeline_default, 3]
- [pipeline_cache, 3]
- [pipeline_cache, 3]
- [pipeline_hooks, 2]
- [pipeline_hooks, 2]
...
...
spec/controllers/projects/pipelines_settings_controller_spec.rb
View file @
a4a389a0
...
@@ -12,19 +12,22 @@ describe Projects::PipelinesSettingsController do
...
@@ -12,19 +12,22 @@ describe Projects::PipelinesSettingsController do
end
end
describe
'PATCH update'
do
describe
'PATCH update'
do
before
do
subject
do
patch
:update
,
patch
:update
,
namespace_id:
project
.
namespace
.
to_param
,
namespace_id:
project
.
namespace
.
to_param
,
project_id:
project
,
project_id:
project
,
project:
{
project:
{
auto_devops_attributes:
params
,
auto_devops_attributes:
params
run_auto_devops_pipeline_implicit:
'false'
,
}
run_auto_devops_pipeline_explicit:
auto_devops_pipeline
}
end
end
context
'when updating the auto_devops settings'
do
context
'when updating the auto_devops settings'
do
let
(
:params
)
{
{
enabled:
''
,
domain:
'mepmep.md'
}
}
let
(
:params
)
{
{
enabled:
''
,
domain:
'mepmep.md'
}
}
let
(
:auto_devops_pipeline
)
{
'false'
}
it
'redirects to the settings page'
do
it
'redirects to the settings page'
do
subject
expect
(
response
).
to
have_gitlab_http_status
(
302
)
expect
(
response
).
to
have_gitlab_http_status
(
302
)
expect
(
flash
[
:notice
]).
to
eq
(
"Pipelines settings for '
#{
project
.
name
}
' were successfully updated."
)
expect
(
flash
[
:notice
]).
to
eq
(
"Pipelines settings for '
#{
project
.
name
}
' were successfully updated."
)
end
end
...
@@ -33,11 +36,32 @@ describe Projects::PipelinesSettingsController do
...
@@ -33,11 +36,32 @@ describe Projects::PipelinesSettingsController do
let
(
:params
)
{
{
enabled:
''
}
}
let
(
:params
)
{
{
enabled:
''
}
}
it
'allows enabled to be set to nil'
do
it
'allows enabled to be set to nil'
do
subject
project_auto_devops
.
reload
project_auto_devops
.
reload
expect
(
project_auto_devops
.
enabled
).
to
be_nil
expect
(
project_auto_devops
.
enabled
).
to
be_nil
end
end
end
end
context
'when run_auto_devops_pipeline is true'
do
let
(
:auto_devops_pipeline
)
{
'true'
}
it
'queues a CreatePipelineWorker'
do
expect
(
CreatePipelineWorker
).
to
receive
(
:perform_async
).
with
(
project
.
id
,
user
.
id
,
project
.
default_branch
,
:web
,
any_args
)
subject
end
end
context
'when run_auto_devops_pipeline is not true'
do
let
(
:auto_devops_pipeline
)
{
'false'
}
it
'does not queue a CreatePipelineWorker'
do
expect
(
CreatePipelineWorker
).
not_to
receive
(
:perform_async
).
with
(
project
.
id
,
user
.
id
,
:web
,
any_args
)
subject
end
end
end
end
end
end
end
end
spec/helpers/auto_devops_helper_spec.rb
View file @
a4a389a0
...
@@ -82,4 +82,104 @@ describe AutoDevopsHelper do
...
@@ -82,4 +82,104 @@ describe AutoDevopsHelper do
it
{
is_expected
.
to
eq
(
false
)
}
it
{
is_expected
.
to
eq
(
false
)
}
end
end
end
end
describe
'.show_run_auto_devops_pipeline_checkbox_for_instance_setting?'
do
subject
{
helper
.
show_run_auto_devops_pipeline_checkbox_for_instance_setting?
(
project
)
}
context
'when master contains a .gitlab-ci.yml file'
do
before
do
allow
(
project
.
repository
).
to
receive
(
:gitlab_ci_yml
).
and_return
(
"script: ['test']"
)
end
it
{
is_expected
.
to
eq
(
false
)
}
end
context
'when auto devops is explicitly enabled'
do
before
do
project
.
create_auto_devops!
(
enabled:
true
)
end
it
{
is_expected
.
to
eq
(
false
)
}
end
context
'when auto devops is explicitly disabled'
do
before
do
project
.
create_auto_devops!
(
enabled:
false
)
end
context
'when auto devops is enabled system-wide'
do
before
do
stub_application_setting
(
auto_devops_enabled:
true
)
end
it
{
is_expected
.
to
eq
(
true
)
}
end
context
'when auto devops is disabled system-wide'
do
before
do
stub_application_setting
(
auto_devops_enabled:
false
)
end
it
{
is_expected
.
to
eq
(
false
)
}
end
end
context
'when auto devops is set to instance setting'
do
before
do
project
.
create_auto_devops!
(
enabled:
nil
)
end
it
{
is_expected
.
to
eq
(
false
)
}
end
end
describe
'.show_run_auto_devops_pipeline_checkbox_for_explicit_setting?'
do
subject
{
helper
.
show_run_auto_devops_pipeline_checkbox_for_explicit_setting?
(
project
)
}
context
'when master contains a .gitlab-ci.yml file'
do
before
do
allow
(
project
.
repository
).
to
receive
(
:gitlab_ci_yml
).
and_return
(
"script: ['test']"
)
end
it
{
is_expected
.
to
eq
(
false
)
}
end
context
'when auto devops is explicitly enabled'
do
before
do
project
.
create_auto_devops!
(
enabled:
true
)
end
it
{
is_expected
.
to
eq
(
false
)
}
end
context
'when auto devops is explicitly disabled'
do
before
do
project
.
create_auto_devops!
(
enabled:
false
)
end
it
{
is_expected
.
to
eq
(
true
)
}
end
context
'when auto devops is set to instance setting'
do
before
do
project
.
create_auto_devops!
(
enabled:
nil
)
end
context
'when auto devops is enabled system-wide'
do
before
do
stub_application_setting
(
auto_devops_enabled:
true
)
end
it
{
is_expected
.
to
eq
(
false
)
}
end
context
'when auto devops is disabled system-wide'
do
before
do
stub_application_setting
(
auto_devops_enabled:
false
)
end
it
{
is_expected
.
to
eq
(
true
)
}
end
end
end
end
end
spec/services/projects/update_service_spec.rb
View file @
a4a389a0
require
'spec_helper'
require
'spec_helper'
describe
Projects
::
UpdateService
,
'#execute'
do
describe
Projects
::
UpdateService
do
include
ProjectForksHelper
include
ProjectForksHelper
let
(
:gitlab_shell
)
{
Gitlab
::
Shell
.
new
}
let
(
:user
)
{
create
(
:user
)
}
let
(
:user
)
{
create
(
:user
)
}
let
(
:admin
)
{
create
(
:admin
)
}
let
(
:project
)
do
let
(
:project
)
do
create
(
:project
,
creator:
user
,
namespace:
user
.
namespace
)
create
(
:project
,
creator:
user
,
namespace:
user
.
namespace
)
end
end
describe
'#execute'
do
let
(
:gitlab_shell
)
{
Gitlab
::
Shell
.
new
}
let
(
:admin
)
{
create
(
:admin
)
}
context
'when changing visibility level'
do
context
'when changing visibility level'
do
context
'when visibility_level is INTERNAL'
do
context
'when visibility_level is INTERNAL'
do
it
'updates the project to internal'
do
it
'updates the project to internal'
do
...
@@ -195,6 +196,29 @@ describe Projects::UpdateService, '#execute' do
...
@@ -195,6 +196,29 @@ describe Projects::UpdateService, '#execute' do
})
})
end
end
end
end
end
describe
'#run_auto_devops_pipeline?'
do
subject
{
described_class
.
new
(
project
,
user
,
params
).
run_auto_devops_pipeline?
}
context
'when neither pipeline setting is true'
do
let
(
:params
)
{
{}
}
it
{
is_expected
.
to
eq
(
false
)
}
end
context
'when run_auto_devops_pipeline_explicit is true'
do
let
(
:params
)
{
{
run_auto_devops_pipeline_explicit:
'true'
}
}
it
{
is_expected
.
to
eq
(
true
)
}
end
context
'when run_auto_devops_pipeline_implicit is true'
do
let
(
:params
)
{
{
run_auto_devops_pipeline_implicit:
'true'
}
}
it
{
is_expected
.
to
eq
(
true
)
}
end
end
def
update_project
(
project
,
user
,
opts
)
def
update_project
(
project
,
user
,
opts
)
described_class
.
new
(
project
,
user
,
opts
).
execute
described_class
.
new
(
project
,
user
,
opts
).
execute
...
...
spec/workers/create_pipeline_worker_spec.rb
0 → 100644
View file @
a4a389a0
require
'spec_helper'
describe
CreatePipelineWorker
do
describe
'#perform'
do
let
(
:worker
)
{
described_class
.
new
}
context
'when a project not found'
do
it
'does not call the Service'
do
expect
(
Ci
::
CreatePipelineService
).
not_to
receive
(
:new
)
expect
{
worker
.
perform
(
99
,
create
(
:user
).
id
,
'master'
,
:web
)
}.
to
raise_error
(
ActiveRecord
::
RecordNotFound
)
end
end
context
'when a user not found'
do
let
(
:project
)
{
create
(
:project
)
}
it
'does not call the Service'
do
expect
(
Ci
::
CreatePipelineService
).
not_to
receive
(
:new
)
expect
{
worker
.
perform
(
project
.
id
,
99
,
project
.
default_branch
,
:web
)
}.
to
raise_error
(
ActiveRecord
::
RecordNotFound
)
end
end
context
'when everything is ok'
do
let
(
:project
)
{
create
(
:project
)
}
let
(
:user
)
{
create
(
:user
)
}
let
(
:create_pipeline_service
)
{
instance_double
(
Ci
::
CreatePipelineService
)
}
it
'calls the Service'
do
expect
(
Ci
::
CreatePipelineService
).
to
receive
(
:new
).
with
(
project
,
user
,
ref:
project
.
default_branch
).
and_return
(
create_pipeline_service
)
expect
(
create_pipeline_service
).
to
receive
(
:execute
).
with
(
:web
,
any_args
)
worker
.
perform
(
project
.
id
,
user
.
id
,
project
.
default_branch
,
:web
)
end
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment