当前位置: 首页 > 知识库问答 >
问题:

Jenkins管道-如何在不首先调用node()的情况下加载Jenkins文件?

平航
2023-03-14

我有一个独特的设置,需要能够动态加载位于我正在构建的src之外的Jenkinsfiles。JenkinsFile本身通常调用node(),然后调用一些构建步骤。这会导致不必要地消耗多个执行器,因为我需要已经调用node(),以便使用加载步骤来运行Jenkinsfile,或者如果我将Jenkinsfile读取为字符串并执行它,则执行groovy。

我今天在工作UI中拥有的内容:

@Library(value='myGlobalLib@head', changelog=fase) _

node{
    load "${JENKINSFILES_ROOT}/${PROJECT_NAME}/Jenkinsfile"
}

加载的Jenkinsfile通常也调用node()。例如:

node('agent-type-foo'){
    someBuildFlavor{
        buildProperty = "some value unique to this build"
        someConfig = ["VALUE1", "VALUE2", "VALUE3"]
        runTestTarget = true
    }
}

这将导致在管道运行期间消耗2个执行器。理想情况下,我加载Jenkinsfiles时不首先调用node(),但每当我尝试时,都会收到一条错误消息,说明:

"Required context class hudson.FilePath is missing
Perhaps you forgot to surround the code with a step that provides this, such as: node"

有没有办法在没有hudson的情况下加载Jenkinsfile或执行groovy。文件路径上下文?我似乎在医生身上找不到任何东西。我现在要对Jenkins文件进行预处理,以删除它们对node()的初始调用,并使用Jenkins文件使用的值调用node(),然后加载文件的其余部分,但这对我来说太脆弱了。

共有1个答案

凌展
2023-03-14

使用load步骤时Jenkins评估文件。您可以将Jenkinsfile的逻辑包装到一个函数中(在我的示例中名为run()),以便它会加载但不会自动运行。

def run() {
    node('agent-type-foo'){
        someBuildFlavor{
            buildProperty = "some value unique to this build"
            someConfig = ["VALUE1", "VALUE2", "VALUE3"]
            runTestTarget = true
        }
    }
}

// This return statement is important in the end of Jenkinsfile
return this 

从工作脚本中调用它,如下所示:

def jenkinsfile
node{
    jenkinsfile = load "${JENKINSFILES_ROOT}/${PROJECT_NAME}/Jenkinsfile"
}
jenkinsfile.run()

这样,就不再有嵌套的节点块,因为第一个块在调用函数之前被关闭。

 类似资料:
  • 问题内容: 我需要在Jenkins Pipeline中解析一些JSON并在循环中调用一些常规方法,但是脚本始终在第一个函数调用后退出。这该怎么做? 在上面的示例中,即使使用json对象,例如: …管道总是在第一次迭代后退出。据推测这是由于混合了同步和异步功能。有什么办法吗? 问题答案: 我已经通过执行以下操作基本上解决了此问题: 使用完JsonSlurper实例后,立即销毁它,删除@NonCPS批

  • 我目前正在尝试从jenkins管道中的文件加载一个自定义groovy类。我尝试了这里提出的解决方案: 如何在Jenkins管道中导入类文件? 作为... JenkinsPipelineUtilityClass.groovy 詹金斯档案 并尝试同样使用GroovyClassLoader(再次使用上述类) 詹金斯档案 我在这两方面都遇到了同样的错误: 我已经检查了正在进行的脚本批准,里面什么都没有,我

  • 问题内容: 使用Selenium WebDriver for Java,是否可以在给定URL的情况下获取网页的HTML? 我知道,一旦在浏览器中加载了网页,就可以使用WebDriver.getPageSource()获得HTML。但是,为了提高效率,是否可以在不先将页面加载到浏览器中的情况下获取HTML? 问题答案: 您可以使用无头浏览器来实现。 无头浏览器是没有图形用户界面的Web浏览器。 该程

  • 我正在尝试创建一个定制的Jenkins管道,它将多个Jenkins作业生成的工件绑定在一起。每个作业都在不同的存储库上运行(基于它们自己的文件)。这些Jenkins文件的阶段完成了创建档案、编译代码等任务。 有人可能会说,我可以使用单个作业中的工件,然后将它们绑定在一起,但问题是这个高级管道将在特定的 ,因此它无法凭空创建存档。 由于我是詹金斯管道公司的新手,您对如何解决这个问题有什么建议吗? 最

  • 当我在Jenkins从属上运行以下代码段时,它可以工作。但是当它在没有BASH的docker容器中执行时,就不会设置“$test”。 https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-withenv-code-set-environment-variables

  • 问题内容: 我有一个包含类的文件。范例: 我想将文件导入到我的Jenkins管道脚本中,因此可以创建我的一个类的对象。例如 : 如何在Jenkins Pipeline中导入文件?谢谢。 问题答案: 您可以这样: Classs.groovy 管道: