小编Joe*_*g S的帖子

获取Jenkins Pipeline插件中工作空间目录的绝对路径

我目前正在对Jenkins Pipeline插件(以前称为Workflow插件)进行一些评估.阅读文档我发现我目前无法使用env.WORKSPACE以下方法检索工作区路径 :

工作流脚本中当前不可使用以下变量:

NODE_LABELS

工作区

特定于SCM的变量,例如SVN_REVISION

有没有其他方法如何获得当前工作区的绝对路径?我需要运行一些测试,然后获取一些参数(一些可执行文件的绝对路径).我已经尝试new File("").absolutePath()在一个@NonCPS部分内部使用,但看起来非CPS的东西总是在主服务器上执行.

有没有人知道如何在运行某些批处理脚本的情况下获取此路径,该脚本将路径存储到某个文件中,以后可以再次读入该文件?

jenkins jenkins-workflow jenkins-pipeline

54
推荐指数
3
解决办法
11万
查看次数

为常规执行调整groovy CPS闭包

我们在一些工作中动态创建并行步骤.感谢这个线程,我找到了如何动态创建带有参数的地图,以便在并行步骤中使用.

但是现在我想重用用于创建这些并行步骤的代码部分.为此,我觉得我需要为闭合咖喱做准备.

然而,currying似乎无法正常工作.在闭包内引用循环变量(valueCopy)做了正确的事情(如这里所提到的)但是currying并没有达到我的预期.

我做错了什么,这是不是(还)支持,是否有任何解决方法?这可能是Jenkins管道中的一个错误吗?

希望任何人都知道为什么这不起作用和/或如何让它工作.

Jenkins:LTS(2.32.1)及最新的插件更新截至2017/01/19.

解:

升级到Pipeline后:Groovy插件版本2.40 eveything正在按预期工作.

管道脚本执行:

def echoSome(val) {
    echo val
}

def buildClosures() {
    def someList = ["1", "2", "3"]
    def closures = [:]
    for (value in someList) {
        final valueCopy = value

        closures[value] = {val ->
                echo valueCopy.toString()
                echo val.toString()
            }.curry(value)
    }
    closures
}

parallel buildClosures()
Run Code Online (Sandbox Code Playgroud)

输出:

