「Jenkins Pipeline」- 常见错误

  CREATED BY JENKINSBOT

#3 问题现象:文件是存在的,但是 new File(“”).exists() 返回不存在

Pipeline – Files manipulation

在Jenkins中,Step会在节点上执行,但是普通的JAVA代码不会。而且Java代码的相对路径是根目录。

(之前遇到过这个问题,今天(08/19/2019)又看到这个链接了,这里记录一下。)在Pipeline中,程序代码(比如Groovy或Java代码)是在Master节点上执行的,而Pipeline的Step是在各个节点上执行的(根据Pipeline中定义的节点)。

#2 问题现象:在共享库里函数中调用 println 无效(即在 Console Ouput 中没有输出)

println in “call” method of “vars/foo.groovy” works, but not in method in class
printlns in shared library vars classes are ignored

#1 NotSerializableException GitChangeSetList

Error with changeSet in jenkins pipeline (Error:java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList)

(Error:java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList)

Jenkins可以保存中间执行,但是要求能够序列化。但是原始构建无法被序列化。

所以需要在函数上添加 @NonCPS 注解,形如:

@NonCPS
def showChangeLogs() {
  def changeLogSets = currentBuild.rawBuild.changeSets
  for (int i = 0; i < changeLogSets.size(); i++) {
     def entries = changeLogSets[i].items
     for (int j = 0; j < entries.length; j++) {
          def entry = entries[j]
          echo "${entry.commitId} by ${entry.author} on ${new Date(entry.timestamp)}: ${entry.msg}"
          def files = new ArrayList(entry.affectedFiles)
          for (int k = 0; k < files.size(); k++) {
              def file = files[k]
              echo "  ${file.editType.name} ${file.path}"
          }
      }
  }
}