簡體   English   中英

Jenkins Artifactory 插件 - 從共享庫上傳

[英]Jenkins Artifactory plugin - upload from shared library

我使用腳本化管道中的 Jenkins Artifactory 插件將工件上傳到 Artifactory。 管道代碼是這樣的:

def uploadSpec = ...
def artifactory = Artifactory.server 'myTag'
def buildInfo = server.upload(JsonOutput.toJson(uploadSpec))
server.publishBuildInfo buildInfo

這一直運行良好,但是在許多其他代碼中,這已在多個項目中重復。 我現在正在提取所有常見代碼並將其放入 Jenkins 共享庫中。 我讓其他一切都可以工作,但是我正在努力讓人工制品工作。 我已經嘗試了各種不同的錯誤。 我最后一次嘗試是這樣的:

def server = getArtifactoryServer serverTag
server.upload(JsonOutput.toJson(myUploadSpec))

這會導致NullPointerException ,我將其跟蹤(在插件源代碼中)到cpsScript變量,該變量未設置。 我嘗試使用此處定義的upload步驟:

def buildInfo = artifactoryUpload(
        spec: myUploadSpec,
        buildInfo: new BuildInfo(),
        module: null,
        failNoOp: false,
        server: server
)

然而,這會導致不同的錯誤:

 WARNING: Unknown parameter(s) found for class type 'org.jfrog.hudson.pipeline.scripted.steps.UploadStep': module
 org.kohsuke.stapler.NoStaplerConstructorException: There's no @DataBoundConstructor on any constructor of class java.lang.String
    at org.kohsuke.stapler.ClassDescriptor.loadConstructorParamNames(ClassDescriptor.java:265)
    at org.jenkinsci.plugins.structs.describable.DescribableModel.<init>(DescribableModel.java:153)
    at org.jenkinsci.plugins.structs.describable.DescribableModel.coerce(DescribableModel.java:474)
    at org.jenkinsci.plugins.structs.describable.DescribableModel.buildArguments(DescribableModel.java:409)
    at org.jenkinsci.plugins.structs.describable.DescribableModel.instantiate(DescribableModel.java:329)
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:269)
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:179)
    at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:122)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)
 Caused: java.lang.IllegalArgumentException: Could not instantiate {spec={files=[{pattern=Vertx365/Production/build/vertx365-production-3.37.0.zip, target=vertx-release/com/bunzl/vertx/release/vertx365/vertx365-production/3.37.0/}, {pattern=Vertx365/QA/build/vertx365-qa-3.37.0.zip, target=vertx-release/com/bunzl/vertx/release/vertx365/vertx365-qa/3.37.0/}, {pattern=VertxBCSS/Production/build/vertxbcss-production-3.37.0.zip, target=vertx-release/com/bunzl/vertx/release/vertxbcss/vertxbcss-production/3.37.0/}, {pattern=VertxBCSS/QA/build/vertxbcss-qa-3.37.0.zip, target=vertx-release/com/bunzl/vertx/release/vertxbcss/vertxbcss-qa/3.37.0/}, {pattern=VertxBIM/Production/build/vertxbim-production-3.37.0.zip, target=vertx-release/com/bunzl/vertx/release/vertxbim/vertxbim-production/3.37.0/}, {pattern=VertxBIM/QA/build/vertxbim-qa-3.37.0.zip, target=vertx-release/com/bunzl/vertx/release/vertxbim/vertxbim-qa/3.37.0/}, {pattern=VertxCatering/QA/build/vertxcatering-qa-3.37.0.zip, target=vertx-release/com/bunzl/vertx/release/vertxcatering/vertxcatering-qa/3.37.0/}, {pattern=VertxLockhart/Production/build/vertxlockhart-production-3.37.0.zip, target=vertx-release/com/bunzl/vertx/release/vertxlockhart/vertxlockhart-production/3.37.0/}, {pattern=VertxLockhart/QA/build/vertxlockhart-qa-3.37.0.zip, target=vertx-release/com/bunzl/vertx/release/vertxlockhart/vertxlockhart-qa/3.37.0/}]}, buildInfo=org.jfrog.hudson.pipeline.common.types.buildInfo.BuildInfo@caaf82, failNoOp=false, module=null, server=org.jfrog.hudson.pipeline.common.types.ArtifactoryServer@1e1cacd} for org.jfrog.hudson.pipeline.scripted.steps.UploadStep
    at org.jenkinsci.plugins.structs.describable.DescribableModel.instantiate(DescribableModel.java:334)
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:269)
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:179)
    at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:122)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)
    at com.bunzl.pipeline.artifactory.Artifactory.uploadFiles(Artifactory.groovy:10)
    at com.bunzl.pipeline.artifactory.Artifactory.uploadFiles(Artifactory.groovy)
    at WorkflowScript.run(WorkflowScript:117)
    at ___cps.transform___(Native Method)
    at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:86)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:113)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:83)
    at sun.reflect.GeneratedMethodAccessor134.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.CollectionLiteralBlock$ContinuationImpl.dispatch(CollectionLiteralBlock.java:55)
    at com.cloudbees.groovy.cps.impl.CollectionLiteralBlock$ContinuationImpl.item(CollectionLiteralBlock.java:45)
    at sun.reflect.GeneratedMethodAccessor143.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.LocalVariableBlock$LocalVariable.get(LocalVariableBlock.java:39)
    at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
    at com.cloudbees.groovy.cps.impl.LocalVariableBlock.evalLValue(LocalVariableBlock.java:28)
    at com.cloudbees.groovy.cps.LValueBlock$BlockImpl.eval(LValueBlock.java:55)
    at com.cloudbees.groovy.cps.LValueBlock.eval(LValueBlock.java:16)
    at com.cloudbees.groovy.cps.Next.step(Next.java:83)
    at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
    at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
    at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:129)
    at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:268)
    at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:51)
    at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:185)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:400)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$400(CpsThreadGroup.java:96)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:312)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:276)
    at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:67)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
    at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
    at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

當然,我可以在ArtifactoryServer中檢索ArtifactoryServer對象,然后將其傳遞到共享庫調用中,但這是錯誤的設計。

那么,我怎樣才能在共享庫中實現我需要的東西(即,將工件上傳到具有指定標簽的服務器)?

關於如何讓這個工作的任何想法?

編輯:根據評論中的請求,我有這個結構(對於調用 artifactory 的類):

+
|
+- src
    |
    +- com
        |
        +- mycompany
            |
            +- mypackage
                |
                +- Artifactory.groovy

這是此類中的代碼(替換了私有/專有位):

package com.mycompany.mypackage

import groovy.json.JsonOutput

def uploadFiles(String serverTag, List files, boolean buildInfoPublish = true) {
    def server = getArtifactoryServer serverTag
    def buildInfo = server.upload(JsonOutput.toJson([files: files]))

    if (buildInfoPublish) {
        publishBuildInfo buildInfo: buildInfo, server: server
    }
}

該庫在 Jenkins 中定義為一個名為config-library的全局config-library ,並且正在使用/調用如下:

def configLibrary = library('config-library@my-version')
def artifactory = configLibrary.com.mycompany.mypackage.Artifactory.new()
def files = ...
artifactory.uploadFiles('myTag', files)

在調試了插件的本地安裝后,我終於想通了。 顯然, artifactoryUpload期望spec參數是一個 JSON 字符串,而不是一個對象。 所以,解決方案很簡單:

def server = getArtifactoryServer serverTag
def buildInfo = artifactoryUpload(
        spec: JsonOutput.toJson(myUploadSpec),
        buildInfo: new BuildInfo(),
        module: null,
        failNoOp: false,
        server: server
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM