管道任务核心
@4cloudguru/pipeline-task-core ——共享,版本的安全原始(HTTP客户端,再试, Egreat)
每个 Azure DevOps 管道任务所消耗的允许列表、 URL 秘密编辑、 代理配置
破产财产中的扩展 :
状态:脚手架. 工具链、CI和治理已经到位,一个原始的 (单位:千美元)
parseRetryAfterMs)是用来证明建设结束到结束的. 其余模块库存 是第0阶段的工作。 计划是建立在 文献/倡议/倡议-1-共享-任务核心. md 并且既包括这个套件,也包括推动它的新扩展.
为什么会这样
Terraform 和 Packer 扩展 各自携带相同的 HTTP/ retry/ asset 复制件 原始资料——分别为33个档案和8个档案——按照出处评论公约加以保存 而不是编译器。 公约只检查了标记 已存在,而不是他们的主张 真实的,所以状态 传言腐烂 而CI保持绿色。 本套件以下列案文取代公约: 依赖性.
B. 影响建筑物的制约因素
故意与 cloud-suite-ui,这是一个浏览器/反应包:
| 约束 | 数值 | 为什么 |
|---|---|---|
| 模块格式 | cJS + 无害环境管理 | ADO 任务为 commonJS 并使用 import tl = require(...)CI说: require() 决定. |
| 节点层 | 20国 | 每个任务都宣布 Node20_1 没有节点24跑道的特工的后退处理器. |
| 运行时间依赖关系 | 无 | openpgp 是一个 选项对等点,只能通过 ./gpg 子路径. |
| 书记官处 | 公共 npmjs,带出处 | 任何消费者都无需安装标志 --provenance 发布可核查的软件包 + 承诺 + 工作流程链接. |
入境点
import { parseRetryAfterMs } from '@4cloudguru/pipeline-task-core'
import type { VerifyDetached } from '@4cloudguru/pipeline-task-core/gpg'
./gpg 任务是分开的,所以从不验证发布签名不销售 openpgp 进入
.vsix它故意载运 没有签名密钥 - 呼叫者通过自己的装甲钥匙并保持
他们自己的密钥新鲜度检查, 因为信任根属于依赖它的数据库.
代理支持
resolveProxy 读取 Azure DevOps 代理的配置. resolveEnvProxy 读取
HTTPS_PROXY 编号 : HTTP_PROXY 编号 : NO_PROXY a GitHub 自行托管的跑步器集—— 两者均
拼写, 小写取胜 —— 此节点的 fetch 光荣自在,为一无所取. 也没有
构建调度器 : undici 继续依赖消费者.
import { ProxyAgent } from 'undici'
import { createHttpClient, resolveEnvProxy } from '@4cloudguru/pipeline-task-core'
const client = createHttpClient({
// Called for every attempt AND every redirect hop, with the URL about to be
// issued — the answer depends on the destination, so a chain that redirects
// off the origin has to be resolved again.
fetchOptions: (url) => {
const proxy = resolveEnvProxy(url)
if (!proxy) return {}
proxy.secrets.forEach((secret) => core.setSecret(secret)) // credentials in the URL are secrets
return { dispatcher: new ProxyAgent(proxy.proxyUrl) } as RequestInit
},
})
套接字带请求的代理更改, 绝不允许选择哪个目标 .
assertEgressHostAllowed 仍然运行与 目标 东道主——初始和每个
重定向 hop —— 而它的主题绝不是代理: CONNECT 隧道到未经授权的主机仍然
未经授权的入侵.
具有证书的运输
createHttpClient 是用来下载公共文物的 fetch。 。 。 . httpsRequest 是另一个
运输:生 node:https,对于带有无记名标志、API键或基本
证书。 因此,其拒绝措辞是: 拒绝发送证书 超过一个非https
URL 而不是拒绝取到一个 .
createProxyTunnelAgent 是原始https对应的 resolveProxy数字 : node:https 荣誉无
代理设置, 除非交出 agent,因此它会构建一个打开 HTTP CONNECT 隧道和
将其升级为 TLS. registerSecret 实值 所需经费,不是可选的 —— 衍生基数64 Basic
证明是一个字节序列 呼叫者从来不会构造 所以永远也不会想掩盖.
import { createProxyTunnelAgent, httpsRequest, truncateBody } from '@4cloudguru/pipeline-task-core'
const { status, body } = await httpsRequest({
method: 'POST',
url: new URL(registryUrl), // parsed by the caller, which owns the "bad URL" message
headers: { Authorization: `Bearer ${apiKey}` },
body: Buffer.from(JSON.stringify(payload), 'utf8'),
agent: createProxyTunnelAgent(tl.getHttpProxyConfiguration(), {
tunnelTimeoutMs: DEFAULT_REQUEST_TIMEOUT_MS,
registerSecret: (secret) => tl.setSecret(secret),
}),
})
if (status >= 400) throw new Error(`Publish failed: ${truncateBody(body)}`)
为什么不是 fetch
有两个独立的原因, 两者仍然坚持:
undici留下来. 这个软件包没有运行时间依赖性,也没有增长;消费者 针undici目前为7.x,因为8号断裂 与节点24捆.- 消费者嘲笑
nock并注入一个agent。 。 。 .fetch没有agent选项,所以 一个端口会静静地放下代理-代理支持——上面的地道——以及驱动一个 请求通过一个真正的 CONNECT 代理.
一个状态被恢复,从不放弃: 打电话者对一个非-2xx的含义有分歧,所以决定继续
与他们. truncateBody 是限制远程机构选择工作日志的绑定值
失败占上风; truncateForLog 是更强大的帮助者(它也会剥去 C0 字符
并且是新来电者应该开始的地方.
发展
npm ci
npm run typecheck
npm test
npm run build
承诺遵循常规承诺(强制使用公关名称);请通过释放削减释放.