- DevOps
- CI/CD
- 后端
- CLI
- 云原生
【免费下载链接】dagger
Automation engine to build, test and ship any codebase. Runs locally, in CI, or directly in the cloud
Dagger v0.18.3(2025-04-14 发布)是一个以开发体验打磨为主的补丁版本,其变更日志位于 .changes/v0.18.3.md。本篇以该变更记录为核心骨架,逐条解析其中 4 项新增能力、2 项缺陷修复与 1 项实验特性,并结合当前仓库中仍然可见的对应源码实现(MCP 服务端、Vault Secret 缓存 TTL、git 配置解析工具)给出源码级佐证,帮助读者在升级 0.18.x 线版本时准确理解每项变更的用法与底层机制。
版本变更总览
v0.18.3 的变更日志按 Dagger 惯例分为 Added / Fixed / Experimental 三个板块,完整内容如下(引自 .changes/v0.18.3.md):
| 分类 | 变更 | 对应上游 PR |
|---|---|---|
| Added | dagger develop新增--recursive标志 | #9860 |
| Added | 支持在不指定 SDK 的情况下加载模块 | #9984 |
| Added | Container.build与Directory.dockerBuild支持跳过自动 init 进程 | #10088 |
| Added | 本地 Vault Secret 缓存支持指定ttl | #9997 |
| Fixed | 修复解析多行 git 配置文件时的报错 | #10087 |
| Fixed | 修复尝试 shell 补全时的边界 panic | #10125 |
| Experimental | 将 Dagger Core API 暴露为 MCP 工具 | #10090 |
需要说明的适用前提:该变更日志对应 2025-04-14 发布的 0.18.x 版本线。当前仓库快照是其后演进得相当远的主干(文档目录中已出现 0.19~0.21 的版本化文档),因此下文中对源码的引用反映的是这些特性在当前主干中的演进形态;命令行用法请以 v0.18.3 发行版自身的行为为准。
Added:新增能力逐条解析
dagger develop --recursive:递归启动本地开发服务
v0.18.3 为dagger develop命令新增了--recursive标志。dagger develop的作用是在本地拉起项目声明的服务(数据库、API、开发服务器等),供开发者在容器外直接调试;新增的--recursive使该命令能够递归处理目录/模块结构,而不是只处理顶层声明。
从当前仓库源码结构看,"本地开发服务"这条能力线已经演进为职责更宽的命令:dagger start 的子命令描述为 "Run your project's services for local development — databases, APIs, dev servers, etc.",其内部流程是解析工作区中的命令 Artifact(commandArtifactsWithFlags)、将结果映射为Service节点、再通过Host().Tunnel(...)建立宿主端口转发(runServices),并在转发前显式检测端口冲突(start.go 中 "port collision detected" 报错,见 internal/cmd/dagger/start.go#L142-L147)。可以推断,v0.18.3 中develop --recursive所服务的"多服务、多模块本地联调"场景,正是这条服务启动链路的早期形态。
免 SDK 指定加载模块:降低模块接入门槛
此前加载(load)一个 Dagger 模块往往需要在模块声明中指定具体 SDK;v0.18.3 允许省略 SDK 字段直接加载模块(PR #9984),由引擎根据模块实际代码自动推断合适的 SDK/语言运行时。
当前仓库中模块加载与 SDK 解析逻辑分别落在 internal/cmd/dagger/module.go、internal/cmd/dagger/module_sdk.go 与 internal/cmd/dagger/module_init.go 等文件中,模块初始化、SDK 选择(含动态 SDK)与模块解析被拆分为独立职责。从源码结构看,这一拆分使得"模块定义"与"模块所用 SDK"可以解耦,正是 v0.18.3 免 SDK 加载能力的工程基础:声明里不再强制绑定 SDK,加载器即可按代码内容推断。
跳过Container.build/Directory.dockerBuild的自动 init 进程
Dagger 在构建容器时默认会执行一个自动的 init 进程(负责信号转发、PID 1 回收等)。部分场景下(例如镜像构建的中间层、或用户自己已经管理进程生命周期时)这个自动 init 进程是多余的。v0.18.3(PR #10088)允许在使用Container.build和Directory.dockerBuild时显式跳过该自动 init 进程。
这两个 API 的核心实现分别位于 core/container.go(Container.build的构建流程)与 core/directory.go(Directory.dockerBuild的镜像构建入口)。这一变更的价值在于:构建中间产物不再携带额外的 init 层开销,也更接近原生docker build的行为,便于与既有镜像构建脚本对齐。
Vault Secret 本地缓存支持ttl
v0.18.3 允许为"从 Vault 拉取并缓存在本地"的 Secret 指定ttl,控制缓存条目的过期时间(PR #9997)。这项能力在当前主干中可以直接对照源码验证,实现位于 engine/client/secretprovider/vault.go:
- 缓存结构
dataWithTTL为每条缓存记录附带过期时间(见 vault.go#L16 起的dataWithTTL定义与vaultCache全局缓存表); ttl通过 Vault Secret 路径的 query 参数传入,代码从解析后的 URL 中取ttl参数并用time.ParseDuration解析,非法值会直接报错(vault.go#L67-L73),即写法形如vault://<path>?ttl=10m;- 命中缓存前会先经
hasExpired判断是否过期——"if no ttl set, assume no ttl required"(vault.go#L117-L119),即未设置ttl时缓存不自动失效,与 v0.18.3 之前的行为保持向后兼容。
从源码结构看,这条路径同时还处理了 Vault OIDC 登录与 token 缓存(vaultOIDCLogin、saveCachedVaultToken,见 vault.go#L203-L208),Secret TTL 与 token 缓存共同构成客户端侧的本地缓存层。对使用dagger secret系列命令从 Vault 读取敏感值的用户而言,ttl让本地缓存的存活时间变得可预期、可审计。
Fixed:缺陷修复
多行 git 配置文件解析报错
v0.18.3 修复了解析多行 git 配置文件(例如包含多行includeIf、多段[section]的.gitconfig)时产生的解析错误(PR #10087)。Dagger 在多个场景需要读取 git 配置(认证凭据、insteadOf 重写等),相关解析工具集中在 util/gitutil 包中,包括 util/gitutil/cli.go 与 util/gitutil/config_env.go。修复后,结构较复杂的用户级 git 配置不会再导致 git 相关操作报错退出。
shell 补全边界 panic
同一版本还修复了尝试 shell 补全(completion)时的一处边界情况 panic(PR #10125),属于 CLI 健壮性修复,避免在特定补全请求下 CLI 进程崩溃。
Experimental:将 Dagger Core API 暴露为 MCP 工具
v0.18.3 最具前瞻性的条目是实验特性:将 Dagger Core API 暴露为 MCP(Model Context Protocol)工具(PR #10090),使 MCP 客户端(如 LLM Agent)可以直接调用 Dagger 的核心能力,而不必局限于工作区模块声明的函数。
该特性在当前主干中已发展为一条完整的 MCP 链路,可以据此理解 v0.18.3 引入时的设计:
- CLI 侧为
dagger mcp子命令(internal/cmd/dagger/mcp.go),当前仍标记为experimental(Annotations: map[string]string{"experimental": "true"}); - 关键开关
--env-privileged的帮助文案正是 "Expose the core API as tools"(mcp.go#L21-L25)——即把 Core API 作为工具集暴露出去,与 v0.18.3 的 Experimental 条目一一对应; - 服务流程上,
mcpStart先解析当前 workspace 并校验存在模块(或指定了--env-privileged),随后通过 GraphQL 查询llm.withWorkspace(workspace: <id>).__mcp绑定工作区 schema 并启动 MCP 服务(mcpStart); - 引擎侧的 MCP 服务端/客户端实现位于 core/mcpserver.go、core/mcpclient.go 与 core/mcp.go。
由于dagger mcp依赖 stdio 传输,CLI 会强制保证进度输出不干扰标准输入输出:若 progress 设为tty则直接报错,若为auto且存在 TTY 则自动降级为plain(mcp.go#L30-L41)。
小结
- v0.18.3 的四项 Added 分别指向"本地开发体验"(
develop --recursive、免 SDK 加载模块)、"构建控制力"(跳过自动 init 进程)与"Secret 缓存可控性"(Vaultttl),均为面向模块开发者的渐进式增强; - 两项 Fixed 修复了 git 配置解析与 shell 补全的健壮性问题,源码层面可对照 util/gitutil 与 CLI 命令实现;
- Experimental 的 MCP 工具暴露是后续"Agent 调用 Dagger"能力线的起点,当前主干中的 internal/cmd/dagger/mcp.go 与 core/mcp.go、core/mcpserver.go 提供了完整演进证据;
- 使用该版本的读者注意:变更日志仅描述该版本相对前序版本的行为差异,
ttl参数、--env-privileged等具体参数的最新形式建议以当前仓库对应源码与随版本发布的文档为准。
- DevOps
- CI/CD
- 后端
- CLI
- 云原生
【免费下载链接】dagger
Automation engine to build, test and ship any codebase. Runs locally, in CI, or directly in the cloud
相关推荐
Dagger TypeScript SDK 的 DirectoryAsModuleSourceOpts:sourceRootPath 详解与模块源码加载实战
Dagger TypeScript SDK 的 DirectoryAsModuleSourceOpts:sourceRootPath 详解与模块源码加载实战 本
DevOpsCI/CD后端CLI云原生strands-agents Python SDK v1.12.0 版本解析:工具模块化加载、MCP 嵌入式资源与模型层增强
strands agents Python SDK v1.12.0 版本解析:工具模块化加载、MCP 嵌入式资源与模型层增强 导读 本文围绕 strands a
人工智能大模型AI AgentAgent 框架多智能体工具调用MCP 服务Dagger TypeScript SDK 的 CurrentModuleWorkdirOpts 详解:模块工作目录加载与过滤选项
Dagger TypeScript SDK 的 CurrentModuleWorkdirOpts 详解:模块工作目录加载与过滤选项 本篇技术指南围绕 Dagge
DevOpsCI/CD后端CLI云原生
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考