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
56449cc6
Commit
56449cc6
authored
Feb 19, 2016
by
Kamil Trzcinski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix Merge When Succeeded for multiple stages
Use around_transition to trigger build creation for next stages
parent
2cc9a42c
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
46 additions
and
10 deletions
+46
-10
CHANGELOG
CHANGELOG
+1
-0
app/models/ci/build.rb
app/models/ci/build.rb
+9
-4
app/models/commit_status.rb
app/models/commit_status.rb
+6
-6
spec/services/merge_requests/merge_when_build_succeeds_service_spec.rb
.../merge_requests/merge_when_build_succeeds_service_spec.rb
+30
-0
No files found.
CHANGELOG
View file @
56449cc6
...
...
@@ -52,6 +52,7 @@ v 8.5.0 (unreleased)
- Improve UI consistency between projects and groups lists
- Add sort dropdown to dashboard projects page
- Fixed logo animation on Safari (Roman Rott)
- Fix Merge When Succeeded when multiple stages
- Hide remove source branch button when the MR is merged but new commits are pushed (Zeger-Jan van de Weg)
- In seach autocomplete show only groups and projects you are member of
- Don't process cross-reference notes from forks
...
...
app/models/ci/build.rb
View file @
56449cc6
...
...
@@ -107,15 +107,18 @@ def retry(build)
end
state_machine
:status
,
initial: :pending
do
after_transition
pending: :running
do
|
build
,
transition
|
after_transition
pending: :running
do
|
build
|
build
.
execute_hooks
end
after_transition
any
=>
[
:success
,
:failed
,
:canceled
]
do
|
build
,
transition
|
return
unless
build
.
project
# We use around_transition to create builds for next stage as soon as possible, before the `after_*` is executed
around_transition
any
=>
[
:success
,
:failed
,
:canceled
]
do
|
build
,
block
|
block
.
call
build
.
commit
.
create_next_builds
(
build
)
if
build
.
commit
end
after_transition
any
=>
[
:success
,
:failed
,
:canceled
]
do
|
build
|
build
.
update_coverage
build
.
commit
.
create_next_builds
(
build
)
build
.
execute_hooks
end
end
...
...
@@ -179,6 +182,7 @@ def allow_git_fetch
end
def
update_coverage
return
unless
project
coverage_regex
=
project
.
build_coverage_regex
return
unless
coverage_regex
coverage
=
extract_coverage
(
trace
,
coverage_regex
)
...
...
@@ -334,6 +338,7 @@ def show_warning?
end
def
execute_hooks
return
unless
project
build_data
=
Gitlab
::
BuildDataBuilder
.
build
(
self
)
project
.
execute_hooks
(
build_data
.
dup
,
:build_hooks
)
project
.
execute_services
(
build_data
.
dup
,
:build_hooks
)
...
...
app/models/commit_status.rb
View file @
56449cc6
...
...
@@ -75,16 +75,16 @@ class CommitStatus < ActiveRecord::Base
transition
[
:pending
,
:running
]
=>
:canceled
end
after_transition
pending: :running
do
|
build
,
transition
|
build
.
update_attributes
started_at:
Time
.
now
after_transition
pending: :running
do
|
commit_status
|
commit_status
.
update_attributes
started_at:
Time
.
now
end
after_transition
any
=>
[
:success
,
:failed
,
:canceled
]
do
|
build
,
transition
|
build
.
update_attributes
finished_at:
Time
.
now
after_transition
any
=>
[
:success
,
:failed
,
:canceled
]
do
|
commit_status
|
commit_status
.
update_attributes
finished_at:
Time
.
now
end
after_transition
[
:pending
,
:running
]
=>
:success
do
|
build
,
transition
|
MergeRequests
::
MergeWhenBuildSucceedsService
.
new
(
build
.
commit
.
project
,
nil
).
trigger
(
build
)
after_transition
[
:pending
,
:running
]
=>
:success
do
|
commit_status
|
MergeRequests
::
MergeWhenBuildSucceedsService
.
new
(
commit_status
.
commit
.
project
,
nil
).
trigger
(
commit_status
)
end
state
:pending
,
value:
'pending'
...
...
spec/services/merge_requests/merge_when_build_succeeds_service_spec.rb
View file @
56449cc6
...
...
@@ -63,6 +63,36 @@
expect
(
MergeWorker
).
to
receive
(
:perform_async
)
service
.
trigger
(
build
)
end
context
'properly handles multiple stages'
do
let
(
:ref
)
{
mr_merge_if_green_enabled
.
source_branch
}
let
(
:build
)
{
create
(
:ci_build
,
commit:
ci_commit
,
ref:
ref
,
name:
'build'
,
stage:
'build'
)
}
let
(
:test
)
{
create
(
:ci_build
,
commit:
ci_commit
,
ref:
ref
,
name:
'test'
,
stage:
'test'
)
}
before
do
# This behavior of MergeRequest: we instantiate a new object
allow_any_instance_of
(
MergeRequest
).
to
receive
(
:ci_commit
).
and_wrap_original
do
Ci
::
Commit
.
find
(
ci_commit
.
id
)
end
# We create test after the build
allow
(
ci_commit
).
to
receive
(
:create_next_builds
).
and_wrap_original
do
test
end
end
it
"doesn't merge if some stages failed"
do
expect
(
MergeWorker
).
to_not
receive
(
:perform_async
)
build
.
success
test
.
drop
end
it
'merge when all stages succeeded'
do
expect
(
MergeWorker
).
to
receive
(
:perform_async
)
build
.
success
test
.
success
end
end
end
describe
"#cancel"
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