下面是Jenkins常规脚本,用于将工件推送到Cloud Foundry。
stage('stage_1'){
if (repoName == 'a'){
pushA(repoName)
}
else if(repoName == 'b'){
pushB(repoName)
}
else if (repoName == 'c'){
pushC(repoName)
}else if (repoName == 'd'){
pushD(repoName)
}else if (repoName == 'e'){
pushE(repoName)
}
}
这是一个单文件的Jenkins groovy脚本,使用以下选项编写,并通过Web挂钩了多个GitLab存储库:
为什么pushA / pushB?因为每个推送都有自己的清单文件
如何避免else..if
的代码异味?
您是否建议使用repoName
作为键的哈希图?
如果是,如何在脚本启动期间注册pushX()
方法?在python中,我们使用注册修饰符(在导入时运行)更新commands
字典,如下所示:
答案 0 :(得分:1)
这是与您的python大致对应的代码。但这只是将密钥关闭功能放入地图中……
httpURLConnection.getResponseCode()
答案 1 :(得分:0)
下面的代码定义了虚拟AfterTargets="PrepareForBuild"
函数以模仿您示例中的函数,然后定义了一个闭包映射,其中每个闭包均调用相关的pushX()
函数,然后按名称查找相关的闭包,并调用它,并将名称作为参数传递:
pushX()
也许类似的东西对您有用。但是,这仍然很难闻。如果def pushA(def name) { println "In pushA() with $name" }
def pushB(def name) { println "In pushB() with $name" }
def funcMap = [
a: { pushA(it) },
b: { pushB(it) }
]
def repoName = 'a'
// Invoke the closure mapped to 'repoName', also passing 'repoName' as a parameter.
funcMap[repoName].call(repoName)
仅在推送回购协议A时才使用过,为什么它需要回购名称作为参数?可能有更好的方法来组织这件事,包括上面未显示的部分。
答案 2 :(得分:0)
您可以模拟具有分配的dict的开关。贝娄一个愚蠢的例子:
#!/usr/bin/env python
def case1():
print("This is case 1")
def case2():
print("This is case 2")
def case3():
print("This is case 3")
token_dict = {
"case1" : case1,
"case2" : case2,
"case3" : case3,
}
def main():
cases = ("case1", "case3", "case2", "case1")
for case in cases:
token_dict[case]()
if __name__ == '__main__':
main()
输出:
This is case 1
This is case 3
This is case 2
This is case 1