groovy Jenkinsfile Stages可以被重构以重用/DRY吗

aelbi1ox  于 2024-01-06  发布在  Jenkins
关注(0)|答案(2)|浏览(233)

我的jenkinsfile包含像这样的阶段:

  1. stages {
  2. stage('init'){
  3. steps {
  4. sh 'do-init'
  5. }
  6. }
  7. stage('region1') {
  8. stages {
  9. stage('build') {
  10. steps{
  11. script {
  12. dir("testing"){
  13. build(region:'region1', labels:"label1")
  14. }
  15. }
  16. }
  17. }
  18. stage('delete') {
  19. steps{
  20. script {
  21. dir ("testing"){
  22. delete('region1')
  23. }
  24. }
  25. }
  26. }
  27. }
  28. }
  29. stage('region2') {
  30. // repeat region1 stage for region2, label2 - edited for brevity
  31. }
  32. }

字符串
有没有可能将内部的“region stage”重构为一个共享库,然后在script {}块中调用它两次?
到目前为止,我的尝试都以常见的DSL错误“stages not found in steps”结束

kknvjkwl

kknvjkwl1#

是的,这是有可能实现你想要的,你只需要确保在共享库函数中,你使用的是脚本管道语法,而不是减速语法。
例如,在您的管道中,您可以执行以下操作:

  1. stages {
  2. stage('init'){
  3. steps {
  4. sh 'do-init'
  5. }
  6. }
  7. stage('region1') {
  8. steps {
  9. buildAndDelete('region1', 'label1') // or using the Map version buildAndDelete region: 'region1', labels: 'label1'
  10. }
  11. stage('region2') {
  12. steps {
  13. buildAndDelete('region2', 'label2')
  14. }
  15. }
  16. }

字符串
现在,在您的共享库vars文件夹中,您将拥有一个名为buildAndDelete.groovy的文件,其内容如下:

  1. def call(Map params) {
  2. call(params.region, params.labels)
  3. }
  4. def call(String region, String labels) {
  5. stage('build') {
  6. dir("testing"){
  7. build(region: region, labels:labels)
  8. }
  9. }
  10. stage('delete') {
  11. dir("testing"){
  12. delete(region)
  13. }
  14. }
  15. }


当然,您可以根据需要更改输入参数。

展开查看全部
9lowa7mx

9lowa7mx2#

我得到了同样的问题,而试图使一个动态的多个小阶段内的一个大阶段。你可以得到的原因,你得到DSL错误“阶段未找到步骤”的问题与id 42113655
换句话说,在我的例子中,我用输入参数创建了一个新的管道,所以当我想重用相同的阶段时,jenkins使用pipeline-build-step plugin和重要参数触发第二个管道
如果您有一个很长的区域列表,可以将我的解决方案与jenkinsfile中的一个循环结合起来,以获得动态数量的区域。

相关问题