[Pipeline] parallel
[Pipeline] [1] { (Branch: 1)
[Pipeline] [2] { (Branch: 2)
[Pipeline] [3] { (Branch: 3)
[Pipeline] [1] echo
[1] 1
[Pipeline] …
Run Code Online (Sandbox Code Playgroud)

parallel-processing closures currying jenkins jenkins-pipeline

9
推荐指数
2
解决办法
1369
查看次数

如何禁用 Jenkins Pipeline 阶段视图插件

我遇到了 Jenkins Pipeline 阶段视图插件的问题:

问题

我们有一些工作使用了大量的阶段,大约有 500 多个阶段。

不幸的是,这意味着当打开工作主页时,浏览器卡住了。到目前为止,唯一能够向我展示工作经典视图主页的浏览器是 chrome。所有其他人都完全失败了。

因此,我想找到一种方法来完全禁用舞台视图。但是看起来 Pipeline 插件依赖于它。我已经尝试设置,com.cloudbees.workflow.rest.external.JobExt.maxRunsPerJob=0但没有按预期工作。至少在设置时com.cloudbees.workflow.rest.external.JobExt.maxRunsPerJob=1它只会显示最后一次运行,这是一个小的性能改进。

有没有办法如何禁用舞台视图(插件),以便能够看到那个疯狂工作的主页,不幸的是现在必须有那么多(> 500)个阶段?

jenkins jenkins-pipeline

8
推荐指数
0
解决办法
629
查看次数

Jenkins多分支管道不会修剪已删除的分支

当前,我们在一个Jenkins实例(生产性实例)中用于处理多分支测试作业的bitbucket分支源插件遇到了一些麻烦:

在詹金斯中,与已删除分支相关的所有作业都不会被删除。显示为禁用。

检查Scan Multibranch Pipeline Log我发现以下条目:

Will not remove foobranch because it is new
Will not remove PR-1 because it is new
Will not remove bar because it is new
Will not remove freeDiskSpaceHack because it is new
Run Code Online (Sandbox Code Playgroud)

我们还有另一个实例(测试实例),所有实例都按预期工作-分支会立即删除,例如,在日志中看到以下内容:

Will remove freeDiskSpaceHack
Will remove foo
Run Code Online (Sandbox Code Playgroud)
  • 对于这两个实例,我们使用相同的Jenkins版本(2.212.2)和插件版本。
  • 两个实例中的作业对Bitbucket分支源插件使用相同的设置:

分支源插件设置

  • 有一个区别:两个作业在bitbucket中使用不同的存储库;我们的测试实例(作业被删除)的一个是另一个实例的一个。

除此之外,没有区别。

我的问题是:

  • 为什么它不适用于我们的生产实例?有什么秘密设置吗?
  • 日志想告诉我什么:Will not remove <branch> because it is new

希望任何人都有头绪。

jenkins jenkins-pipeline multibranch-pipeline

7
推荐指数
1
解决办法
5080
查看次数

如何参数化 Jenkins 管道中复制工件的选择器

我们在 Jenkins 系统中大量使用管道作业,并且需要能够copyArtifacts使用Build selector for Copy Artifact作业参数对步骤进行参数化。

首先,我发现 - 虽然参数返回 a String- 该copyArtifacts步骤需要BuildSelector.

我找到了BuildSelectorParameter.getSelectorFromXml将参数转换为BuildSelector类似实例的方法:

properties([parameters([
    [$class: 'BuildSelectorParameter',
    defaultSelector: upstream(fallbackToLastSuccessful: true),
    description: '',
    name: 'copyArtifactSelector']])
])

@NonCPS
static BuildSelector getSelectorFromParam(String xmlText) {
    BuildSelectorParameter.getSelectorFromXml(xmlText)
}

node {
    def selector = getSelectorFromParam(params.copyArtifactSelector)
    copyArtifacts(
            projectName: 'sourceJob',
            selector: selector
    )
}
Run Code Online (Sandbox Code Playgroud)

但是我刚刚意识到BuildSelector创建的不是Serializable. 因此,我现在得到了预期的异常:

hudson.plugins.copyartifact.TriggeredBuildSelector
导致:java.io.NotSerializableException:hudson.plugins.copyartifact.TriggeredBuildSelector
    在 org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
    在 org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    在 org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
    在 org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
    在 org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)

之后,我尝试检查复制工件插件如何处理 - 不幸的是我在源代码中找不到任何线索。也许它只是偶然起作用?创建 …

jenkins jenkins-plugins jenkins-pipeline

5
推荐指数
1
解决办法
5402
查看次数

如何在 Jenkins 文件中声明多个代理,然后在后续阶段引用它们?

我正在尝试运行一个包含多个代理的 jenkins 文件,但遇到了错误。这是我的詹金斯文件的片段:

pipeline {
    agent {
        docker {
            label 'agentAAA'
            ...
        }
        node {
            label 'agentBBB'
            ...
        }
    }
    ...
    stages {
        stage('to run on AAA') {
            agent {
                label 'agentAAA'
            }
            ...
        }
        stage('to run on BBB') {
            agent {
                label 'agentBBB'
            }
            ...
        }
        stage('to run on BBB') {
            agent {
                label 'agentBBB'
            }
            ...
        }
Run Code Online (Sandbox Code Playgroud)

我收到这些错误:

  • 每个代理部分仅允许一种代理类型
  • 未指定代理类型。必须是 [any、docker、dockerfile、label、none] 之一

我在文档中找不到任何有关如何引用先前声明的代理的示例。我了解如何在每个单独的阶段声明代理,但最终我的文件中会出现许多重复的声明。

jenkins jenkins-pipeline jenkins-declarative-pipeline

2
推荐指数
1
解决办法
1万
查看次数