0

在管道作业的 Jenkinsfile 中,我需要将 javadoc jar scp 到远程主机。我整天都在为完成这项工作而苦苦挣扎,但仍然无法正常工作。

我正在尝试为此使用“sshagent”。我定义了一个“带有私钥的用户名”凭据,我从块中引用它。在该块中,我构建了一些 scp/ssh shell 命令来运行。

我在舞台上的代码块目前看起来像这样:

  println "JP_MechIdPrivateKey[${JP_MechIdPrivateKey}] class[${JP_MechIdPrivateKey.class.name}]"
  sshagent (credentials: [JP_MechIdPrivateKey]) {
    sh "scp ${javadocJarPath} ${JP_JavadocJarHost}:/tmp"
    sh "ssh ${JP_JavadocJarHost} \"cd ${JP_JavadocRootRemotePath}; rm -rf ${versionNumber}; mkdir ${versionNumber}\""
    sh "ssh ${JP_JavadocJarHost} \"cd ${JP_JavadocRootRemotePath}; jar xvf /tmp/${baseFileName}\""
  }

当我运行它时,我看到以下内容:

JP_MechIdPrivateKey[<myusername>-private-key] class[java.lang.String]

[ssh-agent] Using credentials <myusername>
[ssh-agent] Looking for ssh-agent implementation...
[ssh-agent]   Java/JNR ssh-agent
[ssh-agent] Skipped registering BouncyCastle, not running on a remote agent
[ssh-agent] Started.
[Pipeline] {

[Pipeline] sh
[ssh-agent] Stopped.
[usl-parent] Running shell script
[Pipeline] }
[Pipeline] // sshagent
[Pipeline] }
[Pipeline] // dir
[Pipeline] sh
...
java.io.NotSerializableException: sun.nio.fs.UnixPath
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
    at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
...
Caused by: an exception which occurred:
    in field locals

堆栈跟踪没有提供任何关于脚本中哪一行存在问题的直接线索。我尝试注释掉“sshagent”块,并且没有发生异常(并且该作业没有做任何有用的事情),因此很明显错误来自该块。

我听说序列化问题通常表明要使用 @NonCPS 方法,但我不明白如何转换它来解决这个问题。

4

0 回答 0