我正在将Free Style作业迁移到Jenkins上的管道。 Freestyle Job使用ExportParametersBuilder(将参数导出到文件)插件。这对于我们的工作流程很重要,因为应用程序期望参数为JSON文件。
我尝试过基本步骤,如Pipeline: Basic Steps - Jenkins documentation(搜索ExportParametersBuilder)中所述:
step([
$class: 'ExportParametersBuilder',
filePath: 'config/parameters',
fileFormat: 'json',
keyPattern: '',
useRegexp: 'false'
])
但是当我尝试运行管道时,出现以下错误:
接口jenkins.tasks.SimpleBuildStep的未知实现被命名为ExportParametersBuilder
管道作业与Freestyle作业(当前正在运行)在同一Jenkins实例上运行。因此,该插件已安装并正在运行。我不确定为什么会这样。
有人知道该插件是否可以在管道作业中使用吗?如果是这样,怎么办?我想念什么?
如果无法使用,我的道歉,詹金斯的文档常常会误导人。
答案 0 :(得分:1)
我找不到使用该插件的方法,但找到了替代方法。我把它留在这里,以防它对其他人有用。
#include <dirent.h>
#include <stdio.h>
int main()
{
struct dirent *entry; // read thru the entries in "/sys/block"
for (DIR *dirp = opendir("/sys/block"); entry = readdir(dirp); )
if (entry->d_type == DT_LNK) // the relevant files are symbolic links
{
char path[277];
sprintf(path, "/sys/block/%s/removable", entry->d_name);
FILE *fp = fopen(path, "r"); if (!fp) return perror(path), 1;
int re; // read the /sys/block/%s/removable flag
fscanf(fp, "%d", &re), fclose(fp);
if (re)
{ // read the device's MAJOR:MINOR numbers
sprintf(path, "/sys/block/%s/dev", entry->d_name);
fp = fopen(path, "r"); if (!fp) return perror(path), 1;
fscanf(fp, "%s", path+sprintf(path, "/run/udev/data/b")),
fclose(fp);
fp = fopen(path, "r"); if (!fp) return perror(path), 1;
char USB_serial[NAME_MAX]; // scan the udev/data for ID_SERIAL=
while (fgets(path, sizeof path, fp))
if (sscanf(path, "E:ID_SERIAL=%[^-]", USB_serial) > 0)
puts(USB_serial);
fclose(fp);
}
}
}
这可能不是最干净,也不是最优雅的方法,但是它可以工作。这些参数都被写入JSON文件,并且JsonOutput类负责处理所有转义的魔术等等。
请记住,JSON文件的格式与// Import the JsonOutput class at the top of your Jenkinsfile
import groovy.json.JsonOutput
...
stage('Environment Setup') {
steps {
writeFile(file: 'config/parameters.json', text: JsonOutput.toJson(params))
}
}
创建的格式略有不同,因此您需要适应它:
ExportParametersBuilder格式:
ExportParametersBuilder
JsonOutput格式:
[
...
{
"key": "target_node",
"value": "c3po"
}
...
]