我想使用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");
});
};
答案 0 :(得分:2)
似乎Jenkins官方还不支持二进制文件的上传,正如您在JENKINS-27413中看到的那样。您仍然可以使用input
步骤在工作区中获取二进制文件。我们将使用方法使其正常工作,但是我们不会在Jenkinsfile
内使用它,否则会遇到与In-process Script Approval
相关的错误。相反,我们将使用Global Shared Libraries,它被视为詹金斯的最佳实践之一。
请按照以下步骤操作:
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
}
2)配置Jenkins以在任何管道作业中访问共享库
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"
}
您都准备好运行作业。 :)
注意:
代码参考:James Hogarth的comment