-
Improvement
-
Resolution: Unresolved
-
Major
我已经在其他票证和网站上多次看到这一点,但我找不到专门解决它的票证。(所以希望我不只是简单地错过它)
问题:给定几个不同的存储库,具有执行不同阶段的不同分支,没有简单的方法可以基于某些配置修改管道以保持声明性管道 DRY。
简单的例子:
- 分支 1 阶段:A -> B -> C
- 分支 2 阶段:A -> B -> D
- 分支 3 个阶段:A -> B -> C -> D
目前,这需要定义 3 个不同的管道,这意味着冗余代码存在于不同的文件中,进而增加了发生错误的可能性。在更复杂的情况下,根本不可能查看对所有不同管道组合的更改。
例如,在阶段中使用“when”是解决此问题的一种方法,但这会导致在分支构建中看到“部署”阶段而不是部署的开发人员感到困惑。此外,对于复杂的场景,可能会有许多跳过的阶段,这些阶段总是会被跳过,并简单地向可视化添加不必要的冗长。
另一种解决方法是使用脚本化管道,但使用声明式提供的许多可视化功能不存在或始终无法正常工作。此外,由于阶段列表不是预先确定的,阶段视图总是在构建期间重置。
我能想到的解决方案有两种:
- 提供修改“何时”行为的能力,让蓝海可视化完全忽略它。这种方法的问题在于,我相信在执行阶段时会评估“何时”条件,但阶段列表是在评估管道时在开始时确定的。这可能实际上可以实现,只是简单地在可视化中隐藏舞台而不是完全忽略它。例如:(这可能会大大改进,但它表明了这一点):
config = [ skipStage2 : true ] pipeline { agent any stage { stage( "Stage 1" ) { ... } stage( "Stage 2" ) { when { showOnlyWhen { expression { return !config.skipStage2 } // 在执行阶段 } } ... } } }
- 添加另一个预先评估以确定阶段列表的指令。如果阶段列表从构建到构建发生变化,这与整个声明性管道发生变化并且存在不同阶段没有什么不同。例如:
config = [ skipStage2 : true , // 当existsStage2 = false existsStage2 : false ] 管道{ agent any stage { stage( "Stage 1" ) { ... } stage( "Stage 2" ) { when { expression { return ! config.skipStage2} //在执行阶段之后评价 } 存在{ 表达式{返回config.existsStage2} //评估的前期确定是否 这舞台甚至运行 } ... } } }