@andrian
TestHub的共享代码——一个让CI/CD管道和个人开发者在私人实验室对真正的硬件或仿真器进行固件测试的自办工作网络. 这个软件包没有服务器,也没有自己的CLI;这是依赖光小的核心 探员, (中文(简体) ), 协调员 财务报告和审定财务报表 客户端 都取决于,所以三个说完全相同的协议.
安装
npm install @andrian.yablonskyy/thub-common
里面有什么东西
任务规格计划和验证
一个 亚日弗 JSON为代理员向协调员发出的职务说明设计了方案,并用薄薄的包装来验证一个规格并填补其缺省.
const { validateJobSpec } = require('@andrian.yablonskyy/thub-common');
const { valid, spec, errors } = validateJobSpec({
target: { type: 'hw', labels: ['board:nucleo-f401re'] },
command: './ci/test.sh',
downloads: [{ url: 'https://artifactory.example.com/app.bin' }],
git: { url: 'https://github.com/yourorg/firmware-tests.git', ref: 'v1.4.0' }
});
工作是一项任务: command (需要)- shell 命令客户端作为其切入点运行, args 作为 "$@"),可选输入 downloads (单位:千美元)[{ url }], (中文(简体) ), git (单位:千美元)url选项 ref 分支、标记或承诺——和 depth,默认 1),对于SW工作, image (作为 DUT 运行的多克图像). 其他顶级字段 : target (单位:千美元)type, (中文(简体) ), labels选项 group编号 :client, (中文(简体) ), suite, (中文(简体) ), timeoutSec, (中文(简体) ), priority, (中文(简体) ), source (单位:千美元)ci编号 :cli, (中文(简体) ), user (免费文本工作所有人标签), meta (任意密钥/价值元数据),以及 dryRun。旧形状的规格(firmware编号 :tests,来自比 --command) 拒绝发信息更新代理.
国徽和出关代码
const { RESOURCE_STATES, JOB_STATES, ACTIVE_JOB_STATES, TERMINAL_JOB_STATES, BUSY_SOURCES, EXIT_CODES, exitCodeForJobState } = require('@andrian.yablonskyy/thub-common');
RESOURCE_STATES数字 :REGISTERED, (中文(简体) ),IDLE, (中文(简体) ),BUSY, (中文(简体) ),OUT_OF_SERVICE, (中文(简体) ),MAINTENANCE。 。 。 .JOB_STATES数字 :QUEUED, (中文(简体) ),ASSIGNED, (中文(简体) ),PREPARING, (中文(简体) ),RUNNING, (中文(简体) ),PASSED, (中文(简体) ),FAILED, (中文(简体) ),ERROR, (中文(简体) ),TIMEOUT, (中文(简体) ),CANCELED, (中文(简体) ),LOST。 。 。 .ACTIVE_JOB_STATES编号 :TERMINAL_JOB_STATES是那组东西的两个自然分界线.BUSY_SOURCES数字 :ci, (中文(简体) ),cli, (中文(简体) ),local——资源目前为何繁忙.EXIT_CODES编号 :exitCodeForJobState(state): Agent CLI的流程退出代码(PASSED-0个,FAILED• 1,ERROR编号 :TIMEOUT编号 :LOST• 2,CANCELED~ 3, 使用/ 自动出错 ~ 4, 与 Ctrl- C 相分离 ~ 130),所以一个 CI 步骤可以分支于$?不分析输出.
API 客户端
起码 fetch- 协调员的基于 HTTP 客户端 /api/v1 表面,带有一个手卷式的Server-Sent-Events 解析器(没有外部的SSE依赖性)——由代理和客户端使用,所以它们说话完全相同的协议.
const { ApiClient } = require('@andrian.yablonskyy/thub-common');
// userAgent is optional; the Coordinator records "thub-agent/<v>" / "thub-client/<v>" versions for its dashboard
const client = new ApiClient({ baseUrl: 'https://thub.example.com', token: 'agt_...', userAgent: 'thub-agent/1.0.8' });
const job = await client.post('/jobs', spec);
await client.streamEvents(`/jobs/${job.jobId}/logs/stream`, {
onEvent: ({ event, id, data }) => console.log(event, data)
});
request()编号 :get()编号 :post() 处理 JSON 天体、 查询字符串和非-2xx 错误( 以 .status编号 :.body 设置); streamEvents() 重新连接呼叫者需要驱动( 它只描述一个连接对事件的价值, 并在流结束时解决) 和荣誉 Last-Event-ID 倒计时.
保留资源远程频道
代理、协调员和客户为保留资源共享一个WebSocket频道协议。 除了UART、社署、RTT和视频频道之外,持有者可以要求一个名字 service 带有客户端端口的频道。 RTT在选定的ST-Link上打开一个OpenOCD会话,为SEGGER控制块搜索一个已配置的目标RAM范围,并流出一个上行通道. 客户端连接 a service 只有频道 127.0.0.1:<port> ; 它从来不让客户端的听众接触到网络.
版本检查和自更新助手
PACKAGES (协调员/代理人/客户姓名), fetchLatestVersion(pkg, { registry }) (单位:千美元) latest 从npm登记簿中取出, compareVersions编号 :isNewer编号 :isValidVersion (限制) X.Y.Z[-pre], (中文(简体) ), npmBin() (运行中节点旁边的npm)和 npmInstallGlobal(pkg, version) (仅针对三个TestHub包,仅限有效版本).
发展
npm install
npm test # node --test test/*.test.js
npm run lint
许可证
见 利比里亚。 。 。 .