k6 v0.58.0 版本解析:v1.0.0-rc1 镜像发布策略与功能全览
【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6
k6 在走向 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-rc1,Homebrew 不会将其视为可安装的最新稳定版。 - pkg.go.dev:Go 包索引站点同样不会把
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 Changes)
1.--tag命令行参数的值现在支持逗号(,)
此前,--tag值中的逗号会被解释为"新一组标签值"的分隔符。由于逗号本身是标签值的合法字符,这一行为阻碍了不同方式(CLI、配置文件、脚本内)设置标签之间的一致性。v0.58.0 起逗号可正常出现在标签值中;同时仍然支持通过多次使用--tag key=value来设置多个标签。
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 Features)
1. 全新设计的 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-mode=disabled的测试用例),可用于完全关闭摘要输出。此外还提供了--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/ source=console INFO[0001] https://quickpizza.grafana.com/api/tools source=console INFO[0001] https://quickpizza.grafana.com/images/pizza.png source=console ...仓库的 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 文件读取密钥:文件按"每行一个
key=value"的格式组织; - 从 CLI 参数读取密钥(
mock源):通过--secret-source=mock=k1=v1,k2=v2传入。
同时提供了扩展支持,允许第三方实现更安全的密钥源。从源码看,两种内置实现都注册在secretsource扩展机制下(见 internal/secretsource/init.go):
mock源在 internal/secretsource/mock/mock.go 中实现,将 CLI 参数按逗号拆分、再用=切分为键值对;file源在 internal/secretsource/file/file.go 中实现,按行读取key=value格式,并支持filename=配置键指定文件路径。
JS 侧通过k6/secrets模块访问(实现见 internal/js/modules/k6/secrets/secrets.go),secrets.get(key)返回一个 Promise,还提供了secrets.source(name)用于按名称选择密钥源。
官方示例脚本位于 examples/secrets/secrets.test.js:
// k6 run --secret-source=file=file.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-source=mock=cool="not cool secret",else="totally a secret" script.js ... INFO[0000] ***SECRET_REDACTED*** source=console INFO[0031] { "args": {}, "headers": { "Custom-Authentication": "Bearer ***SECRET_REDACTED***", "Host": "httpbin.org", "User-Agent": "k6/1.0.0-rc1 (https://k6.io/)", ... }, ... } source=console可以看到,直接console.log的密钥值被替换为***SECRET_REDACTED***,请求头中拼接的Bearer令牌也被同样脱敏。官方未来还计划补充更多"生产可用"的密钥源实现,例如当前仓库 internal/secretsource 目录下已经可以看到cloud与url类型的扩展雏形。
UX 改进与增强
- k6 启动 banner 现在仅在终端支持时输出原始 TrueColor(24-bit)logo;
docker-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.go); - k6 现在要求 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 key=value的写法。- 配置文件路径迁移:执行一次
k6 cloud login或k6 login触发自动迁移,然后运行k6 cloud run/k6 run验证无告警;旧路径文件确认无用后可手动删除。 k6/experimental/webcrypto弃用:将脚本中的import { crypto } from 'k6/experimental/webcrypto';移除,改用全局crypto;该模块将在 v1.1.0 被移除。- 摘要格式变更:新摘要默认开启。若团队依赖旧摘要格式做自动化解析,可先使用
--summary-mode=legacy过渡;注意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),仅供参考