Jenkins Pipeline sh 显示名称/标签

Posted

技术标签:

【中文标题】Jenkins Pipeline sh 显示名称/标签【英文标题】:Jenkins Pipeline sh display name/label 【发布时间】:2017-01-17 19:15:05 【问题描述】:

使用 Jenkins 2 流水线插件,有一个有用的功能允许快速概览流水线阶段和步骤状态,包括日志输出。

但是,如果您使用“Shell 脚本”(sh) 步骤,似乎没有办法用有用的名称标记该脚本,因此显示屏仅显示一长串“Shell 脚本”(如下图所示)。

如何指定一个有用的名称,或者如何使用其他步骤来达到相同的效果?

【问题讨论】:

【参考方案1】:

2019 年 2 月更新

根据gertvdijk's answer below,现在可以assign an optional label to the sh step,从v2.28开始,对于那些还不能升级的人,还有一个解决方法。详情及cmets请查看his answer!


以前的版本(悬停查看):

据我所知,目前这是不可能的。在詹金斯 跟踪器,有一个Name or alias Shell Script Step (sh) 问题 这与您的情况类似:

sh 步骤在管道中添加了一个“Shell 脚本”步骤。然而, 可能有多个这样的步骤,包括来自不同的步骤 插件(例如 Docker),这使得很难区分步骤。 我们或许应该向 sh 添加一个可选参数来指定名称或 然后将出现在管道步骤中的别名。 例如,以下可能是 npm 的步骤,显示为“Shell 脚本:npm”在管道视图中。sh cmd:"npm install", name: "npm"
但是,它作为旧的 Allow stage to operate as a labelled block 的副本被关闭了,最近已修复,并且 似乎包含在v2.2 of the pipeline-stage-step-plugin (see changelog). 似乎现在可以嵌套阶段,它们将出现在 查看表,但我认为这不是您要查找的内容。

【讨论】:

嵌套阶段只会按发现它们的时间顺序显示它们,所以我想说你不能正确地“嵌套阶段” 只要我们在 UI 中获得人类可读的描述,而不仅仅是“Shell 脚本”,我不在乎它是如何完成的。我将尝试关注报告的变更日志,看看我们是否有任何运气。 我们已尝试但找不到嵌套阶段的正确语法:gist.github.com/goofballLogic/abd62cd1e0a700c8d849ed2f7038e338 @goofballLogic 确实,它们在表中显示为 Pom12 也提到的列。因此,如果您在阶段中有多个步骤,则无法指定名称,我说这可能就是您要查找的内容,并且目前无法实现您想要的内容。恕我直言,我提到的问题应该仍然存在,并提供了不同的修复... 现在已经实现,见my answer。【参考方案2】:

嗯,绝望的时候需要绝望的措施。如果你可以使用蓝海,你可以使用单执行线的并行步骤。

        parallel(
            "This is my step name" : 
                sh 'env'
            
        )

【讨论】:

WorkflowScript: 40: 使用了无效的步骤“parallel” - 在这种情况下不允许 - 并行步骤只能用作阶段步骤块中的唯一***步骤 并行使用并行吗?你能举出你的例子吗? 是的,这解决了命名问题,但它并行执行所有内容,如果您需要执行后续步骤,它不适合。【参考方案3】:

我也在尝试同样的事情,但在不同的上下文中,我的团队不希望日志 UI 上有多个 sh 日志窗口,所以我确实尝试在一行中使用多个 UNIX 命令 例如 jenkinsPipeline.sh "echo \"PATH: $PATH\";java -version;echo PROJ DIR = $projectDirectory;env > env.txt;cat env.txt;ls && cd $projectDirectory && gradle --refresh-dependencies clean assemble" 它适用于 Jenkins 工作中的 Jenkins 管道脚本。 但是如果我使用共享库来扩展管道和相同的策略,那么它就无法正常工作,或者像往常一样为 sh 登录 UI 创建多个窗口。

【讨论】:

【参考方案4】:

试试这个,很好的解决方法

import org.jenkinsci.plugins.workflow.cps.CpsThread
import org.jenkinsci.plugins.workflow.actions.LabelAction


    def test() 
    def xyz = "Prints PWD"
    try 
        sh script: 'pwd'
    
    finally 
        CpsThread.current().head.get().addAction(new LabelAction("Shell script $xyz "))
    

【讨论】:

【参考方案5】:

它并不完美,但我通常发现添加一个 echo 步骤来描述以下 bat 或 sh 步骤试图完成的内容就足够了。以前从未见过的人应该能够很快弄清楚。

echo "Testing with Ping"
bat "ping www.***.com"
echo "Getting IPs"
bat "nslookup www.***.com"

【讨论】:

【参考方案6】:

根据 Sandy 的出色回答,我创建了一个小脚本包装器,将 sh 步骤封装在 try/finally 块中。

基本用法:

wrapper.script script: 'echo the invisible script', returnStdout: true, stepName: "description #1"

将显示“描述 #1”而不是通用文本。

完整的源代码和安装说明在这里 https://github.com/ael-computas/jenkins-script-wrapper

可以轻松地作为库安装在您的 jenkins 服务器上。

【讨论】:

【参考方案7】:

"Pipeline Nodes and Processes Plugin" 的 2.28+ 版本现在为sh step 增加了label 选项,现在带有JENKINS-55410:

标签(可选)

要在管道步骤视图中显示的标签和步骤的蓝海详细信息,而不是步骤类型。因此,该视图更有意义且特定于领域,而不是技术性的。

类型:字符串

例如:

sh script: "echo foo", label: "my step"

如果您还不能升级,另一种选择是使用Labelled Pipeline Steps plugin。

【讨论】:

【参考方案8】:
sh "echo foo", label: "my step"

不适合我,

必须是:

sh script: "echo foo", label: "my step"

https://***.com/a/54787322/6847446

【讨论】:

以上是关于Jenkins Pipeline sh 显示名称/标签的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins的pipeline

49-Jenkins-本地进行Pipeline语法检查

49-Jenkins-本地进行Pipeline语法检查

使用环境变量加载文件 Jenkins Pipeline

[Jenkins] Define a pipeline

jenkins DSL pipeline timeout设置