Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
gitlab-foss
提交
c65e9606
G
gitlab-foss
项目概览
李少辉-开发者
/
gitlab-foss
通知
15
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlab-foss
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
c65e9606
编写于
2月 13, 2017
作者:
G
Grzegorz Bizon
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Implement new pipeline retry service
The new service takes stages order into account.
上级
19ef4083
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
91 addition
and
11 deletion
+91
-11
app/models/ci/stage.rb
app/models/ci/stage.rb
+12
-0
app/services/ci/retry_build_service.rb
app/services/ci/retry_build_service.rb
+5
-7
app/services/ci/retry_pipeline_service.rb
app/services/ci/retry_pipeline_service.rb
+24
-3
spec/services/ci/retry_pipeline_service_spec.rb
spec/services/ci/retry_pipeline_service_spec.rb
+50
-1
未找到文件。
app/models/ci/stage.rb
浏览文件 @
c65e9606
...
...
@@ -19,6 +19,10 @@ module Ci
name
end
def
index
statuses
.
first
.
stage_idx
end
def
statuses_count
@statuses_count
||=
statuses
.
count
end
...
...
@@ -45,6 +49,14 @@ module Ci
status
.
to_s
==
'success'
end
def
failed?
status
.
to_s
==
'failed'
end
def
canceled?
status
.
to_s
==
'canceled'
end
def
has_warnings?
if
@warnings
.
nil?
statuses
.
latest
.
failed_but_allowed
.
any?
...
...
app/services/ci/retry_build_service.rb
浏览文件 @
c65e9606
...
...
@@ -9,11 +9,7 @@ module Ci
end
def
retry!
unless
can?
(
@user
,
:update_build
,
@build
)
raise
Gitlab
::
Access
::
AccessDeniedError
end
clone_build
.
tap
do
|
new_build
|
reprocess!
.
tap
do
|
new_build
|
new_build
.
enqueue!
MergeRequests
::
AddTodoWhenBuildFailsService
...
...
@@ -24,9 +20,11 @@ module Ci
end
end
private
def
reprocess!
unless
can?
(
@user
,
:update_build
,
@build
)
raise
Gitlab
::
Access
::
AccessDeniedError
end
def
clone_build
Ci
::
Build
.
create
(
ref:
@build
.
ref
,
tag:
@build
.
tag
,
...
...
app/services/ci/retry_pipeline_service.rb
浏览文件 @
c65e9606
...
...
@@ -12,10 +12,31 @@ module Ci
raise
Gitlab
::
Access
::
AccessDeniedError
end
@pipeline
.
stages
.
each
do
|
stage
|
stage
.
builds
.
failed_or_canceled
.
find_each
do
|
build
|
Ci
::
Build
.
retry
(
build
,
@user
)
##
# Reprocess builds in subsequent stages if any
#
# TODO, refactor.
#
@pipeline
.
builds
.
where
(
'stage_idx > ?'
,
resume_stage
.
index
)
.
failed_or_canceled
.
find_each
do
|
build
|
Ci
::
RetryBuildService
.
new
(
build
,
@user
).
reprocess!
end
##
# Retry builds in the first unsuccessful stage
#
resume_stage
.
builds
.
failed_or_canceled
.
find_each
do
|
build
|
Ci
::
Build
.
retry
(
build
,
@user
)
end
end
private
def
resume_stage
@resume_stage
||=
@pipeline
.
stages
.
find
do
|
stage
|
stage
.
failed?
||
stage
.
canceled?
end
end
end
...
...
spec/services/ci/retry_pipeline_service_spec.rb
浏览文件 @
c65e9606
...
...
@@ -21,6 +21,51 @@ describe Ci::RetryPipelineService, '#execute', :services do
expect
(
build
(
'rspec 2'
)).
to
be_pending
expect
(
build
(
'rspec 3'
)).
to
be_pending
expect
(
pipeline
.
reload
).
to
be_running
end
end
context
'when there are failed or canceled builds in the first stage'
do
before
do
create_build
(
name:
'rspec 1'
,
status: :failed
,
stage_num:
0
)
create_build
(
name:
'rspec 2'
,
status: :canceled
,
stage_num:
0
)
create_build
(
name:
'rspec 3'
,
status: :skipped
,
stage_num:
1
)
create_build
(
name:
'deploy 1'
,
status: :skipped
,
stage_num:
2
)
end
it
'retries builds failed builds and marks subsequent for processing'
do
service
.
execute
expect
(
build
(
'rspec 1'
)).
to
be_pending
expect
(
build
(
'rspec 2'
)).
to
be_pending
expect
(
build
(
'rspec 3'
)).
to
be_created
expect
(
build
(
'deploy 1'
)).
to
be_created
expect
(
pipeline
.
reload
).
to
be_running
end
end
context
'when there is failed build present which was run on failure'
do
before
do
create_build
(
name:
'rspec 1'
,
status: :failed
,
stage_num:
0
)
create_build
(
name:
'rspec 2'
,
status: :canceled
,
stage_num:
0
)
create_build
(
name:
'rspec 3'
,
status: :skipped
,
stage_num:
1
)
create_build
(
name:
'report 1'
,
status: :failed
,
stage_num:
2
)
end
it
'retries builds failed builds and marks subsequent for processing'
do
service
.
execute
expect
(
build
(
'rspec 1'
)).
to
be_pending
expect
(
build
(
'rspec 2'
)).
to
be_pending
expect
(
build
(
'rspec 3'
)).
to
be_created
expect
(
build
(
'report 1'
)).
to
be_created
expect
(
pipeline
.
reload
).
to
be_running
end
it
'creates a new job for report job in this case'
do
service
.
execute
expect
(
statuses
.
where
(
name:
'report 1'
).
count
).
to
eq
2
end
end
end
...
...
@@ -32,8 +77,12 @@ describe Ci::RetryPipelineService, '#execute', :services do
end
end
def
statuses
pipeline
.
reload
.
statuses
end
def
build
(
name
)
pipeline
.
statuses
.
find_by
(
name:
name
)
statuses
.
latest
.
find_by
(
name:
name
)
end
def
create_build
(
name
:,
status
:,
stage_num
:)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录