如何在管道中使用Jenkins的ExportParametersBuilder?

时间:2019-11-26 16:02:51

标签: jenkins jenkins-pipeline

我正在将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实例上运行。因此,该插件已安装并正在运行。我不确定为什么会这样。

有人知道该插件是否可以在管道作业中使用吗?如果是这样,怎么办?我想念什么?

如果无法使用,我的道歉,詹金斯的文档常常会误导人。

1 个答案:

答案 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"
  }
  ...
]