Jenkins流水线实用步骤 - 压缩zip文件

24

我正在尝试使用流水线脚本将作为输出创建的文件夹压缩成zip格式。通过谷歌搜索,我了解到Jenkins提供了Pipeline Utility Steps - zip zipFile功能https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#code-zip-code-create-zip-file来压缩文件夹/文件,但无法获取确切的管道语法来压缩。

在我的作业工作区中,我有一个名为“Test”的文件夹,它有两个子文件夹“Test1”和“Test2”。每个子文件夹中都有.dll文件。因此,我想将整个“Test”文件夹及其所有子文件夹压缩成zip格式。

node(Jenkinks_1)
{
    echo "ZIP"
    zip zipFile: 'Test.zip', dir:'C:\\workspace\\Build_Sample\\Test'
    echo "END - ZIP"
}

以下是Jenkins的控制台输出:

Started by user XXXXX
[Pipeline] node
Running on Jenkinks_1 in C:\workspace\Build_Sample
[Pipeline] {
[Pipeline] echo
ZIP
[Pipeline] echo
END - ZIP
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

寻求一些指导,使用管道语法压缩文件夹。感谢您的建议。

我想将一些文件压缩为我的Jenkins流水线作业的输出。

4个回答

37

首先,按照阶段和步骤来尝试相同的操作,就像这里一样

pipeline {
    agent any
    stages {
        stage ('push artifact') {
            steps {
                sh 'mkdir archive'
                sh 'echo test > archive/test.txt'
                zip zipFile: 'test.zip', archive: false, dir: 'archive'
                archiveArtifacts artifacts: 'test.zip', fingerprint: true
            }
        }
        ...
    }

它使用archiveArtifacts来记录结果。

如果使用绝对路径无法工作,请尝试相对路径('..'

OP Sri所示,zip zipFileJENKINS Pipeline Utility Steps Plugin的一部分,并且需要该插件。
请参见“已实现的步骤”。


关于多条件文件选择要使用的语法,NicolasW评论中指出文档不够明确:“使用glob ant-style语法”...
不过他最终使用了基本的逗号分隔语法来实现。
例如:

zip zipFile: 'test.zip', archive: false, glob: 'config-/**/,scripts/**/*.*

但是,正如Tanvir评论中所指出的那样,问题44078意味着您需要将zip替换为:

                 script{ zip zipFile: 'test.zip', archive: false, dir: 'archive' }

这意味着你需要使用一个 script 块。


1
org.codehaus.groovy.control.MultipleCompilationErrorsException: 启动失败: WorkflowScript: 8: 无效参数“zipFile”,您是否指的是“label”?@ line 8, column 21. zip zipFile: 'test.zip', archive: false, dir: 'archive' ^WorkflowScript: 8: 无效参数“archive”,您是否指的是“url”?@ line 8, column 42. zip zipFile: 'test.zip', archive: f ^WorkflowScript: 8: 无效参数“dir”,您是否指的是“url”?@ line 8, column 58. : 'test.zip', archive: false, dir: 'arch - Sri
3
为什么要使用“archiveArtifacts”?当在zip步骤中使用“archive:true”时,您可以直接归档已创建的zip文件。 - IVleafclover
1
@IVleafclover 我相信(两年后,有点模糊),这是为了使工件可供下载,如 https://issues.jenkins-ci.org/browse/JENKINS-50130 中所提到的。zipFile 只是一个压缩文件,archiveArtifacts 是 Jenkins 内置的支持存储“工件”的功能,这对于将它们作为管道结果可用非常重要。 - VonC
1
@VonC 感谢你的回答。使用zip zipFile: 'test.zip', archive: true, dir: 'archive'命令将在Jenkins的构件中压缩和归档zip文件,因此无需使用archiveArtifacts命令。不过没关系,你原来的回答已经很好了。两年后我的评论也许已经不太相关了。 - IVleafclover
目前在声明式流水线中,zip命令无法正常工作并且文档也没有提供有效的解决方法。它会报错信息为无效参数“zipFile”。要使其正常工作,请将代码更改为script{ zip zipFile: 'test.zip', archive: false, dir: 'archive' }。这个问题已经在https://issues.jenkins.io/browse/JENKINS-44078中得到了解决。 - Tanvir
显示剩余4条评论

11

在安装了Pipeline Utility Steps插件后,能够进行压缩操作。


1
有趣,所以它之前没能工作只是因为插件没有安装? - VonC
是的,在安装了Pipeline Utility Steps插件之后,Zip命令可以正常工作了。 - Sri
好的,我已经相应地完成了我的回答,并附上了一些链接。 - VonC

4

我之所以遇到这个问题,是因为主机上没有安装zip。
提醒自己:如果需要使用zip,请先安装它。

sudo yum install zip


1

您可以直接使用 sh(Jenkins 服务器需要安装 zip);

 sh '''
            zip -r  algo.zip algo
 '''

像这样的管道脚本。
node {
    stage('Clean'){
        cleanWs()
    }
    stage('Checkout') {
       git branch: 'develop', url: 'ssh://user@ip:29418/prj.git'
    }
    stage('Zip') {
        dir('algo-python') {
            sh '''
            zip -r  algo.zip algo
            '''
       }
    }
    stage('Upload zip'){
        dir('algo-python') {
            sh '''
                source /etc/profile
                export HADOOP_USER_NAME=dev
                hdfs dfs -put -f algo.zip /user/dev/zipfile/
            '''
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接