2017-10-19 72 views
0

我需要在几个阶段之间共享一些代码,这也需要添加发布操作。要做到这一点,我想到了把一切的方法,该方法将被称为从有没有办法在声明式管道中以编程方式注入发布操作

pipeline { 
    stages { 
     stage('Some') { 
      steps { 
       script { commonCode() } 
      } 
     } 
    } 
} 

但是,我不知道我怎么会commonCode安装后的行动。文档没有提到一件事。查看代码,意味着这个DSL基本上只是在使用哈希映射,但我不知道是否有可能从该方法访问它并在运行中进行修改。

基本上我愿做这样的事情在commonCode

if (something) { 
    attachPostAction('always', { ... }) 
} else { 
    attachPostAction('failure', { ... }) 
} 

,到目前为止工作的唯一的事情是,在commonCode我做的:

try { 
... 
onSuccess() 
} catch (e) { 
onError() 
} finally { 
onAlways() 
} 

,但不知道是否有更优雅的方式...

回答

0

您可以在pipeline块之外使用常规groovy脚本。虽然我没有尝试过,但你应该能够在那里定义一个方法,然后从管道内部调用它。但方法调用不能称为步骤。您需要将其包装在脚本步骤中。但是post的操作与steps{}块的操作步骤相同,因此如果您可以在steps中使用它,则可以在帖子部分中使用它。你需要仔细观察范围,否则你最终会试图弄清楚为什么某些地方的东西是空的。

您也可以使用共享库。您可以在共享库中定义一个步骤,然后像使用steps{}块或其中一个后置块中的任何其他步骤一样使用它。

+0

我想我可能不清楚我的问题。我知道我可以在'steps'和'post'中使用步骤和其他方法(假设我在'script'中包装了一些方法)。我的问题是:我可以在“steps”中做些什么,它会以编程方式附加新的“post”动作。 –

+0

啊......这不是我所理解的。很抱歉对于这个误会。我想知道是否可以使用散列或列表来存储您想要在后期运行的某些闭包,然后在到达时运行这些闭包。我会看看我以后能否搞砸。 –

1

现在我更好地理解这个问题(我希望)...

这是一个非常有趣的想法 - 产生于前阶段的飞行您的文章的行动。

结果很简单。我尝试了一个选项(成功),将各种闭包存储在一个列表中,然后遍历列表并在后置动作中运行所有闭包。然后我做了另一个(失败),我只保存了一个闭包作为变量并运行它。两者都很好。

下面是执行此操作的代码。取消对error行的注释以模拟失败的构建。

def postSuccess = [] 
def postFailure 

pipeline { 
    agent any 
    stages { 
    stage('Success'){ 
     steps { 
      script { 
       println "Configure Success Post Steps" 
       postSuccess[0] = {echo "This is a successful build"} 
       postSuccess[1] = { 
            echo "Running multiple steps" 
            sh "ls -latr" 
            } 
      } 
     } 
    } 
    stage('Failure'){ 
     steps { 
      script { 
       println "Configure Failure Post Steps" 
       postFailure = { 
        echo "This build failed" 
        echo "Running multiple steps for failure" 
        sh """ 
         whoami 
         pwd 
        """ 
       } 
      } 
//   error "Simulate a failed build" //uncomment this line to make the build fail 
     } 
    } 
    } // stages 

    post { 
     success { 
      echo "SUCCESS" 
      script { 
       for (def my_closure in postSuccess) { 
        my_closure() 
       } 
      } 
     } 
     failure { 
      echo "FAILURE!" 
      script { 
       postFailure() 
      } 
     } 
    } 
} // pipeline 
+0

哇,这是一个非常酷的方法!是否有可能将其扩展到共享库? –

+0

根据你想怎么做,是的,我认为这可以工作。你可以从库中返回你想要的东西,并把它放到后期变量中。 –

相关问题