Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
GitLab
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
projects.thm.de
GitLab
Commits
ad3be46b
Commit
ad3be46b
authored
Dec 08, 2017
by
Kamil Trzcinski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implement and use Gitlab::Ci::Pipeline::Chain::Command
parent
b30e0e06
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
146 additions
and
127 deletions
+146
-127
app/services/ci/create_pipeline_service.rb
app/services/ci/create_pipeline_service.rb
+13
-12
lib/gitlab/ci/pipeline/chain/base.rb
lib/gitlab/ci/pipeline/chain/base.rb
+3
-4
lib/gitlab/ci/pipeline/chain/build.rb
lib/gitlab/ci/pipeline/chain/build.rb
+7
-37
lib/gitlab/ci/pipeline/chain/command.rb
lib/gitlab/ci/pipeline/chain/command.rb
+65
-0
lib/gitlab/ci/pipeline/chain/helpers.rb
lib/gitlab/ci/pipeline/chain/helpers.rb
+0
-18
lib/gitlab/ci/pipeline/chain/validate/abilities.rb
lib/gitlab/ci/pipeline/chain/validate/abilities.rb
+6
-6
lib/gitlab/ci/pipeline/chain/validate/repository.rb
lib/gitlab/ci/pipeline/chain/validate/repository.rb
+2
-5
spec/lib/gitlab/ci/pipeline/chain/build_spec.rb
spec/lib/gitlab/ci/pipeline/chain/build_spec.rb
+21
-19
spec/lib/gitlab/ci/pipeline/chain/create_spec.rb
spec/lib/gitlab/ci/pipeline/chain/create_spec.rb
+3
-3
spec/lib/gitlab/ci/pipeline/chain/sequence_spec.rb
spec/lib/gitlab/ci/pipeline/chain/sequence_spec.rb
+1
-1
spec/lib/gitlab/ci/pipeline/chain/skip_spec.rb
spec/lib/gitlab/ci/pipeline/chain/skip_spec.rb
+5
-4
spec/lib/gitlab/ci/pipeline/chain/validate/abilities_spec.rb
spec/lib/gitlab/ci/pipeline/chain/validate/abilities_spec.rb
+3
-2
spec/lib/gitlab/ci/pipeline/chain/validate/config_spec.rb
spec/lib/gitlab/ci/pipeline/chain/validate/config_spec.rb
+4
-3
spec/lib/gitlab/ci/pipeline/chain/validate/repository_spec.rb
.../lib/gitlab/ci/pipeline/chain/validate/repository_spec.rb
+13
-13
No files found.
app/services/ci/create_pipeline_service.rb
View file @
ad3be46b
...
...
@@ -12,18 +12,19 @@ class CreatePipelineService < BaseService
def
execute
(
source
,
ignore_skip_ci:
false
,
save_on_errors:
true
,
trigger_request:
nil
,
schedule:
nil
,
&
block
)
@pipeline
=
Ci
::
Pipeline
.
new
command
=
OpenStruct
.
new
(
source:
source
,
origin_ref:
params
[
:ref
],
checkout_sha:
params
[
:checkout_sha
],
after_sha:
params
[
:after
],
before_sha:
params
[
:before
],
trigger_request:
trigger_request
,
schedule:
schedule
,
ignore_skip_ci:
ignore_skip_ci
,
save_incompleted:
save_on_errors
,
seeds_block:
block
,
project:
project
,
current_user:
current_user
)
command
=
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Command
.
new
(
source:
source
,
origin_ref:
params
[
:ref
],
checkout_sha:
params
[
:checkout_sha
],
after_sha:
params
[
:after
],
before_sha:
params
[
:before
],
trigger_request:
trigger_request
,
schedule:
schedule
,
ignore_skip_ci:
ignore_skip_ci
,
save_incompleted:
save_on_errors
,
seeds_block:
block
,
project:
project
,
current_user:
current_user
)
sequence
=
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Sequence
.
new
(
pipeline
,
command
,
SEQUENCE
)
...
...
lib/gitlab/ci/pipeline/chain/base.rb
View file @
ad3be46b
...
...
@@ -3,14 +3,13 @@ module Ci
module
Pipeline
module
Chain
class
Base
attr_reader
:pipeline
,
:project
,
:current_user
attr_reader
:pipeline
,
:command
delegate
:project
,
:current_user
,
to: :command
def
initialize
(
pipeline
,
command
)
@pipeline
=
pipeline
@command
=
command
@project
=
command
.
project
@current_user
=
command
.
current_user
end
def
perform!
...
...
lib/gitlab/ci/pipeline/chain/build.rb
View file @
ad3be46b
...
...
@@ -6,15 +6,15 @@ class Build < Chain::Base
def
perform!
@pipeline
.
assign_attributes
(
source:
@command
.
source
,
project:
@project
,
ref:
ref
,
sha:
sha
,
before_sha:
before_sha
,
tag:
tag_exists?
,
project:
@
command
.
project
,
ref:
@command
.
ref
,
sha:
@command
.
sha
,
before_sha:
@command
.
before_sha
,
tag:
@command
.
tag_exists?
,
trigger_requests:
Array
(
@command
.
trigger_request
),
user:
@current_user
,
user:
@c
ommand
.
c
urrent_user
,
pipeline_schedule:
@command
.
schedule
,
protected:
protected_ref?
protected:
@command
.
protected_ref?
)
@pipeline
.
set_config_source
...
...
@@ -23,36 +23,6 @@ def perform!
def
break?
false
end
private
def
ref
@ref
||=
Gitlab
::
Git
.
ref_name
(
origin_ref
)
end
def
sha
@project
.
commit
(
origin_sha
||
origin_ref
).
try
(
:id
)
end
def
origin_ref
@command
.
origin_ref
end
def
origin_sha
@command
.
checkout_sha
||
@command
.
after_sha
end
def
before_sha
@command
.
checkout_sha
||
@command
.
before_sha
||
Gitlab
::
Git
::
BLANK_SHA
end
def
protected_ref?
@project
.
protected_for?
(
ref
)
end
def
tag_exists?
project
.
repository
.
tag_exists?
(
ref
)
end
end
end
end
...
...
lib/gitlab/ci/pipeline/chain/command.rb
0 → 100644
View file @
ad3be46b
module
Gitlab
module
Ci
module
Pipeline
module
Chain
Command
=
Struct
.
new
(
:source
,
:project
,
:current_user
,
:origin_ref
,
:checkout_sha
,
:after_sha
,
:before_sha
,
:trigger_request
,
:schedule
,
:ignore_skip_ci
,
:save_incompleted
,
:seeds_block
)
do
include
Gitlab
::
Utils
::
StrongMemoize
def
initialize
(
**
params
)
params
.
each
do
|
key
,
value
|
self
[
key
]
=
value
end
end
def
branch_exists?
strong_memoize
(
:is_branch
)
do
project
.
repository
.
branch_exists?
(
ref
)
end
end
def
tag_exists?
strong_memoize
(
:is_tag
)
do
project
.
repository
.
tag_exists?
(
ref
)
end
end
def
ref
strong_memoize
(
:ref
)
do
Gitlab
::
Git
.
ref_name
(
origin_ref
)
end
end
def
sha
strong_memoize
(
:sha
)
do
project
.
commit
(
origin_sha
||
origin_ref
).
try
(
:id
)
end
end
def
origin_sha
checkout_sha
||
after_sha
end
def
before_sha
checkout_sha
||
before_sha
||
Gitlab
::
Git
::
BLANK_SHA
end
def
protected_ref?
strong_memoize
(
:protected_ref
)
do
project
.
protected_for?
(
ref
)
end
end
def
error
(
message
)
pipeline
.
errors
.
add
(
:base
,
message
)
end
end
end
end
end
end
lib/gitlab/ci/pipeline/chain/helpers.rb
View file @
ad3be46b
...
...
@@ -3,24 +3,6 @@ module Ci
module
Pipeline
module
Chain
module
Helpers
include
Gitlab
::
Utils
::
StrongMemoize
def
branch_exists?
strong_memoize
(
:is_branch
)
do
raise
ArgumentError
unless
pipeline
.
ref
project
.
repository
.
branch_exists?
(
pipeline
.
ref
)
end
end
def
tag_exists?
strong_memoize
(
:is_tag
)
do
raise
ArgumentError
unless
pipeline
.
ref
project
.
repository
.
tag_exists?
(
pipeline
.
ref
)
end
end
def
error
(
message
)
pipeline
.
errors
.
add
(
:base
,
message
)
end
...
...
lib/gitlab/ci/pipeline/chain/validate/abilities.rb
View file @
ad3be46b
...
...
@@ -14,7 +14,7 @@ def perform!
unless
allowed_to_trigger_pipeline?
if
can?
(
current_user
,
:create_pipeline
,
project
)
return
error
(
"Insufficient permissions for protected ref '
#{
pipeline
.
ref
}
'"
)
return
error
(
"Insufficient permissions for protected ref '
#{
command
.
ref
}
'"
)
else
return
error
(
'Insufficient permissions to create a new pipeline'
)
end
...
...
@@ -29,7 +29,7 @@ def allowed_to_trigger_pipeline?
if
current_user
allowed_to_create?
else
# legacy triggers don't have a corresponding user
!
project
.
protected_for?
(
@pipeline
.
ref
)
!
@command
.
protected_ref?
end
end
...
...
@@ -38,10 +38,10 @@ def allowed_to_create?
access
=
Gitlab
::
UserAccess
.
new
(
current_user
,
project:
project
)
if
branch_exists?
access
.
can_update_branch?
(
@
pipeline
.
ref
)
elsif
tag_exists?
access
.
can_create_tag?
(
@
pipeline
.
ref
)
if
@command
.
branch_exists?
access
.
can_update_branch?
(
@
command
.
ref
)
elsif
@command
.
tag_exists?
access
.
can_create_tag?
(
@
command
.
ref
)
else
true
# Allow it for now and we'll reject when we check ref existence
end
...
...
lib/gitlab/ci/pipeline/chain/validate/repository.rb
View file @
ad3be46b
...
...
@@ -7,14 +7,11 @@ class Repository < Chain::Base
include
Chain
::
Helpers
def
perform!
unless
branch_exists?
||
tag_exists?
unless
@command
.
branch_exists?
||
@command
.
tag_exists?
return
error
(
'Reference not found'
)
end
## TODO, we check commit in the service, that is why
# there is no repository access here.
#
unless
pipeline
.
sha
unless
@command
.
sha
return
error
(
'Commit not found'
)
end
end
...
...
spec/lib/gitlab/ci/pipeline/chain/build_spec.rb
View file @
ad3be46b
...
...
@@ -6,15 +6,16 @@
let
(
:pipeline
)
{
Ci
::
Pipeline
.
new
}
let
(
:command
)
do
double
(
'command'
,
source: :push
,
origin_ref:
'master'
,
checkout_sha:
project
.
commit
.
id
,
after_sha:
nil
,
before_sha:
nil
,
trigger_request:
nil
,
schedule:
nil
,
project:
project
,
current_user:
user
)
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Command
.
new
(
source: :push
,
origin_ref:
'master'
,
checkout_sha:
project
.
commit
.
id
,
after_sha:
nil
,
before_sha:
nil
,
trigger_request:
nil
,
schedule:
nil
,
project:
project
,
current_user:
user
)
end
let
(
:step
)
{
described_class
.
new
(
pipeline
,
command
)
}
...
...
@@ -60,19 +61,20 @@
context
'when pipeline is running for a tag'
do
let
(
:command
)
do
double
(
'command'
,
source: :push
,
origin_ref:
'mytag'
,
checkout_sha:
project
.
commit
.
id
,
after_sha:
nil
,
before_sha:
nil
,
trigger_request:
nil
,
schedule:
nil
,
project:
project
,
current_user:
user
)
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Command
.
new
(
source: :push
,
origin_ref:
'mytag'
,
checkout_sha:
project
.
commit
.
id
,
after_sha:
nil
,
before_sha:
nil
,
trigger_request:
nil
,
schedule:
nil
,
project:
project
,
current_user:
user
)
end
before
do
allow
(
step
).
to
receive
(
:tag_exists?
).
and_return
(
true
)
allow
_any_instance_of
(
Repository
).
to
receive
(
:tag_exists?
).
with
(
'mytag'
).
and_return
(
true
)
step
.
perform!
end
...
...
spec/lib/gitlab/ci/pipeline/chain/create_spec.rb
View file @
ad3be46b
...
...
@@ -10,9 +10,9 @@
end
let
(
:command
)
do
double
(
'command'
,
project:
project
,
current_user:
user
,
seeds_block:
nil
)
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Command
.
new
(
project:
project
,
current_user:
user
,
seeds_block:
nil
)
end
let
(
:step
)
{
described_class
.
new
(
pipeline
,
command
)
}
...
...
spec/lib/gitlab/ci/pipeline/chain/sequence_spec.rb
View file @
ad3be46b
...
...
@@ -5,7 +5,7 @@
set
(
:user
)
{
create
(
:user
)
}
let
(
:pipeline
)
{
build_stubbed
(
:ci_pipeline
)
}
let
(
:command
)
{
double
(
'command'
)
}
let
(
:command
)
{
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Command
.
new
}
let
(
:first_step
)
{
spy
(
'first step'
)
}
let
(
:second_step
)
{
spy
(
'second step'
)
}
let
(
:sequence
)
{
[
first_step
,
second_step
]
}
...
...
spec/lib/gitlab/ci/pipeline/chain/skip_spec.rb
View file @
ad3be46b
...
...
@@ -6,10 +6,11 @@
set
(
:pipeline
)
{
create
(
:ci_pipeline
,
project:
project
)
}
let
(
:command
)
do
double
(
'command'
,
project:
project
,
current_user:
user
,
ignore_skip_ci:
false
,
save_incompleted:
true
)
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Command
.
new
(
project:
project
,
current_user:
user
,
ignore_skip_ci:
false
,
save_incompleted:
true
)
end
let
(
:step
)
{
described_class
.
new
(
pipeline
,
command
)
}
...
...
spec/lib/gitlab/ci/pipeline/chain/validate/abilities_spec.rb
View file @
ad3be46b
...
...
@@ -5,11 +5,12 @@
set
(
:user
)
{
create
(
:user
)
}
let
(
:pipeline
)
do
build_stubbed
(
:ci_pipeline
,
ref:
ref
,
project:
project
)
build_stubbed
(
:ci_pipeline
,
project:
project
)
end
let
(
:command
)
do
double
(
'command'
,
project:
project
,
current_user:
user
)
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Command
.
new
(
project:
project
,
current_user:
user
,
origin_ref:
ref
)
end
let
(
:step
)
{
described_class
.
new
(
pipeline
,
command
)
}
...
...
spec/lib/gitlab/ci/pipeline/chain/validate/config_spec.rb
View file @
ad3be46b
...
...
@@ -5,9 +5,10 @@
set
(
:user
)
{
create
(
:user
)
}
let
(
:command
)
do
double
(
'command'
,
project:
project
,
current_user:
user
,
save_incompleted:
true
)
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Command
.
new
(
project:
project
,
current_user:
user
,
save_incompleted:
true
)
end
let!
(
:step
)
{
described_class
.
new
(
pipeline
,
command
)
}
...
...
spec/lib/gitlab/ci/pipeline/chain/validate/repository_spec.rb
View file @
ad3be46b
...
...
@@ -3,10 +3,7 @@
describe
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Validate
::
Repository
do
set
(
:project
)
{
create
(
:project
,
:repository
)
}
set
(
:user
)
{
create
(
:user
)
}
let
(
:command
)
do
double
(
'command'
,
project:
project
,
current_user:
user
)
end
let
(
:pipeline
)
{
build_stubbed
(
:ci_pipeline
)
}
let!
(
:step
)
{
described_class
.
new
(
pipeline
,
command
)
}
...
...
@@ -14,9 +11,10 @@
step
.
perform!
end
context
'when pipeline ref and sha exists'
do
let
(
:pipeline
)
do
build_stubbed
(
:ci_pipeline
,
ref:
'master'
,
sha:
'123'
,
project:
project
)
context
'when ref and sha exists'
do
let
(
:command
)
do
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Command
.
new
(
project:
project
,
current_user:
user
,
origin_ref:
'master'
,
checkout_sha:
project
.
commit
.
id
)
end
it
'does not break the chain'
do
...
...
@@ -28,9 +26,10 @@
end
end
context
'when pipeline ref does not exist'
do
let
(
:pipeline
)
do
build_stubbed
(
:ci_pipeline
,
ref:
'something'
,
project:
project
)
context
'when ref does not exist'
do
let
(
:command
)
do
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Command
.
new
(
project:
project
,
current_user:
user
,
origin_ref:
'something'
)
end
it
'breaks the chain'
do
...
...
@@ -43,9 +42,10 @@
end
end
context
'when pipeline does not have SHA set'
do
let
(
:pipeline
)
do
build_stubbed
(
:ci_pipeline
,
ref:
'master'
,
sha:
nil
,
project:
project
)
context
'when does not have existing SHA set'
do
let
(
:command
)
do
Gitlab
::
Ci
::
Pipeline
::
Chain
::
Command
.
new
(
project:
project
,
current_user:
user
,
origin_ref:
'master'
,
checkout_sha:
'something'
)
end
it
'breaks the chain'
do
...
...
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