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

时间:2019-08-12 15:38:15

标签: jenkins groovy jenkins-pipeline jenkins-groovy

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

但是,下面的代码似乎将文件上传到Jenkins主服务器,而不是当前文件在运行作业的从服务器上的当前工作空间。 有什么办法可以解决这个问题?

最好不必在主数据库上添加执行程序,也不必在主磁盘上堆满文件。

let noId = [{
user:"Mark",
job:"Job"
}]

let withId = [{
id:1,
user:"Mark",
job:"Job"

}]

output
 let withId = [{
    id:1,
    user:"Mark",
    job:"Job"
    date: 12-09-2019
    }]


const saveNewFile = async (filesSAS, dirSas, dirOut, dirArchive) => {
  filesSAS.forEach(async filename => {
    const newData = await csv().fromFile(`${dirSas.path}/${filename}`);
    for await (const iterator of object) {
      if (iterator.Id === null || iterator.Id === undefined) {
        await copyFile(dirSas, dirOut, filename);
      }
      rec.Date = moment(Date.now()).format("DD-MMM-YYYY");
    }

    await saveCSV(newData, `${dirOut.path}/${filename}`, "output");
  });
};

1 个答案:

答案 0 :(得分:2)

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

请按照以下步骤操作:

1)创建一个共享库

  • 创建存储库 test-shared-library
  • 在上述存储库中创建一个名为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
}

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

  • 转到管理Jenkins»配置系统»“全局管道库”部分
  • 根据需要命名库(在本例中为my-shared-library,如下所示)
  • 将默认设置保留为master(这是我推送代码的分支)
  • 除非您知道自己在做什么,否则无需选中/取消选中复选框

enter image description here

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"
}

enter image description here

您都准备好运行作业。 :)

enter image description here

注意:

  • 确保Script Security plugin始终是最新的
  • How are Shared Libraries affected by Script Security?
  • Global Shared Libraries始终在沙箱内 运行。这些库被认为是“受信任的”:它们可以在Java,Groovy,Jenkins内部API,Jenkins插件或第三方库中运行任何方法。 这允许您定义将不安全的API分别封装在更安全的高层包装中的库,以供任何管道使用。请注意,任何能够将提交推送到该SCM存储库的人都可以无限制地访问Jenkins。
  • Folder-level Shared Libraries始终在沙箱中运行。基于文件夹的库被认为是“受信任的”:它们像典型的管道一样在Groovy沙箱中运行。

代码参考:James Hogarth的comment