ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

k6 v0.58.0 版本解析:v1.0.0-rc1 镜像发布策略与功能全览

k6 v0.58.0 版本解析:v1.0.0-rc1 镜像发布策略与功能全览 k6 v0.58.0 版本解析v1.0.0-rc1 镜像发布策略与功能全览【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6k6 在走向 1.0.0 正式版的过程中发布了一个特殊的v0.58.0版本——它在功能上与v1.0.0-rc1完全一致但版本号走的是v0.*通道。本文基于 release notes/v0.58.0.md 与仓库内对应源码解析这次镜像发布的背景动机、它背后的版本管理决策以及用户拿到这个版本后实际能获得的能力新版测试结果摘要、浏览器网络请求追踪、全局crypto模块、k6 new自定义模板与全新的k6/secrets密钥模块。读完本文你将理解 k6 的发布节奏并掌握从旧版本平滑升级到 v0.58.0 的要点。一、为什么会有 v0.58.0镜像发布的背景与动机在正常情况下一个项目发布v1.0.0-rc1预发布版本后就会等待社区测试反馈然后直接发布v1.0.0正式版。但 k6 团队在 release notes/v0.58.0.md 中明确说明v0.58.0 与之前的 v1.0.0-rc1 是镜像关系mirror两个版本包含完全相同的代码变更只是版本号不同。核心矛盾自动化工具不拉取不稳定版本按照语义化版本SemVer约定v1.0.0-rc1属于预发布版本pre-release。许多自动化工具出于安全考虑默认不会自动获取预发布版本这是它们的合法且合理的行为。v0.58.0 的发布说明中明确列举了两个受此影响的典型场景Homebrew 的 k6 formulae安装配方通过brew install k6安装的用户依赖配方指向的稳定版本号。如果配方指向v1.0.0-rc1Homebrew 不会将其视为可安装的最新稳定版。pkg.go.devGo 包索引站点同样不会把v1.0.0-rc1这样的预发布版本当作默认最新版这会影响通过go install go.k6.io/k6/v2方式安装或引用 k6 包的用户。为什么此前不存在这个问题在 k6 的历史上所有v0.*版本都一直被上述工具视为最新的稳定版本——尽管v0.*版本号按惯例通常被与不稳定联系在一起但 k6 的v0.*系列此前就是事实上的稳定发布通道。因此当团队开始发布v1.0.0-rc1时一旦自动化工具无法识别它就会导致 Homebrew、pkg.go.dev 等渠道的 k6 版本停滞在 v0.57.0用户无法通过常规途径拿到新版本。解决方案在 v0.* 通道下持续镜像发布为了在 rc 阶段也能让所有渠道吃到最新代码k6 团队决定对必要的发布候选版本release candidates继续以 v0.版本号发布镜像版本*。v0.58.0 正是这一策略的第一个实例——它让 Homebrew、pkg.go.dev 以及所有依赖v0.*通道的自动化系统都能像往常一样自动升级到最新代码。这一策略何时结束发布说明同时给出了明确的退出条件一旦官方的 v1.0.0 稳定版发布这种镜像实践就会终止之后 k6 将遵循标准的 SemVer 生命周期即v1.x.y正式版 预发布版本分开处理从而简化所有人的工作流。也就是说v0.58.0 是这条过渡通道上的一个里程碑而 v1.0.0 之后的版本节奏将回归常规。二、v0.58.0 实际包含的内容从 v1.0.0-rc1 继承的功能全览由于 v0.58.0 与 v1.0.0-rc1 内容一致其变更详情记录在 release notes/v1.0.0-rc1.md 中涵盖了自 v0.57.0 以来的全部改动。以下按类别完整梳理。破坏性变更Breaking Changes1.--tag命令行参数的值现在支持逗号,此前--tag值中的逗号会被解释为新一组标签值的分隔符。由于逗号本身是标签值的合法字符这一行为阻碍了不同方式CLI、配置文件、脚本内设置标签之间的一致性。v0.58.0 起逗号可正常出现在标签值中同时仍然支持通过多次使用--tag keyvalue来设置多个标签。2. 配置文件的新默认路径运行k6 cloud login或已弃用的k6 login命令时配置文件此前会被自动创建在{USER_CONFIG_DIR}/loadimpact/config.json。现在改为创建在{USER_CONFIG_DIR}/k6/config.json。迁移方法分两步运行k6 cloud login或k6 login配置文件会被自动迁移到新位置运行k6 cloud run或k6 run验证功能完全正常且不再输出相关告警。k6 run会优先在新路径查找配置文件找不到时会回退到旧路径并输出一条建议迁移的告警日志。旧路径下的配置文件仍可被旧版 k6 使用如果你已不再使用旧版本可以考虑手动删除旧文件。新功能New Features1. 全新设计的 end-of-test 测试结果摘要测试结束摘要被重新设计让用户更容易理解测试结果主要体现在两点用户自定义的Checks检查与Thresholds阈值的汇总格式焕然一新指标metrics被拆分到不同分区展示便于聚焦真正重要的数据。新摘要默认开启可通过summary-mode参数选择模式模式说明compact默认展示最相关的核心信息full与compact类似但额外包含测试中定义的每个group分组和scenario场景的更详细指标与结果legacy旧的摘要格式用于向后兼容需要注意handleSummary函数接收的数据结构以及--summary-export导出的数据格式在本版本中没有变化但这些格式可能在后续版本中调整届时可能引入破坏性变更值得提前关注。从当前仓库源码看summary-mode是 k6 运行期选项runtime option之一定义在 internal/cmd/runtime_options.go默认值为compact在后续迭代中该选项还扩展了disabled值参见 internal/cmd/tests/cmd_run_test.go 中--summary-modedisabled的测试用例可用于完全关闭摘要输出。此外还提供了--new-machine-readable-summary标志用于开启新的机器可读摘要作为--summary-export和handleSummary()参数的数据来源。2. Browser 模块追踪网络请求与响应browser 模块新增了对网络请求与响应的追踪能力非常适合用于验证请求/响应的某些方面以判断测试是否成功、调试测试脚本或被测应用的问题。例如要记录页面发出的所有请求与收到的所有响应可以这样写import { browser } from k6/browser; export const options { scenarios: { ui: { executor: shared-iterations, options: { browser: { type: chromium, }, }, }, }, }; export default async function () { const page await browser.newPage(); // 注册一个处理器记录页面发出的所有请求 page.on(request, async request console.log(request.url())); // 注册一个处理器记录页面收到的所有响应 page.on(response, async response console.log(response.url())); await page.goto(https://quickpizza.grafana.com/, { waitUntil: networkidle }); await page.close(); }输出可能形如INFO[0000] https://quickpizza.grafana.com/ sourceconsole INFO[0001] https://quickpizza.grafana.com/api/tools sourceconsole INFO[0001] https://quickpizza.grafana.com/images/pizza.png sourceconsole ...仓库的 examples/browser 目录提供了大量可直接运行的 browser 脚本其中 pageon-request.js、pageon-response.js、pageon-requestfailed.js 等即展示了本版本新增的page.on事件系列用法。3.k6/experimental/webcrypto转正全局crypto可用k6/experimental/webcrypto模块在本版本中晋升为稳定模块并以crypto名称全局可用。这意味着你可以从脚本中删除import { crypto } from k6/experimental/webcrypto;这一行直接使用该模块export default function () { const myUUID crypto.randomUUID(); console.log(myUUID); }同时k6/experimental/webcrypto被标记为已弃用deprecated并计划在 v1.1.0 中移除。仓库 examples/webcrypto 目录下有丰富的示例覆盖摘要计算digest.js、随机数生成getRandomValues.js、randomUUID.js、密钥生成generateKey、加解密encrypt_decrypt、签名验签sign_verify等场景可作为迁移与使用的参考。4.k6 new命令支持自定义模板k6 new命令现在接受一个文件路径作为新脚本的模板。模板采用Go templates 语法并可引用以下变量ScriptName新脚本的名称ProjectID新脚本要使用的 Grafana Cloud 项目 ID。使用自定义模板生成新脚本k6 new --template /path/to/my-template.js仓库内置了minimal、protocol、browser三种模板定义于 internal/cmd/templates/templates.go模板内容见 internal/cmd/templates 目录下的 minimal.js、protocol.js 与 browser.js。从源码结构看模板解析优先匹配内置模板名无法匹配时才按文件路径读取外部模板文件两种方式共用同一套 Go 模板渲染逻辑。5. 全新的 Secret Sources密钥源与k6/secrets模块k6 新增了从不同来源获取密钥的能力。最关键的保证是从密钥源获取的值会在日志中被脱敏redact避免密钥泄露到测试日志中。本版本内置了两种实现主要用途是验证该功能从 key-value 文件读取密钥文件按每行一个keyvalue的格式组织从 CLI 参数读取密钥mock源通过--secret-sourcemockk1v1,k2v2传入。同时提供了扩展支持允许第三方实现更安全的密钥源。从源码看两种内置实现都注册在secretsource扩展机制下见 internal/secretsource/init.gomock源在 internal/secretsource/mock/mock.go 中实现将 CLI 参数按逗号拆分、再用切分为键值对file源在 internal/secretsource/file/file.go 中实现按行读取keyvalue格式并支持filename配置键指定文件路径。JS 侧通过k6/secrets模块访问实现见 internal/js/modules/k6/secrets/secrets.gosecrets.get(key)返回一个 Promise还提供了secrets.source(name)用于按名称选择密钥源。官方示例脚本位于 examples/secrets/secrets.test.js// k6 run --secret-sourcefilefile.secret secrets.test.js import secrets from k6/secrets; export default async () { const my_secret await secrets.get(cool); // 从密钥源获取标识符对应的密钥 console.log(my_secret); await secrets.get(else); console.log(my_secret); }v1.0.0-rc1 发布说明中给出的完整示例同时覆盖了直接打印密钥、在 HTTP 请求头中使用密钥以及打印整个响应体三种情况日志中均被脱敏import http from k6/http; import secrets from k6/secrets; export default async () { const my_secret await secrets.get(cool); // 从密钥源获取标识符对应的密钥 console.log(my_secret); const response await http.asyncRequest(GET, https://httpbin.org/get, null, { headers: { Custom-Authentication: Bearer ${await secrets.get(else)}, } }) console.log(response.body) }运行命令及脱敏后的输出$ k6 run --secret-sourcemockcoolnot cool secret,elsetotally a secret script.js ... INFO[0000] ***SECRET_REDACTED*** sourceconsole INFO[0031] { args: {}, headers: { Custom-Authentication: Bearer ***SECRET_REDACTED***, Host: httpbin.org, User-Agent: k6/1.0.0-rc1 (https://k6.io/), ... }, ... } sourceconsole可以看到直接console.log的密钥值被替换为***SECRET_REDACTED***请求头中拼接的Bearer令牌也被同样脱敏。官方未来还计划补充更多生产可用的密钥源实现例如当前仓库 internal/secretsource 目录下已经可以看到cloud与url类型的扩展雏形。UX 改进与增强k6 启动 banner 现在仅在终端支持时输出原始 TrueColor24-bitlogodocker-compose的 InfluxDB 示例被移动到 examples/docker-compose 目录并新增了 OpenTelemetry 示例脚本 options 出错时的错误信息得到改进k6 会尝试将出错的那部分 options 以 JSON 形式打印出来便于定位问题本地模块错误信息中的链接已更新。Bug 修复修复了ReadableStream.cancel中的竞态race并运行带竞态检测的 WPT 测试以便更容易发现类似问题修复了 browser 模块ElementHandle、Mouse、Keyboard、Response上的多个竞态条件修复了 tagset 的 JSON 序列化问题。维护与内部改进Prometheus remote write 与 OpenTelemetry 输出的代码被移入 k6 主仓库对应 internal/output/prometheusrw 与 internal/output/opentelemetry 目录尝试稳定 MacOS CI让 browser 的 throttle.js 更易运行、降低测试套件的 flakiness更新 fallback 的 x509 CA 根证书更新 Sobek 引擎修复Function.apply的一个 bug支持逻辑赋值、导出中的数组解构并改进跨操作系统的 source map 支持修复k6/timers被错误报告为总是被使用的问题重构了lib.RuntimeOptions的加载代码相关标志定义可见 internal/cmd/runtime_options.gok6 现在要求 Go 1.23 构建CI 使用 Go 1.24 并配合兼容的 golangci-lint 版本将 HDR histogram 实现抽取为共享包对应 internal/ds/histogram 目录批量更新直接依赖并让 Docker 镜像在 rc 版本时也推送latest标签——这与本版本镜像发布策略相呼应确保容器渠道同样能拿到最新代码。三、升级与迁移要点对于从 v0.57.0 或更早版本升级到 v0.58.0 的用户以下事项需要重点关注--tag语义变化如果脚本或 CI 命令依赖逗号分隔多组标签的旧行为需要改为多次--tag keyvalue的写法。配置文件路径迁移执行一次k6 cloud login或k6 login触发自动迁移然后运行k6 cloud run/k6 run验证无告警旧路径文件确认无用后可手动删除。k6/experimental/webcrypto弃用将脚本中的import { crypto } from k6/experimental/webcrypto;移除改用全局crypto该模块将在 v1.1.0 被移除。摘要格式变更新摘要默认开启。若团队依赖旧摘要格式做自动化解析可先使用--summary-modelegacy过渡注意handleSummary与--summary-export的数据结构本版本未变但未来可能调整。浏览器模块v0.57.0已移除k6/experimental/browser请确保已迁移到稳定的k6/browser模块v0.58.0 中新增的page.on(request/response)追踪能力即基于该模块。四、总结v0.58.0 是一次特殊但必要的发布它本身没有引入相对 v1.0.0-rc1 的新代码却承担了让 Homebrew、pkg.go.dev 等自动化渠道在 rc 阶段也能持续分发最新版本的关键职责。对用户而言v0.58.0 就是可被工具识别的 v1.0.0-rc1包含重设计的测试结果摘要、browser 网络追踪、全局crypto、k6 new自定义模板与k6/secrets密钥管理等一系列重要能力。随着 v1.0.0 正式版的临近这种镜像发布实践将结束k6 将回归标准的语义化版本生命周期。【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表