复制 "Concourse CI" 节点调用/调试 process.stdin Net.socket

Replicating "Concourse CI" Node Call / Debugging process.stdin Net.socket

我已经使用节点构建了一个客户资源。资源代码看起来没问题,但是一旦编译并放入 Concourse,资源中的 "Check" 就会失败。

Concourse 没有提供任何有用的信息,除了 "Unexpected end of JSON"

我想准确复制 Concourse 调用构建的方式,但我不知道如何找出它调用的内容?

我的假设是 /opt/resource/check,它有 #!/usr/bin/env node ,所以只要调用它就足够了,但我没有得到相同的行为。

我可以确定的是,它挂在我的套接字上,用于获取通过 stdIn 传递的参数,代码如下:

export async function retrieveRequestFromStdin<T extends any>(): Promise<T> {
    return new Promise<T>((resolve, reject) => {
        let inputRaw = "";
        process.stdin.on("data", (chunk) => {
            process.stdout.write(chunk);
            inputRaw += chunk;
        });
        process.stdout.write(inputRaw);
        process.stdin.on("end", async () => {
            try {
                const json = JSON.parse(inputRaw) as T;
                if (!json.source.server_url.endsWith("/")) {
                    // Forgive input errors and append missing slash if the user did not honor the docs.
                    json.source.server_url = `${json.source.server_url}/`;
                }
                resolve(json);
            } catch (e) {
                reject(e);
            }
        });
    });
}

这是验证码:

(async () => {
  try {
    const request: ICheckRequest = await retrieveRequestFromStdin<ICheckRequest>();
   // Removed unnecessary items
  } catch (e) {
    stderr.write(e);
    process.exit(1);
  }
})();

如何像调用 Concourse 一样调用 NodeJS 脚本,以便准确找出问题所在?

注意,我正在从 Typescript

编译 Javascript

对于资源 check,Concourse 将 运行 /opt/resource/checkstdin 中的资源配置中传递 source 信息。例如,如果您将管道配置为:

resources:
- name: resource-name
  type: your-new-node-resource-type
  source:
    server_url: https://someurl.com

第一次 check 运行 时,您的脚本会在 stdin:

收到这个
{"source": {"server_url": "https://someurl.com"}}

然后您的脚本预计会 return stdout 上资源的 "current" 版本。在下面的示例中,我将密钥命名为 version-example,但您可以随意命名。如果需要,您也可以添加其他键。这使您可以灵活地唯一标识版本。

[{"version-example": "46"}]

从 Concourse 到您的 check 脚本的后续调用也将包括它知道的最新版本,因此继续该示例,下一次调用会将其传递给您的脚本:

{"source": {"server_url": "https://someurl.com"}, 
 "version": {"version-example": "46"}}

您的 check 脚本现在应该 return(在 stdout 上)它按顺序找到的任何新版本的数组:

[{"version-example": "47"},
 {"version-example": "48"},
 {"version-example": "49"}]

更多细节,你可以查看官方docs,这在实现inout脚本时应该也很有用。


快速查看您的代码,它似乎将 stdin 写入 stdout 两次,这导致 Unexpected end of JSON 消息。例如:

{"source": {"server_url": "https://someurl.com"}}
{"source": {"server_url": "https://someurl.com"}}