如何在 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 声明式管道中创建方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 Maven 和 Docker 的 Jenkins 声明式管道中执行 SonarQube 扫描仪
如何使用声明性 Jenkins 管道在同一节点上运行多个阶段?