#jenkins #gradle #groovy #jenkins-pipeline
#дженкинс #gradle #groovy #дженкинс-конвейер
Вопрос:
Я пытаюсь настроить конвейер Дженкинса с помощью Jenkinsfile, который вызывает методы из самореализованной глобальной разделяемой библиотеки с @Library("name-of-library")
во главе файла Jenkinsfile.
Однако библиотека, которую я использую, — это заводной проект, организованный Gradle. То есть у нас есть build.gradle
в корне всего репозитория библиотеки, где определены зависимости.
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.4.15'
compile group: 'commons-io', name: 'commons-io', version: '2.6'
compile group: 'eu.agno3.jcifs', name: 'jcifs-ng', version: '2.1.1'
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.8.0-beta4'
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-all:1.9.5'
testCompile group:'com.lesfurets', name:'jenkins-pipeline-unit', version:'1.0'
}
Когда мы запустили сборку на основе конвейера, описанного выше, мы обнаружили, что Дженкинс может не распознать build.gradle
, что приводит к следующим ошибкам:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
file:/var/lib/jenkins/jobs/test-pipeline/builds/4/libs/name-of-library/src/com/test/model/SMBConnection.groovy: 4: unable to resolve class jcifs.context.BaseContext
@ line 4, column 1.
import jcifs.context.BaseContext
^
file:/var/lib/jenkins/jobs/test-pipeline/builds/4/libs/name-of-library/src/com/test/model/SMBConnection.groovy: 5: unable to resolve class jcifs.config.BaseConfiguration
@ line 5, column 1.
import jcifs.config.BaseConfiguration
^
file:/var/lib/jenkins/jobs/test-pipeline/builds/4/libs/name-of-library/src/com/test/model/SMBConnection.groovy: 3: unable to resolve class jcifs.CIFSContext
@ line 3, column 1.
import jcifs.CIFSContext
^
3 errors
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.GroovyClassLoader.parseClass(GroovyClassLoader.java:254)
at groovy.lang.GroovyClassLoader.recompile(GroovyClassLoader.java:761)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:718)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:787)
at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell$TimingLoader.loadClass(CpsGroovyShell.java:158)
at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:677)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:545)
at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:185)
Caused: BUG! exception in phase 'semantic analysis' in source unit 'WorkflowScript' The lookup for com.test.controller.factory.CustboxFacadeFactory caused a failed compilaton. There should not have been any compilation from this call.
at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:190)
at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:170)
at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:126)
at org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:676)
at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:313)
at org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1245)
at org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:176)
at org.codehaus.groovy.control.CompilationUnit$12.call(CompilationUnit.java:663)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:943)
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:131)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:125)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:560)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:521)
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)
Finished: FAILURE
Я попытался добавить эти зависимости в начало Jenkinsfile с grape
обозначением.
@Grapes([
@Grab(group='commons-io', name='commons-io', version='2.6'),
@Grab(group='eu.agno3.jcifs', name='jcifs-ng', version='2.1.1'),
@Grab(group='org.slf4j', name='slf4j-api', version='1.8.0-beta4')
])
Однако это ничему не помогает.
Поскольку библиотека, которую я использую, содержит сотни файлов groovy, я не думаю, что добавление обозначения grape в начале каждого файла groovy является хорошей идеей.
Я также попытался преобразовать build.gradle
в pom.xml
и поместить его в корень репозитория библиотеки. Однако это тоже ничему не помогает.
Есть ли что-нибудь, что я могу попробовать, не переписывая этапы конвейера в задачи gradle и не используя sh('./gradlew task-name')
в Jenkinsfile?