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

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

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

【问题讨论】:

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

标签: jenkins groovy jenkins-pipeline jenkins-groovy jenkins-declarative-pipeline


【解决方案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 我问了这个问题,这里有一些答案:stackoverflow.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 方法中?
猜你喜欢
  • 1970-01-01
  • 2022-10-27
  • 2017-12-03
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2018-10-26
  • 2017-08-12
  • 2021-01-15
相关资源
最近更新 更多