Groovy Can';t在jenkins管道的共享库中创建zip文件
在Groovy Can';t在jenkins管道的共享库中创建zip文件,groovy,jenkins-pipeline,antbuilder,Groovy,Jenkins Pipeline,Antbuilder,在AntBuilder的帮助下,我尝试在jenkins管道的共享库中创建一个zip文件。可以创建一个简单的zip文件,但只要我尝试使用块,它就不起作用。我没有收到任何错误消息或异常。如何调试管道脚本?或者我如何解决这个问题 我的代码如下所示(步骤zipFolder不起作用,步骤zipFolder2起作用) 詹金斯档案 @库('utils')_ 共享库: vars/zipFolder.groovy: import com.example.Utilities def call(){ new U
AntBuilder
的帮助下,我尝试在jenkins管道的共享库中创建一个zip文件。可以创建一个简单的zip文件,但只要我尝试使用块,它就不起作用。我没有收到任何错误消息或异常。如何调试管道脚本?或者我如何解决这个问题
我的代码如下所示(步骤zipFolder不起作用,步骤zipFolder2起作用)
詹金斯档案
@库('utils')_
共享库:
vars/zipFolder.groovy:
import com.example.Utilities
def call(){
new Utilities(this).zip(pwd())
}
vars/zipFolder2.groovy
import com.example.Utilities
def call(){
new Utilities(this).zip2(pwd())
}
src/com/example/Utilities.groovy
package com.example
import groovy.util.AntBuilder
import org.apache.tools.ant.DefaultLogger
class Utilities implements Serializable {
def steps
def byteStream
Utilities(steps) {this.steps = steps}
def zip(baseDir){
def ant = setupAnt(baseDir)
def destFolder = "${baseDir}/Dist"
def destfile = "${destFolder}/test.zip"
ant.delete dir: destFolder
ant.mkdir(dir: destFolder)
ant.zip(destfile: destfile, whenempty: 'create', excludes: destfile) {
zipfileset (dir: "${baseDir}/install", includes: "test.txt", erroronmissingdir: false)
}
steps.echo "Zip1"
steps.echo "Ant-Result: " + byteStream.toString()
}
def zip2(baseDir){
def ant = setupAnt(baseDir)
def destFolder = "${baseDir}/Dist2"
def destfile = "${destFolder}/test.zip"
ant.delete dir: destFolder
ant.mkdir(dir: destFolder)
ant.zip(destfile: destfile, whenempty: 'create', excludes: destfile, basedir: baseDir)
steps.echo "Zip2"
steps.echo "Ant-Result: " + byteStream.toString()
}
def setupAnt(baseDir){
def ant = new AntBuilder()
byteStream = new ByteArrayOutputStream()
def printStream = new PrintStream( byteStream )
def project = ant.project
project.buildListeners.each {
if ( it instanceof DefaultLogger ) {
it.setMessageOutputLevel(org.apache.tools.ant.Project.MSG_DEBUG)
it.setOutputPrintStream printStream
it.setErrorPrintStream printStream
}
}
ant
}
}
AntBuilder
不可序列化
。我们所做的是将对AntBuilder的调用封装在一个额外的groovy脚本中,该脚本是动态创建的,并通过调用groovy二进制文件进行调用,如:
writeFile file:createZip.groovy text:”””
def antBuilder = new AntBuilder()
...
“””
sh ‘groovy createZip.groovy’
<>你也可以考虑使用詹金斯管道ZIP步骤。请参见,提示我使用以下代码解决了问题:
src/com/example/Utilities.groovy
package com.example
import org.apache.tools.ant.DefaultLogger
package com.example
import org.apache.tools.ant.DefaultLogger
class Utilities implements Serializable {
def steps
def byteStream
Utilities(steps) {this.steps = steps}
def zip(baseDir, Closure callback ){
def ant = setupAnt()
def destFolder = "${baseDir}/Dist"
def destfile = "${destFolder}/test.zip"
ant.delete dir: destFolder
ant.mkdir(dir: destFolder)
ant.zip(destfile: destfile, whenempty: 'create', excludes: destfile, callback)
steps.echo "Ant-Result: " + byteStream.toString()
}
def setupAnt(){
def ant = new AntBuilder()
byteStream = new ByteArrayOutputStream()
def printStream = new PrintStream( byteStream )
def project = ant.project
project.buildListeners.each {
if ( it instanceof DefaultLogger ) {
it.setMessageOutputLevel(org.apache.tools.ant.Project.MSG_DEBUG)
it.setOutputPrintStream printStream
it.setErrorPrintStream printStream
}
}
ant
}
}
import com.example.Utilities
def call(Closure callback){
new Utilities(this).zip(pwd(), callback)
}
vars/zipFolder.groovy
package com.example
import org.apache.tools.ant.DefaultLogger
package com.example
import org.apache.tools.ant.DefaultLogger
class Utilities implements Serializable {
def steps
def byteStream
Utilities(steps) {this.steps = steps}
def zip(baseDir, Closure callback ){
def ant = setupAnt()
def destFolder = "${baseDir}/Dist"
def destfile = "${destFolder}/test.zip"
ant.delete dir: destFolder
ant.mkdir(dir: destFolder)
ant.zip(destfile: destfile, whenempty: 'create', excludes: destfile, callback)
steps.echo "Ant-Result: " + byteStream.toString()
}
def setupAnt(){
def ant = new AntBuilder()
byteStream = new ByteArrayOutputStream()
def printStream = new PrintStream( byteStream )
def project = ant.project
project.buildListeners.each {
if ( it instanceof DefaultLogger ) {
it.setMessageOutputLevel(org.apache.tools.ant.Project.MSG_DEBUG)
it.setOutputPrintStream printStream
it.setErrorPrintStream printStream
}
}
ant
}
}
import com.example.Utilities
def call(Closure callback){
new Utilities(this).zip(pwd(), callback)
}
Jenkinsfile
@Library('utils') _
pipeline {
agent any
stages {
stage('Build') {
steps {
cleanWs()
writeFile file: 'test.txt', text: 'Sample Text'
writeFile file: 'test2.txt', text: 'Sample Text 2'
writeFile file: 'src/test3.txt', text: 'Sample Text 3'
zipIt()
}
}
}
}
@NonCPS
def zipIt(){
zipFolder( ) {
delegate.zipfileset (dir: "${pwd()}", includes: "test.txt", excludes: "src/**" , filemode: "0755", prefix: "bin/examples", erroronmissingdir: false)
delegate.zipfileset (dir: "${pwd()}/src", includes: "*.txt", erroronmissingdir: false)
}
}
重要的是使用注释@NonCPS
和delegate.zipfileset
而不是简单地使用zipfileset
编辑:此解决方案在从属服务器上不起作用。此代码在主服务器上执行,即使构建在从属服务器上运行