复制 "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/check
从 stdin
中的资源配置中传递 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,这在实现in
和out
脚本时应该也很有用。
快速查看您的代码,它似乎将 stdin
写入 stdout
两次,这导致 Unexpected end of JSON
消息。例如:
{"source": {"server_url": "https://someurl.com"}}
{"source": {"server_url": "https://someurl.com"}}
我已经使用节点构建了一个客户资源。资源代码看起来没问题,但是一旦编译并放入 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/check
从 stdin
中的资源配置中传递 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,这在实现in
和out
脚本时应该也很有用。
快速查看您的代码,它似乎将 stdin
写入 stdout
两次,这导致 Unexpected end of JSON
消息。例如:
{"source": {"server_url": "https://someurl.com"}}
{"source": {"server_url": "https://someurl.com"}}