首页 > 解决方案 > 在 Jenkins Pipeline 中导入具有常量的类时出错

问题描述

我正在遵循如何在 Jenkins Pipeline 中导入具有常量的类中的方法?

我使用类似的代码,但得到以下错误:

WorkflowScript: 5: unable to resolve class ru.foo.bar.Const
 @ line 5, column 1.
   import ru.foo.bar.Const
   ^

1 error

    at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
    at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:958)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:605)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:554)
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
    at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
    at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:133)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:126)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:561)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:522)
    at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:320)
    at hudson.model.ResourceController.execute(ResourceController.java:97)
    at hudson.model.Executor.run(Executor.java:429)

代码如下:

src/ru/foo/bar/Const.groovy

package ru.foo.bar

class Const {
    public static final String BITBUCKET_LOGIN = "DEV_LOGIN"
    public static final String BITBUCKET_PASS = "DEV_PASS"
}
return new Const()
import ru.foo.bar.Const

pipeline {
  stages {
    stage('init') {
      steps {
        script {
          println("${Const.BITBUCKET_LOGIN}")
        }
      }

    } /* 'ais refstack parallel builds' */
}

我的用法有什么不正确的吗?

标签: jenkinsgroovy

解决方案


实际上,您需要使该类对您的Jenkinsfile. 据我了解,这import还不够。

检查相关的詹金斯文档

也可以使用 src/ 目录中的类,但比较棘手。@Library 注释在编译之前准备脚本的“类路径”,当遇到库步骤时,脚本已经被编译。因此,您不能导入或以其他方式“静态”引用库中的类型。

但是,您可以动态使用库类(无需类型检查),通过库步骤的返回值中的完全限定名称访问它们。可以使用类似 Java 的语法调用静态方法:

library('my-shared-library').com.mycorp.pipeline.Utils.someStaticMethod()

您还可以访问静态字段,并像调用名为 new 的静态方法一样调用构造函数:

def useSomeLib(helper) { // dynamic: cannot declare as Helper
    helper.prepare()
    return helper.count()
}

def lib = library('my-shared-library').com.mycorp.pipeline // preselect the package

echo useSomeLib(lib.Helper.new(lib.Constants.SOME_TEXT))

但是您的代码段表明您正在处理凭据。您应该认真考虑妥善处理它们。

    environment {
        BITBUCKET = credentials('bitbucket')
    }

推荐阅读