将 Jenkins 输入步骤中的文件上传到工作区

Tim*_*lin 5 groovy jenkins jenkins-groovy jenkins-pipeline

我想使用Jenkins的“输入步骤”将二进制文件上传到当前工作区。

但是,下面的代码似乎将文件上传到 Jenkins master,而不是上传到作业正在运行的 slave 上的当前作业的工作区。有没有办法解决这个问题?

最好不必在主盘上添加执行程序或将文件弄乱主盘。

def inFile = input id: 'file1', message: 'Upload a file', parameters: [file(name: 'data.tmp', description: 'Choose a file')]
Run Code Online (Sandbox Code Playgroud)

Tec*_*ext 8

正如您在JENKINS-27413 中看到的那样,Jenkins 似乎正式不支持上传二进制文件。您仍然可以使用该input步骤在您的工作区中获取二进制文件。我们将使用一种方法来使其工作,但我们不会在内部使用它,Jenkinsfile否则我们会遇到与In-process Script Approval. 相反,我们将使用Global Shared Libraries,这被认为是 Jenkins 的最佳实践之一。

请按照以下步骤操作:

1)创建共享库

  • 创建存储库测试共享库
  • vars在上面的存储库中创建一个名为的目录。在vars目录中,创建一个copy_bin_to_wksp.groovy包含以下内容的文件:

def inputGetFile(String savedfile = null) {
    def filedata = null
    def filename = null
    // Get file using input step, will put it in build directory
    // the filename will not be included in the upload data, so optionally allow it to be specified

    if (savedfile == null) {
        def inputFile = input message: 'Upload file', parameters: [file(name: 'library_data_upload'), string(name: 'filename', defaultValue: 'demo-backend-1.0-SNAPSHOT.jar')]
        filedata = inputFile['library_data_upload']
        filename = inputFile['filename']
    } else {
        def inputFile = input message: 'Upload file', parameters: [file(name: 'library_data_upload')]
        filedata = inputFile
        filename = savedfile
    }

    // Read contents and write to workspace
    writeFile(file: filename, encoding: 'Base64', text: filedata.read().getBytes().encodeBase64().toString())
    // Remove the file from the master to avoid stuff like secret leakage
    filedata.delete()
    return filename
}
Run Code Online (Sandbox Code Playgroud)

2) 配置 Jenkins 以在任何管道作业中访问共享库

  • 转到管理 Jenkins » 配置系统 » 全局管道库部分
  • 随意命名库(在我的情况下,我的共享库如下所示)
  • 保持默认为 master(这是我推送代码的分支)
  • 除非您知道自己在做什么,否则无需选中/取消选中复选框

在此处输入图片说明

3)在你的工作中访问共享库

  • 在 中Jenkinsfile,添加以下代码:

@Library('my-shared-library@master') _

node {
   // Use any file name in place of *demo-backend-1.0-SNAPSHOT.jar* that i have used below
   def file_in_workspace = copy_bin_to_wksp.inputGetFile('demo-backend-1.0-SNAPSHOT.jar')
   sh "ls -ltR"
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

你已经准备好运行这项工作了。:)

在此处输入图片说明

笔记:

  • 确保脚本安全插件始终是最新的
  • 共享库如何受脚本安全性影响?
  • 全局共享库始终在沙箱之外运行。这些库被认为是“可信的”:它们可以运行 Java、Groovy、Jenkins 内部 API、Jenkins 插件或第三方库中的任何方法。这允许您定义将单独不安全的 API 封装在更高级别的包装器中的库,以便从任何 Pipeline 安全使用请注意,任何能够将提交推送到此 SCM 存储库的人都可以获得对 Jenkins 的无限制访问权限
  • 文件夹级共享库始终在沙箱内运行。基于文件夹的库被视为“受信任的”:它们像典型的流水线一样在 Groovy 沙箱中运行。

代码参考:James Hogarth 的评论