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
0
Merge Requests
0
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
Boxiang Sun
gitlab-ce
Commits
fe0b2f81
Commit
fe0b2f81
authored
Jun 02, 2017
by
Grzegorz Bizon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refine implementation of pipeline stage seeds
parent
aa0d6b07
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
172 additions
and
205 deletions
+172
-205
app/models/ci/pipeline.rb
app/models/ci/pipeline.rb
+8
-11
app/models/ci/stage.rb
app/models/ci/stage.rb
+11
-0
app/models/commit_status.rb
app/models/commit_status.rb
+2
-2
app/services/ci/create_pipeline_service.rb
app/services/ci/create_pipeline_service.rb
+1
-1
app/services/ci/create_pipeline_stages_service.rb
app/services/ci/create_pipeline_stages_service.rb
+13
-38
lib/ci/gitlab_ci_yaml_processor.rb
lib/ci/gitlab_ci_yaml_processor.rb
+9
-6
lib/gitlab/ci/stage/seed.rb
lib/gitlab/ci/stage/seed.rb
+49
-0
lib/gitlab/ci/stage/seeds.rb
lib/gitlab/ci/stage/seeds.rb
+0
-62
spec/lib/ci/gitlab_ci_yaml_processor_spec.rb
spec/lib/ci/gitlab_ci_yaml_processor_spec.rb
+18
-12
spec/lib/gitlab/ci/stage/seed_spec.rb
spec/lib/gitlab/ci/stage/seed_spec.rb
+54
-0
spec/lib/gitlab/ci/stage/seeds_spec.rb
spec/lib/gitlab/ci/stage/seeds_spec.rb
+0
-66
spec/models/ci/pipeline_spec.rb
spec/models/ci/pipeline_spec.rb
+7
-7
No files found.
app/models/ci/pipeline.rb
View file @
fe0b2f81
...
@@ -11,9 +11,7 @@ module Ci
...
@@ -11,9 +11,7 @@ module Ci
belongs_to
:auto_canceled_by
,
class_name:
'Ci::Pipeline'
belongs_to
:auto_canceled_by
,
class_name:
'Ci::Pipeline'
belongs_to
:pipeline_schedule
,
class_name:
'Ci::PipelineSchedule'
belongs_to
:pipeline_schedule
,
class_name:
'Ci::PipelineSchedule'
has_many
:auto_canceled_pipelines
,
class_name:
'Ci::Pipeline'
,
foreign_key:
'auto_canceled_by_id'
has_many
:stages
has_many
:auto_canceled_jobs
,
class_name:
'CommitStatus'
,
foreign_key:
'auto_canceled_by_id'
has_many
:statuses
,
class_name:
'CommitStatus'
,
foreign_key: :commit_id
has_many
:statuses
,
class_name:
'CommitStatus'
,
foreign_key: :commit_id
has_many
:builds
,
foreign_key: :commit_id
has_many
:builds
,
foreign_key: :commit_id
has_many
:trigger_requests
,
dependent: :destroy
,
foreign_key: :commit_id
has_many
:trigger_requests
,
dependent: :destroy
,
foreign_key: :commit_id
...
@@ -28,6 +26,9 @@ module Ci
...
@@ -28,6 +26,9 @@ module Ci
has_many
:manual_actions
,
->
{
latest
.
manual_actions
},
foreign_key: :commit_id
,
class_name:
'Ci::Build'
has_many
:manual_actions
,
->
{
latest
.
manual_actions
},
foreign_key: :commit_id
,
class_name:
'Ci::Build'
has_many
:artifacts
,
->
{
latest
.
with_artifacts_not_expired
},
foreign_key: :commit_id
,
class_name:
'Ci::Build'
has_many
:artifacts
,
->
{
latest
.
with_artifacts_not_expired
},
foreign_key: :commit_id
,
class_name:
'Ci::Build'
has_many
:auto_canceled_pipelines
,
class_name:
'Ci::Pipeline'
,
foreign_key:
'auto_canceled_by_id'
has_many
:auto_canceled_jobs
,
class_name:
'CommitStatus'
,
foreign_key:
'auto_canceled_by_id'
delegate
:id
,
to: :project
,
prefix:
true
delegate
:id
,
to: :project
,
prefix:
true
validates
:sha
,
presence:
{
unless: :importing?
}
validates
:sha
,
presence:
{
unless: :importing?
}
...
@@ -296,17 +297,13 @@ module Ci
...
@@ -296,17 +297,13 @@ module Ci
end
end
def
stage_seeds
def
stage_seeds
return
unless
config_processor
return
[]
unless
config_processor
seeds_scope
=
{
ref:
ref
,
tag:
tag?
,
trigger:
trigger_requests
.
first
}
@seeds
||=
config_processor
.
stage_seeds
(
seeds_scope
).
tap
do
|
seeds
|
@stage_seeds
||=
config_processor
.
stage_seeds
(
self
)
seeds
.
pipeline
=
self
end
end
end
def
has_stages?
def
has_stage
_seed
s?
stage_seeds
&
.
has_stages
?
stage_seeds
.
any
?
end
end
def
has_warnings?
def
has_warnings?
...
...
app/models/ci/stage.rb
0 → 100644
View file @
fe0b2f81
module
Ci
class
Stage
<
ActiveRecord
::
Base
extend
Ci
::
Model
belongs_to
:project
belongs_to
:pipeline
has_many
:statuses
,
class_name:
'CommitStatus'
,
foreign_key: :commit_id
has_many
:builds
,
foreign_key: :commit_id
end
end
app/models/commit_status.rb
View file @
fe0b2f81
...
@@ -5,10 +5,10 @@ class CommitStatus < ActiveRecord::Base
...
@@ -5,10 +5,10 @@ class CommitStatus < ActiveRecord::Base
self
.
table_name
=
'ci_builds'
self
.
table_name
=
'ci_builds'
belongs_to
:user
belongs_to
:project
belongs_to
:project
belongs_to
:pipeline
,
class_name:
'Ci::Pipeline'
,
foreign_key: :commit_id
belongs_to
:pipeline
,
class_name:
'Ci::Pipeline'
,
foreign_key: :commit_id
belongs_to
:auto_canceled_by
,
class_name:
'Ci::Pipeline'
belongs_to
:auto_canceled_by
,
class_name:
'Ci::Pipeline'
belongs_to
:user
delegate
:commit
,
to: :pipeline
delegate
:commit
,
to: :pipeline
delegate
:sha
,
:short_sha
,
to: :pipeline
delegate
:sha
,
:short_sha
,
to: :pipeline
...
...
app/services/ci/create_pipeline_service.rb
View file @
fe0b2f81
...
@@ -42,7 +42,7 @@ module Ci
...
@@ -42,7 +42,7 @@ module Ci
return
pipeline
return
pipeline
end
end
unless
pipeline
.
has_stage
s?
if
pipeline
.
has_stage_seed
s?
return
error
(
'No stages / jobs for this pipeline.'
)
return
error
(
'No stages / jobs for this pipeline.'
)
end
end
...
...
app/services/ci/create_pipeline_stages_service.rb
View file @
fe0b2f81
module
Ci
module
Ci
class
CreatePipelineStagesService
<
BaseService
class
CreatePipelineStagesService
<
BaseService
attr_reader
:pipeline
def
execute
(
pipeline
)
def
execute
(
pipeline
)
@pipeline
=
pipeline
pipeline
.
stage_seeds
.
each
do
|
seed
|
seed
.
user
=
current_user
new_builds
.
map
do
|
build_attributes
|
create_build
(
build_attributes
)
end
end
delegate
:project
,
to: :pipeline
private
def
create_build
(
build_attributes
)
build_attributes
=
build_attributes
.
merge
(
pipeline:
pipeline
,
project:
project
,
ref:
pipeline
.
ref
,
tag:
pipeline
.
tag
,
user:
current_user
,
trigger_request:
trigger_request
)
build
=
pipeline
.
builds
.
create
(
build_attributes
)
seed
.
create!
do
|
build
|
##
# Create the environment before the build starts. This sets its slug and
# Create the environment before the build starts. This sets its slug and
# makes it available as an environment variable
# makes it available as an environment variable
project
.
environments
.
find_or_create_by
(
name:
build
.
expanded_environment_name
)
if
#
build
.
has_environment?
if
build
.
has_environment?
environment_name
=
build
.
expanded_environment_name
build
project
.
environments
.
find_or_create_by
(
name:
environment_name
)
end
end
end
def
new_builds
@new_builds
||=
pipeline
.
config_builds_attributes
end
end
def
trigger_request
@trigger_request
||=
pipeline
.
trigger_requests
.
first
end
end
end
end
end
end
lib/ci/gitlab_ci_yaml_processor.rb
View file @
fe0b2f81
...
@@ -50,14 +50,17 @@ module Ci
...
@@ -50,14 +50,17 @@ module Ci
end
end
end
end
def
stage_seeds
(
ref
:,
tag:
false
,
trigger:
nil
)
def
stage_seeds
(
pipeline
)
Gitlab
::
Ci
::
Stage
::
Seeds
.
new
.
tap
do
|
seeds
|
trigger_request
=
pipeline
.
trigger_requests
.
first
@stages
.
uniq
.
each
do
|
stage
|
builds
=
builds_for_stage_and_ref
(
stage
,
ref
,
tag
,
trigger
)
seeds
.
append_stage
(
stage
,
builds
)
if
builds
.
any?
seeds
=
@stages
.
uniq
.
map
do
|
stage
|
end
builds
=
builds_for_stage_and_ref
(
stage
,
pipeline
.
ref
,
pipeline
.
tag?
,
trigger_request
)
Gitlab
::
Ci
::
Stage
::
Seed
.
new
(
pipeline
,
stage
,
builds
)
if
builds
.
any?
end
end
seeds
.
compact
end
end
def
build_attributes
(
name
)
def
build_attributes
(
name
)
...
...
lib/gitlab/ci/stage/seed.rb
0 → 100644
View file @
fe0b2f81
module
Gitlab
module
Ci
module
Stage
class
Seed
attr_reader
:pipeline
delegate
:project
,
to: :pipeline
def
initialize
(
pipeline
,
stage
,
jobs
)
@pipeline
=
pipeline
@stage
=
{
name:
stage
}
@jobs
=
jobs
.
to_a
.
dup
end
def
user
=
(
current_user
)
@jobs
.
map!
do
|
attributes
|
attributes
.
merge
(
user:
current_user
)
end
end
def
stage
@stage
.
merge
(
project:
project
)
end
def
builds
trigger
=
pipeline
.
trigger_requests
.
first
@jobs
.
map
do
|
attributes
|
attributes
.
merge
(
project:
project
,
ref:
pipeline
.
ref
,
tag:
pipeline
.
tag
,
trigger_request:
trigger
)
end
end
def
create!
pipeline
.
stages
.
create!
(
stage
).
tap
do
|
stage
|
builds_attributes
=
builds
.
map
do
|
attributes
|
attributes
.
merge
(
stage_id:
stage
.
id
)
end
pipeline
.
builds
.
create!
(
builds_attributes
).
each
do
|
build
|
yield
build
if
block_given?
end
end
end
end
end
end
end
lib/gitlab/ci/stage/seeds.rb
deleted
100644 → 0
View file @
aa0d6b07
module
Gitlab
module
Ci
module
Stage
class
Seeds
Seed
=
Struct
.
new
(
:stage
,
:jobs
)
def
initialize
@stages
=
[]
end
def
has_stages?
@stages
.
any?
end
def
stages
@stages
.
map
(
&
:stage
)
end
def
jobs
@stages
.
map
(
&
:jobs
).
flatten
end
def
append_stage
(
stage
,
jobs
)
@stages
<<
Seed
.
new
({
name:
stage
},
jobs
)
end
def
pipeline
=
(
pipeline
)
trigger_request
=
pipeline
.
trigger_requests
.
first
stages
.
each
do
|
attributes
|
attributes
.
merge!
(
pipeline:
pipeline
,
project:
pipeline
.
project
,
)
end
jobs
.
each
do
|
attributes
|
attributes
.
merge!
(
pipeline:
pipeline
,
project:
pipeline
.
project
,
ref:
pipeline
.
ref
,
tag:
pipeline
.
tag
,
trigger_request:
trigger_request
)
end
end
def
user
=
(
current_user
)
jobs
.
each
do
|
attributes
|
attributes
.
merge!
(
user:
current_user
)
end
end
def
to_attributes
@stages
.
map
do
|
seed
|
seed
.
stage
.
merge
(
builds_attributes:
seed
.
jobs
)
end
end
end
end
end
end
spec/lib/ci/gitlab_ci_yaml_processor_spec.rb
View file @
fe0b2f81
...
@@ -91,15 +91,17 @@ module Ci
...
@@ -91,15 +91,17 @@ module Ci
spinach:
{
stage:
'test'
,
script:
'spinach'
})
spinach:
{
stage:
'test'
,
script:
'spinach'
})
end
end
it
'returns correctly fabricated stage seeds object'
do
let
(
:pipeline
)
{
create
(
:ci_empty_pipeline
)
}
seeds
=
subject
.
stage_seeds
(
ref:
'master'
)
expect
(
seeds
.
stages
.
size
).
to
eq
2
it
'correctly fabricates a stage seeds object'
do
expect
(
seeds
.
stages
.
dig
(
0
,
:name
)).
to
eq
'test'
seeds
=
subject
.
stage_seeds
(
pipeline
)
expect
(
seeds
.
stages
.
dig
(
1
,
:name
)).
to
eq
'deploy'
expect
(
seeds
.
jobs
.
dig
(
0
,
:name
)).
to
eq
'rspec'
expect
(
seeds
.
size
).
to
eq
2
expect
(
seeds
.
jobs
.
dig
(
1
,
:name
)).
to
eq
'spinach'
expect
(
seeds
.
first
.
stage
[
:name
]).
to
eq
'test'
expect
(
seeds
.
jobs
.
dig
(
2
,
:name
)).
to
eq
'production'
expect
(
seeds
.
second
.
stage
[
:name
]).
to
eq
'deploy'
expect
(
seeds
.
first
.
builds
.
dig
(
0
,
:name
)).
to
eq
'rspec'
expect
(
seeds
.
first
.
builds
.
dig
(
1
,
:name
)).
to
eq
'spinach'
expect
(
seeds
.
second
.
builds
.
dig
(
0
,
:name
)).
to
eq
'production'
end
end
end
end
...
@@ -109,12 +111,16 @@ module Ci
...
@@ -109,12 +111,16 @@ module Ci
spinach:
{
stage:
'test'
,
script:
'spinach'
,
only:
[
'tags'
]
})
spinach:
{
stage:
'test'
,
script:
'spinach'
,
only:
[
'tags'
]
})
end
end
let
(
:pipeline
)
do
create
(
:ci_empty_pipeline
,
ref:
'feature'
,
tag:
true
)
end
it
'returns stage seeds only assigned to master to master'
do
it
'returns stage seeds only assigned to master to master'
do
seeds
=
subject
.
stage_seeds
(
ref:
'feature'
,
tag:
tru
e
)
seeds
=
subject
.
stage_seeds
(
pipelin
e
)
expect
(
seeds
.
s
tages
.
s
ize
).
to
eq
1
expect
(
seeds
.
size
).
to
eq
1
expect
(
seeds
.
stages
.
dig
(
0
,
:name
)
).
to
eq
'test'
expect
(
seeds
.
first
.
stage
[
:name
]
).
to
eq
'test'
expect
(
seeds
.
job
s
.
dig
(
0
,
:name
)).
to
eq
'spinach'
expect
(
seeds
.
first
.
build
s
.
dig
(
0
,
:name
)).
to
eq
'spinach'
end
end
end
end
end
end
...
...
spec/lib/gitlab/ci/stage/seed_spec.rb
0 → 100644
View file @
fe0b2f81
require
'spec_helper'
describe
Gitlab
::
Ci
::
Stage
::
Seed
do
let
(
:pipeline
)
{
create
(
:ci_empty_pipeline
)
}
let
(
:builds
)
do
[{
name:
'rspec'
},
{
name:
'spinach'
}]
end
subject
do
described_class
.
new
(
pipeline
,
'test'
,
builds
)
end
describe
'#stage'
do
it
'returns hash attributes of a stage'
do
expect
(
subject
.
stage
).
to
be_a
Hash
expect
(
subject
.
stage
).
to
include
(
:name
,
:project
)
end
end
describe
'#builds'
do
it
'returns hash attributes of all builds'
do
expect
(
subject
.
builds
.
size
).
to
eq
2
expect
(
subject
.
builds
).
to
all
(
include
(
pipeline:
pipeline
))
expect
(
subject
.
builds
).
to
all
(
include
(
project:
pipeline
.
project
))
expect
(
subject
.
builds
).
to
all
(
include
(
ref:
'master'
))
expect
(
subject
.
builds
).
to
all
(
include
(
tag:
false
))
expect
(
subject
.
builds
)
.
to
all
(
include
(
trigger_request:
pipeline
.
trigger_requests
.
first
))
end
end
describe
'#user='
do
let
(
:user
)
{
create
(
:user
)
}
it
'assignes relevant pipeline attributes'
do
subject
.
user
=
user
expect
(
subject
.
builds
).
to
all
(
include
(
user:
user
))
end
end
describe
'#create!'
do
it
'creates all stages and builds'
do
subject
.
create!
expect
(
pipeline
.
reload
.
stages
.
count
).
to
eq
1
expect
(
pipeline
.
reload
.
builds
.
count
).
to
eq
2
expect
(
pipeline
.
builds
).
to
all
(
satisfy
{
|
job
|
job
.
stage_id
.
present?
})
expect
(
pipeline
.
builds
).
to
all
(
satisfy
{
|
job
|
job
.
pipeline
.
present?
})
expect
(
pipeline
.
builds
).
to
all
(
satisfy
{
|
job
|
job
.
project
.
present?
})
end
end
end
spec/lib/gitlab/ci/stage/seeds_spec.rb
deleted
100644 → 0
View file @
aa0d6b07
require
'spec_helper'
describe
Gitlab
::
Ci
::
Stage
::
Seeds
do
before
do
subject
.
append_stage
(
'test'
,
[{
name:
'rspec'
},
{
name:
'spinach'
}])
subject
.
append_stage
(
'deploy'
,
[{
name:
'prod'
,
script:
'cap deploy'
}])
end
describe
'#has_stages?'
do
it
{
is_expected
.
to
have_stages
}
end
describe
'#stages'
do
it
'returns hashes of all stages'
do
expect
(
subject
.
stages
.
size
).
to
eq
2
expect
(
subject
.
stages
).
to
all
(
be_a
Hash
)
end
end
describe
'#jobs'
do
it
'returns all jobs in all stages'
do
expect
(
subject
.
jobs
.
size
).
to
eq
3
end
end
describe
'#pipeline='
do
let
(
:pipeline
)
do
create
(
:ci_empty_pipeline
,
ref:
'feature'
,
tag:
true
)
end
it
'assignes relevant pipeline attributes'
do
trigger_request
=
pipeline
.
trigger_requests
.
first
subject
.
pipeline
=
pipeline
expect
(
subject
.
stages
).
to
all
(
include
(
pipeline:
pipeline
))
expect
(
subject
.
stages
).
to
all
(
include
(
project:
pipeline
.
project
))
expect
(
subject
.
jobs
).
to
all
(
include
(
pipeline:
pipeline
))
expect
(
subject
.
jobs
).
to
all
(
include
(
project:
pipeline
.
project
))
expect
(
subject
.
jobs
).
to
all
(
include
(
ref:
'feature'
))
expect
(
subject
.
jobs
).
to
all
(
include
(
tag:
true
))
expect
(
subject
.
jobs
).
to
all
(
include
(
trigger_request:
trigger_request
))
end
end
describe
'#user='
do
let
(
:user
)
{
create
(
:user
)
}
it
'assignes relevant pipeline attributes'
do
subject
.
user
=
user
expect
(
subject
.
jobs
).
to
all
(
include
(
user:
user
))
end
end
describe
'#to_attributes'
do
it
'exposes stage attributes with nested jobs'
do
attributes
=
[{
name:
'test'
,
builds_attributes:
[{
name:
'rspec'
},
{
name:
'spinach'
}]
},
{
name:
'deploy'
,
builds_attributes:
[{
name:
'prod'
,
script:
'cap deploy'
}]
}]
expect
(
subject
.
to_attributes
).
to
eq
attributes
end
end
end
spec/models/ci/pipeline_spec.rb
View file @
fe0b2f81
...
@@ -208,8 +208,8 @@ describe Ci::Pipeline, models: true do
...
@@ -208,8 +208,8 @@ describe Ci::Pipeline, models: true do
end
end
it
'returns preseeded stage seeds object'
do
it
'returns preseeded stage seeds object'
do
expect
(
pipeline
.
stage_seeds
).
to
be_a
Gitlab
::
Ci
::
Stage
::
Seeds
expect
(
pipeline
.
stage_seeds
).
to
all
(
be_a
Gitlab
::
Ci
::
Stage
::
Seed
)
expect
(
pipeline
.
stage_seeds
.
stages
).
to
all
(
include
(
pipeline:
pipeline
))
expect
(
pipeline
.
stage_seeds
.
count
).
to
eq
1
end
end
end
end
...
@@ -513,17 +513,17 @@ describe Ci::Pipeline, models: true do
...
@@ -513,17 +513,17 @@ describe Ci::Pipeline, models: true do
end
end
end
end
describe
'#has_stages?'
do
describe
'#has_stage
_seeds
s?'
do
context
'when pipeline has stages'
do
context
'when pipeline has stage
seed
s'
do
subject
{
create
(
:ci_pipeline_with_one_job
)
}
subject
{
create
(
:ci_pipeline_with_one_job
)
}
it
{
is_expected
.
to
have_stages
}
it
{
is_expected
.
to
have_stage
_seed
s
}
end
end
context
'when pipeline does not have stages'
do
context
'when pipeline does not have stage
seed
s'
do
subject
{
create
(
:ci_pipeline_without_jobs
)
}
subject
{
create
(
:ci_pipeline_without_jobs
)
}
it
{
is_expected
.
not_to
have_stages
}
it
{
is_expected
.
not_to
have_stage
_seed
s
}
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