Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
水淹萌龙
kubesphere
提交
91c2e056
K
kubesphere
项目概览
水淹萌龙
/
kubesphere
与 Fork 源项目一致
Fork自
KubeSphere / kubesphere
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kubesphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
未验证
提交
91c2e056
编写于
12月 08, 2020
作者:
K
KubeSphere CI Bot
提交者:
GitHub
12月 08, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #3180 from LinuxSuRen/fix/pipeline-finalizer
Fix pipeline cannot be removed due to finalizers
上级
1d2204cd
349a4ac9
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
34 addition
and
13 deletion
+34
-13
pkg/controller/pipeline/pipeline_controller.go
pkg/controller/pipeline/pipeline_controller.go
+34
-13
未找到文件。
pkg/controller/pipeline/pipeline_controller.go
浏览文件 @
91c2e056
...
...
@@ -18,6 +18,7 @@ package pipeline
import
(
"fmt"
"github.com/emicklei/go-restful"
v1
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
utilruntime
"k8s.io/apimachinery/pkg/util/runtime"
...
...
@@ -40,6 +41,7 @@ import (
devopsClient
"kubesphere.io/kubesphere/pkg/simple/client/devops"
"kubesphere.io/kubesphere/pkg/utils/k8sutil"
"kubesphere.io/kubesphere/pkg/utils/sliceutil"
"net/http"
"reflect"
"time"
)
...
...
@@ -222,14 +224,14 @@ func (c *Controller) syncHandler(key string) error {
return
err
}
//If the sync is successful, return handle
if
state
,
ok
:=
pipeline
.
Annotations
[
devopsv1alpha3
.
PipelineSyncStatusAnnoKey
];
ok
&&
state
==
modelsdevops
.
StatusSuccessful
{
return
nil
}
copyPipeline
:=
pipeline
.
DeepCopy
()
// DeletionTimestamp.IsZero() means copyPipeline has not been deleted.
if
copyPipeline
.
ObjectMeta
.
DeletionTimestamp
.
IsZero
()
{
//If the sync is successful, return handle
if
state
,
ok
:=
pipeline
.
Annotations
[
devopsv1alpha3
.
PipelineSyncStatusAnnoKey
];
ok
&&
state
==
modelsdevops
.
StatusSuccessful
{
return
nil
}
// https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#finalizers
if
!
sliceutil
.
HasString
(
copyPipeline
.
ObjectMeta
.
Finalizers
,
devopsv1alpha3
.
PipelineFinalizerName
)
{
copyPipeline
.
ObjectMeta
.
Finalizers
=
append
(
copyPipeline
.
ObjectMeta
.
Finalizers
,
devopsv1alpha3
.
PipelineFinalizerName
)
...
...
@@ -256,23 +258,42 @@ func (c *Controller) syncHandler(key string) error {
}
}
//If there is no early return, then the sync is successful.
if
copyPipeline
.
Annotations
==
nil
{
copyPipeline
.
Annotations
=
map
[
string
]
string
{}
}
copyPipeline
.
Annotations
[
devopsv1alpha3
.
PipelineSyncStatusAnnoKey
]
=
modelsdevops
.
StatusSuccessful
}
else
{
// Finalizers processing logic
if
sliceutil
.
HasString
(
copyPipeline
.
ObjectMeta
.
Finalizers
,
devopsv1alpha3
.
PipelineFinalizerName
)
{
delSuccess
:=
false
if
_
,
err
:=
c
.
devopsClient
.
DeleteProjectPipeline
(
nsName
,
pipeline
.
Name
);
err
!=
nil
{
// the status code should be 404 if the job does not exists
if
srvErr
,
ok
:=
err
.
(
restful
.
ServiceError
);
ok
{
delSuccess
=
srvErr
.
Code
==
http
.
StatusNotFound
}
else
if
srvErr
,
ok
:=
err
.
(
*
devopsClient
.
ErrorResponse
);
ok
{
delSuccess
=
srvErr
.
Response
.
StatusCode
==
http
.
StatusNotFound
}
else
{
klog
.
Error
(
fmt
.
Sprintf
(
"unexpected error type: %v, should be *restful.ServiceError"
,
err
))
}
klog
.
V
(
8
)
.
Info
(
err
,
fmt
.
Sprintf
(
"failed to delete pipeline %s in devops"
,
key
))
}
else
{
delSuccess
=
true
}
copyPipeline
.
ObjectMeta
.
Finalizers
=
sliceutil
.
RemoveString
(
copyPipeline
.
ObjectMeta
.
Finalizers
,
func
(
item
string
)
bool
{
return
item
==
devopsv1alpha3
.
PipelineFinalizerName
})
if
delSuccess
{
copyPipeline
.
ObjectMeta
.
Finalizers
=
sliceutil
.
RemoveString
(
copyPipeline
.
ObjectMeta
.
Finalizers
,
func
(
item
string
)
bool
{
return
item
==
devopsv1alpha3
.
PipelineFinalizerName
})
}
else
{
// make sure the corresponding Jenkins job can be clean
// You can remove the finalizer via kubectl manually in a very special case that Jenkins might be not able to available anymore
return
fmt
.
Errorf
(
"failed to remove pipeline job finalizer due to bad communication with Jenkins"
)
}
}
}
//If there is no early return, then the sync is successful.
if
copyPipeline
.
Annotations
==
nil
{
copyPipeline
.
Annotations
=
map
[
string
]
string
{}
}
copyPipeline
.
Annotations
[
devopsv1alpha3
.
PipelineSyncStatusAnnoKey
]
=
modelsdevops
.
StatusSuccessful
if
!
reflect
.
DeepEqual
(
pipeline
,
copyPipeline
)
{
_
,
err
=
c
.
kubesphereClient
.
DevopsV1alpha3
()
.
Pipelines
(
nsName
)
.
Update
(
copyPipeline
)
if
err
!=
nil
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录