如何在 Jenkins 声明式管道中创建方法?

Posted

技术标签:

【中文标题】如何在 Jenkins 声明式管道中创建方法?【英文标题】:How to create methods in Jenkins Declarative pipeline? 【发布时间】:2018-05-17 14:47:53 【问题描述】:

在 Jenkins 脚本化管道中,我们能够创建方法并调用它们。

在 Jenkins 声明性管道中也可以吗?怎么做?

【问题讨论】:

是的,这是可能的。 你能分享一下语法吗提前谢谢 Jenkins 流水线是 Groovy 脚本。所以你只需要遵循 Groovy 语法。 实际上,直到几个版本之前,声明式管道都无法做到这一点。 我会很感激一个例子,因为范围界定似乎有效果。 【参考方案1】:

较新版本的声明式管道支持这一点,而这在之前是不可能的(~2017 年中期)。您可以按照 groovy 脚本的预期声明函数:

pipeline 
    agent any
    stages 
        stage('Test') 
            steps 
                whateverFunction()
            
        
    


void whateverFunction() 
    sh 'ls /'

【讨论】:

我能够让它工作,但是它消除了在 Blue Ocean GUI 编辑器中编辑管道的能力。你知道解决办法吗?我直接通过文本编辑器在 Jenkinsfile 中进行大部分编辑,但是能够在 UI 中快速地存根是件好事。我通过暂时注释掉这个函数来解决这个问题。 我正在尝试定义一个定义阶段的函数,但这似乎不起作用(语法错误应为“阶段”)。它们是否只支持定义步骤的运行函数? 这真的很酷。但是,这是在哪里记录的?我找不到任何描述这种能力的资源。我只找到如何导入外部共享 groovy 库的文档。我只找到将它们嵌入 Jenkinsfile 本身的 SO 答案,这非常有用。 Jenkins 问题跟踪器,提案收到 wontfix 状态,例如:issues.jenkins-ci.org/browse/JENKINS-41396 @WillBrode 我也对定义/配置整个舞台的功能感兴趣。据我了解,声明式管道解析器根本不允许这种类型的语法灵活性:issues.jenkins-ci.org/browse/JENKINS-49135您在这方面取得了成功吗? @carlos 我问了这个问题,这里有一些答案:***.com/questions/50634592/…【参考方案2】:

你可以像这样创建一个 groovy 函数并将其保存在你的 git 中,它应该被配置为托管库(也可以在 jenkins 中配置它):

/path/to/repo-shared-library/vars/sayHello.groovy:

内容:

def call(String name = 'human') 
    echo "Hello, $name."

您可以使用以下方法在管道中调用此方法:

@Library('name-of-shared-library')_
pipeline 
    agent any
    stages 
        stage('test') 
            steps 
                sayHello 'Joe'
            
        
    

输出:

[Pipeline] echo
Hello, Joe.

您可以重用您保存在库中的现有函数。

【讨论】:

我似乎找不到“步骤不采用单个必需参数 - 改用命名参数”的答案,我在方法调用时遇到此错误 如果你想在一个 groovy 中拥有多个函数怎么办?还是建议每个函数有一个 groovy? @ealeon 您可以在共享库中拥有多个函数并从管道内部调用它们【参考方案3】:

您还可以拥有包含所有功能的单独 groovy 文件(只是为了保持结构和整洁),您可以使用管道将其加载到文件中:

JenkinsFile.groovy

Map modules = [:]
pipeline 
    agent any
    stages 
        stage('test') 
            steps 
                script
                    modules.first = load "first.groovy"
                    modules.first.test1()
                    modules.first.test2()
                
            
        
    

first.groovy

def test1()
    //add code for this method

def test2()
    //add code for this method

return this

【讨论】:

您能解释一下return this 声明吗?为什么有必要? 这也可以通过定义每个文件的保存位置来更清楚地说明,相对于另一个。 jenkins.io/doc/pipeline/steps/workflow-cps 我猜 load "first.groovy" 将执行 groovy 脚本,而 "return this" 将返回对包含方法的脚本的引用,否则您将无法获得引用到方法。【参考方案4】:

这对我有用。它可以使用 Blue Ocean GUI 查看,但是当我使用 Blue Ocean GUI 进行编辑时,它会删除方法“def showMavenVersion(String a)”。

pipeline 
agent any
stages 
    stage('build') 
        agent any
        steps 
            script 
                showMavenVersion('mvn version')
            
        
    




def showMavenVersion(String a) 
        bat 'mvn -v'
        echo a

【讨论】:

是否有可能例如将stage('build') 移动到showMavenVersion 方法中?

以上是关于如何在 Jenkins 声明式管道中创建方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jenkins 声明式管道中设置声纳扫描仪

如何在没有 Maven 和 Docker 的 Jenkins 声明式管道中执行 SonarQube 扫描仪

如何在声明性 Jenkins 管道的各个阶段之间传递变量?

如何使用声明性 Jenkins 管道在同一节点上运行多个阶段?

如何在 Linux 中创建用于 Github 的 Jenkins SSH 密钥?

Jenkins 声明性管道 - 如果不满足某些条件而不是跳过一个阶段,如何中止整个构建?