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
39bbc387
Commit
39bbc387
authored
Mar 22, 2018
by
Grzegorz Bizon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move policy related specs our of YAML processor tests
Conflicts: spec/models/ci/pipeline_spec.rb
parent
b9ca10b8
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
534 additions
and
580 deletions
+534
-580
lib/gitlab/ci/pipeline/seed/build.rb
lib/gitlab/ci/pipeline/seed/build.rb
+3
-3
lib/gitlab/ci/pipeline/seed/stage.rb
lib/gitlab/ci/pipeline/seed/stage.rb
+8
-2
spec/lib/gitlab/ci/pipeline/chain/populate_spec.rb
spec/lib/gitlab/ci/pipeline/chain/populate_spec.rb
+2
-0
spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
+242
-0
spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb
spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb
+18
-2
spec/lib/gitlab/ci/yaml_processor_spec.rb
spec/lib/gitlab/ci/yaml_processor_spec.rb
+65
-482
spec/models/ci/pipeline_spec.rb
spec/models/ci/pipeline_spec.rb
+196
-91
No files found.
lib/gitlab/ci/pipeline/seed/build.rb
View file @
39bbc387
...
@@ -15,8 +15,6 @@ module Gitlab
...
@@ -15,8 +15,6 @@ module Gitlab
@except
=
attributes
.
delete
(
:except
)
@except
=
attributes
.
delete
(
:except
)
end
end
# TODO find a different solution
#
def
user
=
(
current_user
)
def
user
=
(
current_user
)
@attributes
.
merge!
(
user:
current_user
)
@attributes
.
merge!
(
user:
current_user
)
end
end
...
@@ -43,7 +41,9 @@ module Gitlab
...
@@ -43,7 +41,9 @@ module Gitlab
end
end
def
to_resource
def
to_resource
::
Ci
::
Build
.
new
(
attributes
)
strong_memoize
(
:resource
)
do
::
Ci
::
Build
.
new
(
attributes
)
end
end
end
end
end
end
end
...
...
lib/gitlab/ci/pipeline/seed/stage.rb
View file @
39bbc387
...
@@ -3,7 +3,7 @@ module Gitlab
...
@@ -3,7 +3,7 @@ module Gitlab
module
Pipeline
module
Pipeline
module
Seed
module
Seed
class
Stage
<
Seed
::
Base
class
Stage
<
Seed
::
Base
attr_reader
:pipeline
,
:seeds
include
Gitlab
::
Utils
::
StrongMemoize
delegate
:size
,
to: :seeds
delegate
:size
,
to: :seeds
delegate
:dig
,
to: :seeds
delegate
:dig
,
to: :seeds
...
@@ -27,10 +27,16 @@ module Gitlab
...
@@ -27,10 +27,16 @@ module Gitlab
project:
@pipeline
.
project
}
project:
@pipeline
.
project
}
end
end
def
seeds
strong_memoize
(
:seeds_included
)
do
@seeds
.
select
(
&
:included?
)
end
end
# TODO specs
# TODO specs
#
#
def
included?
def
included?
@seeds
.
any?
(
&
:included?
)
seeds
.
any?
end
end
def
to_resource
def
to_resource
...
...
spec/lib/gitlab/ci/pipeline/chain/populate_spec.rb
View file @
39bbc387
...
@@ -129,4 +129,6 @@ describe Gitlab::Ci::Pipeline::Chain::Populate do
...
@@ -129,4 +129,6 @@ describe Gitlab::Ci::Pipeline::Chain::Populate do
expect
{
step
.
perform!
}.
to
raise_error
(
described_class
::
PopulateError
)
expect
{
step
.
perform!
}.
to
raise_error
(
described_class
::
PopulateError
)
end
end
end
end
pending
'populating pipeline according to policies'
end
end
spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
0 → 100644
View file @
39bbc387
require
'spec_helper'
describe
Gitlab
::
Ci
::
Pipeline
::
Seed
::
Build
do
let
(
:pipeline
)
{
create
(
:ci_empty_pipeline
)
}
let
(
:attributes
)
do
{
name:
'rspec'
,
ref:
'master'
,
commands:
'rspec'
}
end
subject
do
described_class
.
new
(
pipeline
,
attributes
)
end
describe
'#attributes'
do
it
'returns hash attributes of a build'
do
expect
(
subject
.
attributes
).
to
be_a
Hash
expect
(
subject
.
attributes
)
.
to
include
(
:name
,
:project
,
:ref
,
:commands
)
end
end
describe
'#user='
do
let
(
:user
)
{
build
(
:user
)
}
it
'assignes user to a build'
do
subject
.
user
=
user
expect
(
subject
.
attributes
).
to
include
(
user:
user
)
end
end
describe
'#to_resource'
do
it
'returns a valid build resource'
do
expect
(
subject
.
to_resource
).
to
be_a
(
::
Ci
::
Build
)
expect
(
subject
.
to_resource
).
to
be_valid
end
it
'memoizes a resource object'
do
build
=
subject
.
to_resource
expect
(
build
.
object_id
).
to
eq
subject
.
to_resource
.
object_id
end
it
'can not be persisted without explicit assignment'
do
build
=
subject
.
to_resource
pipeline
.
save!
expect
(
build
).
not_to
be_persisted
end
end
describe
'applying only/except policies'
do
context
'when no branch policy is specified'
do
let
(
:attributes
)
{
{
name:
'rspec'
}
}
it
{
is_expected
.
to
be_included
}
end
context
'when branch policy does not match'
do
context
'when using only'
do
let
(
:attributes
)
{
{
name:
'rspec'
,
only:
{
refs:
[
'deploy'
]
}
}
}
it
{
is_expected
.
not_to
be_included
}
end
context
'when using except'
do
let
(
:attributes
)
{
{
name:
'rspec'
,
except:
{
refs:
[
'deploy'
]
}
}
}
it
{
is_expected
.
to
be_included
}
end
end
context
'when branch regexp policy does not match'
do
context
'when using only'
do
let
(
:attributes
)
{
{
name:
'rspec'
,
only:
{
refs:
[
'/^deploy$/'
]
}
}
}
it
{
is_expected
.
not_to
be_included
}
end
context
'when using except'
do
let
(
:attributes
)
{
{
name:
'rspec'
,
except:
{
refs:
[
'/^deploy$/'
]
}
}
}
it
{
is_expected
.
to
be_included
}
end
end
context
'when branch policy matches'
do
context
'when using only'
do
let
(
:attributes
)
{
{
name:
'rspec'
,
only:
{
refs:
[
'deploy'
,
'master'
]
}
}
}
it
{
is_expected
.
to
be_included
}
end
context
'when using except'
do
let
(
:attributes
)
{
{
name:
'rspec'
,
except:
{
refs:
[
'deploy'
,
'master'
]
}
}
}
it
{
is_expected
.
not_to
be_included
}
end
end
context
'when keyword policy matches'
do
context
'when using only'
do
let
(
:attributes
)
{
{
name:
'rspec'
,
only:
{
refs:
[
'branches'
]
}
}
}
it
{
is_expected
.
to
be_included
}
end
context
'when using except'
do
let
(
:attributes
)
{
{
name:
'rspec'
,
except:
{
refs:
[
'branches'
]
}
}
}
it
{
is_expected
.
not_to
be_included
}
end
end
context
'when keyword policy does not match'
do
context
'when using only'
do
let
(
:attributes
)
{
{
name:
'rspec'
,
only:
{
refs:
[
'tags'
]
}
}
}
it
{
is_expected
.
not_to
be_included
}
end
context
'when using except'
do
let
(
:attributes
)
{
{
name:
'rspec'
,
except:
{
refs:
[
'tags'
]
}
}
}
it
{
is_expected
.
to
be_included
}
end
end
context
'when keywords and pipeline source policy matches'
do
possibilities
=
[[
'pushes'
,
'push'
],
[
'web'
,
'web'
],
[
'triggers'
,
'trigger'
],
[
'schedules'
,
'schedule'
],
[
'api'
,
'api'
],
[
'external'
,
'external'
]]
context
'when using only'
do
possibilities
.
each
do
|
keyword
,
source
|
context
"when using keyword `
#{
keyword
}
` and source `
#{
source
}
`"
do
let
(
:pipeline
)
do
build
(
:ci_empty_pipeline
,
ref:
'deploy'
,
tag:
false
,
source:
source
)
end
let
(
:attributes
)
{
{
name:
'rspec'
,
only:
{
refs:
[
keyword
]
}
}
}
it
{
is_expected
.
to
be_included
}
end
end
end
context
'when using except'
do
possibilities
.
each
do
|
keyword
,
source
|
context
"when using keyword `
#{
keyword
}
` and source `
#{
source
}
`"
do
let
(
:pipeline
)
do
build
(
:ci_empty_pipeline
,
ref:
'deploy'
,
tag:
false
,
source:
source
)
end
let
(
:attributes
)
{
{
name:
'rspec'
,
except:
{
refs:
[
keyword
]
}
}
}
it
{
is_expected
.
not_to
be_included
}
end
end
end
end
context
'when keywords and pipeline source does not match'
do
possibilities
=
[[
'pushes'
,
'web'
],
[
'web'
,
'push'
],
[
'triggers'
,
'schedule'
],
[
'schedules'
,
'external'
],
[
'api'
,
'trigger'
],
[
'external'
,
'api'
]]
context
'when using only'
do
possibilities
.
each
do
|
keyword
,
source
|
context
"when using keyword `
#{
keyword
}
` and source `
#{
source
}
`"
do
let
(
:pipeline
)
do
build
(
:ci_empty_pipeline
,
ref:
'deploy'
,
tag:
false
,
source:
source
)
end
let
(
:attributes
)
{
{
name:
'rspec'
,
only:
{
refs:
[
keyword
]
}
}
}
it
{
is_expected
.
not_to
be_included
}
end
end
end
context
'when using except'
do
possibilities
.
each
do
|
keyword
,
source
|
context
"when using keyword `
#{
keyword
}
` and source `
#{
source
}
`"
do
let
(
:pipeline
)
do
build
(
:ci_empty_pipeline
,
ref:
'deploy'
,
tag:
false
,
source:
source
)
end
let
(
:attributes
)
{
{
name:
'rspec'
,
except:
{
refs:
[
keyword
]
}
}
}
it
{
is_expected
.
to
be_included
}
end
end
end
end
context
'when repository path matches'
do
context
'when using only'
do
let
(
:attributes
)
do
{
name:
'rspec'
,
only:
{
refs:
[
"branches@
#{
pipeline
.
project_full_path
}
"
]
}
}
end
it
{
is_expected
.
to
be_included
}
end
context
'when using except'
do
let
(
:attributes
)
do
{
name:
'rspec'
,
except:
{
refs:
[
"branches@
#{
pipeline
.
project_full_path
}
"
]
}
}
end
it
{
is_expected
.
not_to
be_included
}
end
end
context
'when repository path does not matches'
do
context
'when using only'
do
let
(
:attributes
)
do
{
name:
'rspec'
,
only:
{
refs:
[
'branches@fork'
]
}
}
end
it
{
is_expected
.
not_to
be_included
}
end
context
'when using except'
do
let
(
:attributes
)
do
{
name:
'rspec'
,
except:
{
refs:
[
'branches@fork'
]
}
}
end
it
{
is_expected
.
to
be_included
}
end
end
end
end
spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb
View file @
39bbc387
...
@@ -6,7 +6,9 @@ describe Gitlab::Ci::Pipeline::Seed::Stage do
...
@@ -6,7 +6,9 @@ describe Gitlab::Ci::Pipeline::Seed::Stage do
let
(
:attributes
)
do
let
(
:attributes
)
do
{
name:
'test'
,
{
name:
'test'
,
index:
0
,
index:
0
,
builds:
[{
name:
'rspec'
},
{
name:
'spinach'
}]
}
builds:
[{
name:
'rspec'
},
{
name:
'spinach'
},
{
name:
'deploy'
,
only:
{
refs:
[
'feature'
]
}
}]
}
end
end
subject
do
subject
do
...
@@ -27,7 +29,11 @@ describe Gitlab::Ci::Pipeline::Seed::Stage do
...
@@ -27,7 +29,11 @@ describe Gitlab::Ci::Pipeline::Seed::Stage do
end
end
describe
'#seeds'
do
describe
'#seeds'
do
it
'returns hash attributes of all builds'
do
it
'returns build seeds'
do
expect
(
subject
.
seeds
).
to
all
(
be_a
Gitlab
::
Ci
::
Pipeline
::
Seed
::
Build
)
end
it
'returns build seeds including valid attributes'
do
expect
(
subject
.
seeds
.
size
).
to
eq
2
expect
(
subject
.
seeds
.
size
).
to
eq
2
expect
(
subject
.
seeds
.
map
(
&
:attributes
)).
to
all
(
include
(
ref:
'master'
))
expect
(
subject
.
seeds
.
map
(
&
:attributes
)).
to
all
(
include
(
ref:
'master'
))
expect
(
subject
.
seeds
.
map
(
&
:attributes
)).
to
all
(
include
(
tag:
false
))
expect
(
subject
.
seeds
.
map
(
&
:attributes
)).
to
all
(
include
(
tag:
false
))
...
@@ -55,6 +61,16 @@ describe Gitlab::Ci::Pipeline::Seed::Stage do
...
@@ -55,6 +61,16 @@ describe Gitlab::Ci::Pipeline::Seed::Stage do
expect
(
subject
.
seeds
.
map
(
&
:attributes
)).
to
all
(
include
(
protected:
false
))
expect
(
subject
.
seeds
.
map
(
&
:attributes
)).
to
all
(
include
(
protected:
false
))
end
end
end
end
it
'filters seeds using only/except policies'
do
expect
(
subject
.
seeds
.
map
(
&
:attributes
)).
to
satisfy
do
|
seeds
|
seeds
.
any?
{
|
hash
|
hash
.
fetch
(
:name
)
==
'rspec'
}
end
expect
(
subject
.
seeds
.
map
(
&
:attributes
)).
not_to
satisfy
do
|
seeds
|
seeds
.
any?
{
|
hash
|
hash
.
fetch
(
:name
)
==
'deploy'
}
end
end
end
end
describe
'#user='
do
describe
'#user='
do
...
...
spec/lib/gitlab/ci/yaml_processor_spec.rb
View file @
39bbc387
...
@@ -18,6 +18,34 @@ module Gitlab
...
@@ -18,6 +18,34 @@ module Gitlab
describe
'#build_attributes'
do
describe
'#build_attributes'
do
subject
{
described_class
.
new
(
config
).
build_attributes
(
:rspec
)
}
subject
{
described_class
.
new
(
config
).
build_attributes
(
:rspec
)
}
describe
'attributes list'
do
let
(
:config
)
do
YAML
.
dump
(
before_script:
[
'pwd'
],
rspec:
{
script:
'rspec'
}
)
end
it
'returns valid build attributes'
do
expect
(
subject
).
to
eq
({
stage:
"test"
,
stage_idx:
1
,
name:
"rspec"
,
commands:
"pwd
\n
rspec"
,
coverage_regex:
nil
,
tag_list:
[],
options:
{
before_script:
[
"pwd"
],
script:
[
"rspec"
]
},
allow_failure:
false
,
when:
"on_success"
,
environment:
nil
,
yaml_variables:
[]
})
end
end
describe
'coverage entry'
do
describe
'coverage entry'
do
describe
'code coverage regexp'
do
describe
'code coverage regexp'
do
let
(
:config
)
do
let
(
:config
)
do
...
@@ -105,512 +133,67 @@ module Gitlab
...
@@ -105,512 +133,67 @@ module Gitlab
end
end
end
end
describe
'#stage_seeds'
do
describe
'only / except policies validations'
do
context
'when no refs policy is specified'
do
context
'when `only` has an invalid value'
do
let
(
:config
)
do
let
(
:config
)
{
{
rspec:
{
script:
"rspec"
,
type:
"test"
,
only:
only
}
}
}
YAML
.
dump
(
production:
{
stage:
'deploy'
,
script:
'cap prod'
},
let
(
:processor
)
{
Gitlab
::
Ci
::
YamlProcessor
.
new
(
YAML
.
dump
(
config
))
}
rspec:
{
stage:
'test'
,
script:
'rspec'
},
spinach:
{
stage:
'test'
,
script:
'spinach'
})
end
let
(
:pipeline
)
{
create
(
:ci_empty_pipeline
)
}
it
'correctly fabricates a stage seeds object'
do
seeds
=
subject
.
stage_seeds
(
pipeline
)
expect
(
seeds
.
size
).
to
eq
2
expect
(
seeds
.
first
.
attributes
[
:name
]).
to
eq
'test'
expect
(
seeds
.
second
.
attributes
[
:name
]).
to
eq
'deploy'
expect
(
seeds
.
dig
(
0
,
0
,
:name
)).
to
eq
'rspec'
expect
(
seeds
.
dig
(
0
,
1
,
:name
)).
to
eq
'spinach'
expect
(
seeds
.
dig
(
1
,
0
,
:name
)).
to
eq
'production'
end
end
context
'when refs policy is specified'
do
let
(
:config
)
do
YAML
.
dump
(
production:
{
stage:
'deploy'
,
script:
'cap prod'
,
only:
[
'master'
]
},
spinach:
{
stage:
'test'
,
script:
'spinach'
,
only:
[
'tags'
]
})
end
let
(
:pipeline
)
do
create
(
:ci_empty_pipeline
,
ref:
'feature'
,
tag:
true
)
end
it
'returns stage seeds only assigned to master to master'
do
seeds
=
subject
.
stage_seeds
(
pipeline
)
expect
(
seeds
.
size
).
to
eq
1
expect
(
seeds
.
first
.
attributes
[
:name
]).
to
eq
'test'
expect
(
seeds
.
dig
(
0
,
0
,
:name
)).
to
eq
'spinach'
end
end
context
'when source policy is specified'
do
let
(
:config
)
do
YAML
.
dump
(
production:
{
stage:
'deploy'
,
script:
'cap prod'
,
only:
[
'triggers'
]
},
spinach:
{
stage:
'test'
,
script:
'spinach'
,
only:
[
'schedules'
]
})
end
let
(
:pipeline
)
do
create
(
:ci_empty_pipeline
,
source: :schedule
)
end
it
'returns stage seeds only assigned to schedules'
do
seeds
=
subject
.
stage_seeds
(
pipeline
)
expect
(
seeds
.
size
).
to
eq
1
expect
(
seeds
.
first
.
attributes
[
:name
]).
to
eq
'test'
expect
(
seeds
.
dig
(
0
,
0
,
:name
)).
to
eq
'spinach'
end
end
context
'when kubernetes policy is specified'
do
let
(
:config
)
do
YAML
.
dump
(
spinach:
{
stage:
'test'
,
script:
'spinach'
},
production:
{
stage:
'deploy'
,
script:
'cap'
,
only:
{
kubernetes:
'active'
}
}
)
end
context
'when kubernetes is active'
do
shared_examples
'same behavior between KubernetesService and Platform::Kubernetes'
do
it
'returns seeds for kubernetes dependent job'
do
seeds
=
subject
.
stage_seeds
(
pipeline
)
expect
(
seeds
.
size
).
to
eq
2
expect
(
seeds
.
dig
(
0
,
0
,
:name
)).
to
eq
'spinach'
expect
(
seeds
.
dig
(
1
,
0
,
:name
)).
to
eq
'production'
end
end
context
'when user configured kubernetes from Integration > Kubernetes'
do
let
(
:project
)
{
create
(
:kubernetes_project
)
}
let
(
:pipeline
)
{
create
(
:ci_empty_pipeline
,
project:
project
)
}
it_behaves_like
'same behavior between KubernetesService and Platform::Kubernetes'
end
context
'when user configured kubernetes from CI/CD > Clusters'
do
let!
(
:cluster
)
{
create
(
:cluster
,
:project
,
:provided_by_gcp
)
}
let
(
:project
)
{
cluster
.
project
}
let
(
:pipeline
)
{
create
(
:ci_empty_pipeline
,
project:
project
)
}
it_behaves_like
'same behavior between KubernetesService and Platform::Kubernetes'
end
end
context
'when kubernetes is not active'
do
it
'does not return seeds for kubernetes dependent job'
do
seeds
=
subject
.
stage_seeds
(
pipeline
)
expect
(
seeds
.
size
).
to
eq
1
expect
(
seeds
.
dig
(
0
,
0
,
:name
)).
to
eq
'spinach'
end
end
end
end
describe
"#pipeline_stage_builds"
do
let
(
:type
)
{
'test'
}
it
"returns builds if no branch specified"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"master"
)).
size
).
to
eq
(
1
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"master"
)).
first
).
to
eq
({
stage:
"test"
,
stage_idx:
1
,
name:
"rspec"
,
commands:
"pwd
\n
rspec"
,
coverage_regex:
nil
,
tag_list:
[],
options:
{
before_script:
[
"pwd"
],
script:
[
"rspec"
]
},
allow_failure:
false
,
when:
"on_success"
,
environment:
nil
,
yaml_variables:
[]
})
end
describe
'only'
do
it
"does not return builds if only has another branch"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
only:
[
"deploy"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"master"
)).
size
).
to
eq
(
0
)
end
it
"does not return builds if only has regexp with another branch"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
only:
[
"/^deploy$/"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"master"
)).
size
).
to
eq
(
0
)
end
it
"returns builds if only has specified this branch"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
only:
[
"master"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"master"
)).
size
).
to
eq
(
1
)
end
it
"returns builds if only has a list of branches including specified"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
type
,
only:
%w(master deploy)
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"deploy"
)).
size
).
to
eq
(
1
)
end
it
"returns builds if only has a branches keyword specified"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
type
,
only:
[
"branches"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"deploy"
)).
size
).
to
eq
(
1
)
end
it
"does not return builds if only has a tags keyword"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
type
,
only:
[
"tags"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"deploy"
)).
size
).
to
eq
(
0
)
end
it
"returns builds if only has special keywords specified and source matches"
do
context
'when it is integer'
do
possibilities
=
[{
keyword:
'pushes'
,
source:
'push'
},
let
(
:only
)
{
1
}
{
keyword:
'web'
,
source:
'web'
},
{
keyword:
'triggers'
,
source:
'trigger'
},
{
keyword:
'schedules'
,
source:
'schedule'
},
{
keyword:
'api'
,
source:
'api'
},
{
keyword:
'external'
,
source:
'external'
}]
possibilities
.
each
do
|
possibility
|
it
do
config
=
YAML
.
dump
({
expect
{
processor
}.
to
raise_error
(
Gitlab
::
Ci
::
YamlProcessor
::
ValidationError
,
before_script:
[
"pwd"
],
'jobs:rspec:only has to be either an array of conditions or a hash'
)
rspec:
{
script:
"rspec"
,
type:
type
,
only:
[
possibility
[
:keyword
]]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
'deploy'
,
tag:
false
,
source:
possibility
[
:source
])).
size
).
to
eq
(
1
)
end
end
end
end
it
"does not return builds if only has special keywords specified and source doesn't match"
do
context
'when it is an array of integers'
do
possibilities
=
[{
keyword:
'pushes'
,
source:
'web'
},
let
(
:only
)
{
[
1
,
1
]
}
{
keyword:
'web'
,
source:
'push'
},
{
keyword:
'triggers'
,
source:
'schedule'
},
{
keyword:
'schedules'
,
source:
'external'
},
{
keyword:
'api'
,
source:
'trigger'
},
{
keyword:
'external'
,
source:
'api'
}]
possibilities
.
each
do
|
possibility
|
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
type
,
only:
[
possibility
[
:keyword
]]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
'deploy'
,
tag:
false
,
source:
possibility
[
:source
])).
size
).
to
eq
(
0
)
it
do
expect
{
processor
}.
to
raise_error
(
Gitlab
::
Ci
::
YamlProcessor
::
ValidationError
,
'jobs:rspec:only config should be an array of strings or regexps'
)
end
end
end
end
it
"returns builds if only has current repository path"
do
context
'when it is invalid regex'
do
seed_pipeline
=
pipeline
(
ref:
'deploy'
)
let
(
:only
)
{
[
"/*invalid/"
]
}
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
type
,
only:
[
"branches@
#{
seed_pipeline
.
project_full_path
}
"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
seed_pipeline
).
size
).
to
eq
(
1
)
it
do
end
expect
{
processor
}.
to
raise_error
(
Gitlab
::
Ci
::
YamlProcessor
::
ValidationError
,
'jobs:rspec:only config should be an array of strings or regexps'
)
it
"does not return builds if only has different repository path"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
type
,
only:
[
"branches@fork"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"deploy"
)).
size
).
to
eq
(
0
)
end
it
"returns build only for specified type"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
"test"
,
only:
%w(master deploy)
},
staging:
{
script:
"deploy"
,
type:
"deploy"
,
only:
%w(master deploy)
},
production:
{
script:
"deploy"
,
type:
"deploy"
,
only:
[
"master@path"
,
"deploy"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
"deploy"
,
pipeline
(
ref:
"deploy"
)).
size
).
to
eq
(
2
)
expect
(
config_processor
.
pipeline_stage_builds
(
"test"
,
pipeline
(
ref:
"deploy"
)).
size
).
to
eq
(
1
)
expect
(
config_processor
.
pipeline_stage_builds
(
"deploy"
,
pipeline
(
ref:
"master"
)).
size
).
to
eq
(
1
)
end
context
'for invalid value'
do
let
(
:config
)
{
{
rspec:
{
script:
"rspec"
,
type:
"test"
,
only:
only
}
}
}
let
(
:processor
)
{
Gitlab
::
Ci
::
YamlProcessor
.
new
(
YAML
.
dump
(
config
))
}
context
'when it is integer'
do
let
(
:only
)
{
1
}
it
do
expect
{
processor
}.
to
raise_error
(
Gitlab
::
Ci
::
YamlProcessor
::
ValidationError
,
'jobs:rspec:only has to be either an array of conditions or a hash'
)
end
end
context
'when it is an array of integers'
do
let
(
:only
)
{
[
1
,
1
]
}
it
do
expect
{
processor
}.
to
raise_error
(
Gitlab
::
Ci
::
YamlProcessor
::
ValidationError
,
'jobs:rspec:only config should be an array of strings or regexps'
)
end
end
context
'when it is invalid regex'
do
let
(
:only
)
{
[
"/*invalid/"
]
}
it
do
expect
{
processor
}.
to
raise_error
(
Gitlab
::
Ci
::
YamlProcessor
::
ValidationError
,
'jobs:rspec:only config should be an array of strings or regexps'
)
end
end
end
end
end
end
end
describe
'except'
do
context
'when `except` has an invalid value'
do
it
"returns builds if except has another branch"
do
let
(
:config
)
{
{
rspec:
{
script:
"rspec"
,
except:
except
}
}
}
config
=
YAML
.
dump
({
let
(
:processor
)
{
Gitlab
::
Ci
::
YamlProcessor
.
new
(
YAML
.
dump
(
config
))
}
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
except:
[
"deploy"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"master"
)).
size
).
to
eq
(
1
)
end
it
"returns builds if except has regexp with another branch"
do
context
'when it is integer'
do
config
=
YAML
.
dump
({
let
(
:except
)
{
1
}
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
except:
[
"/^deploy$/"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"master"
)).
size
).
to
eq
(
1
)
end
it
"does not return builds if except has specified this branch"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
except:
[
"master"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"master"
)).
size
).
to
eq
(
0
)
end
it
"does not return builds if except has a list of branches including specified"
do
it
do
config
=
YAML
.
dump
({
expect
{
processor
}.
to
raise_error
(
Gitlab
::
Ci
::
YamlProcessor
::
ValidationError
,
before_script:
[
"pwd"
],
'jobs:rspec:except has to be either an array of conditions or a hash'
)
rspec:
{
script:
"rspec"
,
type:
type
,
except:
%w(master deploy)
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"deploy"
)).
size
).
to
eq
(
0
)
end
it
"does not return builds if except has a branches keyword specified"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
type
,
except:
[
"branches"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"deploy"
)).
size
).
to
eq
(
0
)
end
it
"returns builds if except has a tags keyword"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
type
,
except:
[
"tags"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"deploy"
)).
size
).
to
eq
(
1
)
end
it
"does not return builds if except has special keywords specified and source matches"
do
possibilities
=
[{
keyword:
'pushes'
,
source:
'push'
},
{
keyword:
'web'
,
source:
'web'
},
{
keyword:
'triggers'
,
source:
'trigger'
},
{
keyword:
'schedules'
,
source:
'schedule'
},
{
keyword:
'api'
,
source:
'api'
},
{
keyword:
'external'
,
source:
'external'
}]
possibilities
.
each
do
|
possibility
|
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
type
,
except:
[
possibility
[
:keyword
]]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
'deploy'
,
tag:
false
,
source:
possibility
[
:source
])).
size
).
to
eq
(
0
)
end
end
end
end
it
"returns builds if except has special keywords specified and source doesn't match"
do
context
'when it is an array of integers'
do
possibilities
=
[{
keyword:
'pushes'
,
source:
'web'
},
let
(
:except
)
{
[
1
,
1
]
}
{
keyword:
'web'
,
source:
'push'
},
{
keyword:
'triggers'
,
source:
'schedule'
},
{
keyword:
'schedules'
,
source:
'external'
},
{
keyword:
'api'
,
source:
'trigger'
},
{
keyword:
'external'
,
source:
'api'
}]
possibilities
.
each
do
|
possibility
|
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
type
,
except:
[
possibility
[
:keyword
]]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
it
do
expect
{
processor
}.
to
raise_error
(
Gitlab
::
Ci
::
YamlProcessor
::
ValidationError
,
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
'deploy'
,
tag:
false
,
source:
possibility
[
:source
])).
size
).
to
eq
(
1
)
'jobs:rspec:except config should be an array of strings or regexps'
)
end
end
end
end
it
"does not return builds if except has current repository path"
do
context
'when it is invalid regex'
do
seed_pipeline
=
pipeline
(
ref:
'deploy'
)
let
(
:except
)
{
[
"/*invalid/"
]
}
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
type
,
except:
[
"branches@
#{
seed_pipeline
.
project_full_path
}
"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
seed_pipeline
).
size
).
to
eq
(
0
)
end
it
"returns builds if except has different repository path"
do
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
type
,
except:
[
"branches@fork"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
type
,
pipeline
(
ref:
"deploy"
)).
size
).
to
eq
(
1
)
end
it
"returns build except specified type"
do
master_pipeline
=
pipeline
(
ref:
'master'
)
test_pipeline
=
pipeline
(
ref:
'test'
)
deploy_pipeline
=
pipeline
(
ref:
'deploy'
)
config
=
YAML
.
dump
({
before_script:
[
"pwd"
],
rspec:
{
script:
"rspec"
,
type:
"test"
,
except:
[
"master"
,
"deploy"
,
"test@
#{
test_pipeline
.
project_full_path
}
"
]
},
staging:
{
script:
"deploy"
,
type:
"deploy"
,
except:
[
"master"
]
},
production:
{
script:
"deploy"
,
type:
"deploy"
,
except:
[
"master@
#{
master_pipeline
.
project_full_path
}
"
]
}
})
config_processor
=
Gitlab
::
Ci
::
YamlProcessor
.
new
(
config
)
expect
(
config_processor
.
pipeline_stage_builds
(
"deploy"
,
deploy_pipeline
).
size
).
to
eq
(
2
)
expect
(
config_processor
.
pipeline_stage_builds
(
"test"
,
test_pipeline
).
size
).
to
eq
(
0
)
expect
(
config_processor
.
pipeline_stage_builds
(
"deploy"
,
master_pipeline
).
size
).
to
eq
(
0
)
end
context
'for invalid value'
do
let
(
:config
)
{
{
rspec:
{
script:
"rspec"
,
except:
except
}
}
}
let
(
:processor
)
{
Gitlab
::
Ci
::
YamlProcessor
.
new
(
YAML
.
dump
(
config
))
}
context
'when it is integer'
do
it
do
let
(
:except
)
{
1
}
expect
{
processor
}.
to
raise_error
(
Gitlab
::
Ci
::
YamlProcessor
::
ValidationError
,
'jobs:rspec:except config should be an array of strings or regexps'
)
it
do
expect
{
processor
}.
to
raise_error
(
Gitlab
::
Ci
::
YamlProcessor
::
ValidationError
,
'jobs:rspec:except has to be either an array of conditions or a hash'
)
end
end
context
'when it is an array of integers'
do
let
(
:except
)
{
[
1
,
1
]
}
it
do
expect
{
processor
}.
to
raise_error
(
Gitlab
::
Ci
::
YamlProcessor
::
ValidationError
,
'jobs:rspec:except config should be an array of strings or regexps'
)
end
end
context
'when it is invalid regex'
do
let
(
:except
)
{
[
"/*invalid/"
]
}
it
do
expect
{
processor
}.
to
raise_error
(
Gitlab
::
Ci
::
YamlProcessor
::
ValidationError
,
'jobs:rspec:except config should be an array of strings or regexps'
)
end
end
end
end
end
end
end
...
...
spec/models/ci/pipeline_spec.rb
View file @
39bbc387
...
@@ -219,136 +219,241 @@ describe Ci::Pipeline, :mailer do
...
@@ -219,136 +219,241 @@ describe Ci::Pipeline, :mailer do
end
end
describe
'pipeline stages'
do
describe
'pipeline stages'
do
before
do
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'build'
,
name:
'linux'
,
stage_idx:
0
,
status:
'success'
)
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'build'
,
name:
'mac'
,
stage_idx:
0
,
status:
'failed'
)
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'deploy'
,
name:
'staging'
,
stage_idx:
2
,
status:
'running'
)
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'test'
,
name:
'rspec'
,
stage_idx:
1
,
status:
'success'
)
end
describe
'#stage_seeds'
do
describe
'#stage_seeds'
do
let
(
:project
)
{
create
(
:project
,
:repository
)
}
let
(
:project
)
{
create
(
:project
,
:repository
)
}
let
(
:pipeline
)
do
let
(
:pipeline
)
{
build
(
:ci_pipeline
,
project:
project
,
config:
config
)
}
build
(
:ci_pipeline
,
project:
project
,
config:
{
rspec:
{
script:
'rake'
}
})
let
(
:config
)
{
{
rspec:
{
script:
'rake'
}
}
}
end
it
'returns preseeded stage seeds object'
do
it
'returns preseeded stage seeds object'
do
expect
(
pipeline
.
stage_seeds
)
expect
(
pipeline
.
stage_seeds
)
.
to
all
(
be_a
Gitlab
::
Ci
::
Pipeline
::
Seed
::
Base
)
.
to
all
(
be_a
Gitlab
::
Ci
::
Pipeline
::
Seed
::
Base
)
expect
(
pipeline
.
stage_seeds
.
count
).
to
eq
1
expect
(
pipeline
.
stage_seeds
.
count
).
to
eq
1
end
end
end
describe
'#legacy_stages'
do
context
'when no refs policy is specified'
do
subject
{
pipeline
.
legacy_stages
}
let
(
:config
)
do
{
production:
{
stage:
'deploy'
,
script:
'cap prod'
},
rspec:
{
stage:
'test'
,
script:
'rspec'
},
spinach:
{
stage:
'test'
,
script:
'spinach'
}
}
end
it
'correctly fabricates a stage seeds object'
do
seeds
=
pipeline
.
stage_seeds
context
'stages list'
do
expect
(
seeds
.
size
).
to
eq
2
it
'returns ordered list of stages'
do
expect
(
seeds
.
first
.
attributes
[
:name
]).
to
eq
'test'
expect
(
subject
.
map
(
&
:name
)).
to
eq
(
%w[build test deploy]
)
expect
(
seeds
.
second
.
attributes
[
:name
]).
to
eq
'deploy'
expect
(
seeds
.
dig
(
0
,
0
,
:name
)).
to
eq
'rspec'
expect
(
seeds
.
dig
(
0
,
1
,
:name
)).
to
eq
'spinach'
expect
(
seeds
.
dig
(
1
,
0
,
:name
)).
to
eq
'production'
end
end
end
end
context
'
stages with statuses
'
do
context
'
when refs policy is specified
'
do
let
(
:
statuses
)
do
let
(
:
pipeline
)
do
subject
.
map
{
|
stage
|
[
stage
.
name
,
stage
.
status
]
}
build
(
:ci_pipeline
,
ref:
'feature'
,
tag:
true
,
config:
config
)
end
end
it
'returns list of stages with correct statuses'
do
let
(
:config
)
do
expect
(
statuses
).
to
eq
([
%w(build failed)
,
{
production:
{
stage:
'deploy'
,
script:
'cap prod'
,
only:
[
'master'
]
},
%w(test success)
,
spinach:
{
stage:
'test'
,
script:
'spinach'
,
only:
[
'tags'
]
}
}
%w(deploy running)
])
end
end
context
'when commit status is retried'
do
it
'returns stage seeds only assigned to master to master'
do
before
do
seeds
=
pipeline
.
stage_seeds
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'build'
,
expect
(
seeds
.
size
).
to
eq
1
name:
'mac'
,
expect
(
seeds
.
first
.
attributes
[
:name
]).
to
eq
'test'
stage_idx:
0
,
expect
(
seeds
.
dig
(
0
,
0
,
:name
)).
to
eq
'spinach'
status:
'success'
)
end
end
context
'when source policy is specified'
do
let
(
:pipeline
)
{
build
(
:ci_pipeline
,
source: :schedule
,
config:
config
)
}
let
(
:config
)
do
{
production:
{
stage:
'deploy'
,
script:
'cap prod'
,
only:
[
'triggers'
]
},
spinach:
{
stage:
'test'
,
script:
'spinach'
,
only:
[
'schedules'
]
}
}
end
it
'returns stage seeds only assigned to schedules'
do
seeds
=
pipeline
.
stage_seeds
pipeline
.
process!
expect
(
seeds
.
size
).
to
eq
1
expect
(
seeds
.
first
.
attributes
[
:name
]).
to
eq
'test'
expect
(
seeds
.
dig
(
0
,
0
,
:name
)).
to
eq
'spinach'
end
end
context
'when kubernetes policy is specified'
do
let
(
:config
)
do
{
spinach:
{
stage:
'test'
,
script:
'spinach'
},
production:
{
stage:
'deploy'
,
script:
'cap'
,
only:
{
kubernetes:
'active'
}
}
}
end
context
'when kubernetes is active'
do
shared_examples
'same behavior between KubernetesService and Platform::Kubernetes'
do
it
'returns seeds for kubernetes dependent job'
do
seeds
=
pipeline
.
stage_seeds
expect
(
seeds
.
size
).
to
eq
2
expect
(
seeds
.
dig
(
0
,
0
,
:name
)).
to
eq
'spinach'
expect
(
seeds
.
dig
(
1
,
0
,
:name
)).
to
eq
'production'
end
end
end
it
'ignores the previous state'
do
context
'when user configured kubernetes from Integration > Kubernetes'
do
expect
(
statuses
).
to
eq
([
%w(build success)
,
let
(
:project
)
{
create
(
:kubernetes_project
)
}
%w(test success)
,
let
(
:pipeline
)
{
build
(
:ci_pipeline
,
project:
project
,
config:
config
)
}
%w(deploy running)
])
it_behaves_like
'same behavior between KubernetesService and Platform::Kubernetes'
end
context
'when user configured kubernetes from CI/CD > Clusters'
do
let!
(
:cluster
)
{
create
(
:cluster
,
:project
,
:provided_by_gcp
)
}
let
(
:project
)
{
cluster
.
project
}
let
(
:pipeline
)
{
build
(
:ci_pipeline
,
project:
project
,
config:
config
)
}
it_behaves_like
'same behavior between KubernetesService and Platform::Kubernetes'
end
end
context
'when kubernetes is not active'
do
it
'does not return seeds for kubernetes dependent job'
do
seeds
=
pipeline
.
stage_seeds
expect
(
seeds
.
size
).
to
eq
1
expect
(
seeds
.
dig
(
0
,
0
,
:name
)).
to
eq
'spinach'
end
end
end
end
end
end
end
context
'when there is a stage with warnings'
do
describe
'legacy stages'
do
before
do
before
do
create
(
:commit_status
,
pipeline:
pipeline
,
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'deploy'
,
stage:
'build'
,
name:
'prod:2'
,
name:
'linux'
,
stage_idx:
2
,
stage_idx:
0
,
status:
'failed'
,
status:
'success'
)
allow_failure:
true
)
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'build'
,
name:
'mac'
,
stage_idx:
0
,
status:
'failed'
)
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'deploy'
,
name:
'staging'
,
stage_idx:
2
,
status:
'running'
)
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'test'
,
name:
'rspec'
,
stage_idx:
1
,
status:
'success'
)
end
describe
'#legacy_stages'
do
subject
{
pipeline
.
legacy_stages
}
context
'stages list'
do
it
'returns ordered list of stages'
do
expect
(
subject
.
map
(
&
:name
)).
to
eq
(
%w[build test deploy]
)
end
end
end
it
'populates stage with correct number of warnings'
do
context
'stages with statuses'
do
deploy_stage
=
pipeline
.
legacy_stages
.
third
let
(
:statuses
)
do
subject
.
map
{
|
stage
|
[
stage
.
name
,
stage
.
status
]
}
end
expect
(
deploy_stage
).
not_to
receive
(
:statuses
)
it
'returns list of stages with correct statuses'
do
expect
(
deploy_stage
).
to
have_warnings
expect
(
statuses
).
to
eq
([
%w(build failed)
,
%w(test success)
,
%w(deploy running)
])
end
context
'when commit status is retried'
do
before
do
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'build'
,
name:
'mac'
,
stage_idx:
0
,
status:
'success'
)
pipeline
.
process!
end
it
'ignores the previous state'
do
expect
(
statuses
).
to
eq
([
%w(build success)
,
%w(test success)
,
%w(deploy running)
])
end
end
end
context
'when there is a stage with warnings'
do
before
do
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'deploy'
,
name:
'prod:2'
,
stage_idx:
2
,
status:
'failed'
,
allow_failure:
true
)
end
it
'populates stage with correct number of warnings'
do
deploy_stage
=
pipeline
.
legacy_stages
.
third
expect
(
deploy_stage
).
not_to
receive
(
:statuses
)
expect
(
deploy_stage
).
to
have_warnings
end
end
end
end
end
end
describe
'#stages_count'
do
describe
'#stages_count'
do
it
'returns a valid number of stages'
do
it
'returns a valid number of stages'
do
expect
(
pipeline
.
stages_count
).
to
eq
(
3
)
expect
(
pipeline
.
stages_count
).
to
eq
(
3
)
end
end
end
end
describe
'#stages_names'
do
describe
'#stages_names'
do
it
'returns a valid names of stages'
do
it
'returns a valid names of stages'
do
expect
(
pipeline
.
stages_names
).
to
eq
(
%w(build test deploy)
)
expect
(
pipeline
.
stages_names
).
to
eq
(
%w(build test deploy)
)
end
end
end
end
end
end
describe
'#legacy_stage'
do
subject
{
pipeline
.
legacy_stage
(
'test'
)
}
context
'with status in stage'
do
describe
'#legacy_stage'
do
before
do
subject
{
pipeline
.
legacy_stage
(
'test'
)
}
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'test'
)
end
it
{
expect
(
subject
).
to
be_a
Ci
::
LegacyStage
}
context
'with status in stage'
do
it
{
expect
(
subject
.
name
).
to
eq
'test'
}
before
do
it
{
expect
(
subject
.
statuses
).
not_to
be_empty
}
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'test'
)
end
end
context
'without status in stage'
do
it
{
expect
(
subject
).
to
be_a
Ci
::
LegacyStage
}
before
do
it
{
expect
(
subject
.
name
).
to
eq
'test'
}
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'build'
)
it
{
expect
(
subject
.
statuses
).
not_to
be_empty
}
end
end
it
'return stage object'
do
context
'without status in stage'
do
is_expected
.
to
be_nil
before
do
create
(
:commit_status
,
pipeline:
pipeline
,
stage:
'build'
)
end
it
'return stage object'
do
is_expected
.
to
be_nil
end
end
end
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