- 云原生
- DevOps
- 运维
【免费下载链接】devtron
The only Kubernetes dashboard you need
Devtron v0.6.24 是一次以镜像 Tag 自定义能力与**作用域变量(Scoped Variables)**为核心的迭代版本:它引入了基于{x}计数占位符的 Custom Tag 方案,并对作用域变量的敏感数据遮蔽、缓存与命名校验做了增强,同时修复了 EA 模式下 NATS 客户端 panic、重复 Tag、镜像扫描错误处理等一系列问题。读完本文,你将掌握 Custom Tag 的字段语义与校验规则、作用域变量的配置项与解析原理,并能对照源码定位每个修复点的真实实现。
版本概览:v0.6.24 的四类变更
v0.6.24 的发布说明(CHANGELOG/release-notes-v0.6.24.md)将变更分为四类:
| 类别 | 条目数 | 主要内容 |
|---|---|---|
| Bugs | 5 | EA 模式 NATS panic、SQL 查询号变更、重复 Tag、镜像扫描错误处理、valuesOverrideResponse |
| Enhancements | 2 | Custom Tag(#3847)、作用域变量增强(#4069) |
| Documentation | 4 | 文档链接相对/绝对路径修正、Partial Cloning 能力说明、Exclude Git Files 章节 |
| Others | 2 | WorkflowDagExecutor 方法迁移、SQL 181 脚本修复 |
其中,两个 Enhancements 是本版本的功能主线,其余条目多为稳定性与文档层面的收尾。下文将围绕这两条主线展开,并结合仓库源码逐条解读其余修复。
新功能一:Custom Tag——自定义镜像 Tag 生成机制
1. 核心数据结构与实体类型
Custom Tag 功能解决的是「如何为构建产物生成稳定、可预测、不冲突的镜像 Tag」这一问题。其数据模型定义在 api/bean/CustomTag.go:
type CustomTag struct { EntityKey int `json:"entityKey"` EntityValue string `json:"entityValue"` TagPattern string `json:"tagPattern"` AutoIncreasingNumber int `json:"counterX"` Metadata string `json:"metadata"` Enabled bool `json:"enabled"` }各字段语义如下:
- EntityKey:Tag 绑定到的实体类型。在 pkg/pipeline/bean/CustomTagService.go 中定义了
EntityTypeCiPipelineId(CI 流水线)、EntityTypePreCD(CD 前置阶段)、EntityTypePostCD(CD 后置阶段)三种取值,即同一套 Tag 规则可分别挂载在 CI 构建或 CD 的前置/后置任务上; - EntityValue:对应实体的标识值(如流水线 ID);
- TagPattern:Tag 模板,必须包含且仅包含一个
{x}(小写)或{X}(大写)计数占位符; - AutoIncreasingNumber:自增计数器(即
{x}占位符被替换的当前值); - Metadata:附加元数据;
- Enabled:是否启用该规则。
当调用方同时提交重复的 key-value 组合时,服务层会先查询旧记录,若存在则改为更新(UpdateImageTag),从源头避免「同一键值对产生重复 Tag」的问题(对应修复条目 #4139)。
2. Tag 模板的校验规则
CreateOrUpdateCustomTag与validateAndConstructTag在 pkg/pipeline/CustomTagService.go 中执行了严格的输入校验,validateTagPattern的规则如下:
TagPattern不能为空,否则报错tag pattern cannot be empty;- 必须包含且仅包含一个
{x}或{X}占位符——缺失时报variable with format {x} or {X} not found,多于一个时报only one variable with format {x} or {X} allowed; - 将占位符替换为
1(哑值)后,整个 Tag 必须匹配 Docker 镜像 Tag 的正则:
REGEX_PATTERN_FOR_IMAGE_TAG = `^[a-zA-Z0-9]+[a-zA-Z0-9._-]*$`即 Tag 必须以字母或数字开头,后续可包含字母、数字、点、下划线与连字符(见 pkg/pipeline/bean/CustomTagService.go)。另外,写入时大写占位符{X}会被统一归一化为小写{x}(strings.ReplaceAll),保证存储侧只有一种写法。
3. 镜像路径生成与防冲突保留机制
Custom Tag 真正的价值在于自动生成不重复的镜像路径。GenerateImagePath的实现展示了其底层原理:
tag, err := validateAndConstructTag(customTagData) // 将 {x} 替换为自增值 imagePath := fmt.Sprintf(pipelineBean.ImagePathPattern, dockerRegistryURL, dockerRepo, tag) // ImagePathPattern = "%s/%s:%s" → dockerReg/dockerRepo:Tag imagePathReservations, err := impl.customTagRepository.FindByImagePath(tx, imagePath) if len(imagePathReservations) > 0 { return nil, pipelineBean.ErrImagePathInUse // "Desired image tag already exists" }整个流程在数据库事务中完成:
IncrementAndFetchByEntityKeyAndValue(tx, ...)——对计数器执行原子自增并取出最新值;validateAndConstructTag——将{x}替换为AutoIncreasingNumber - 1(注释说明"数字已自增,当前值将在下次使用"),生成最终的 Docker Tag;- 拼接
dockerReg/dockerRepo:Tag得到完整镜像路径; - 在
image_path_reservation表中查询该路径是否已被占用,若已被占用则返回ErrImagePathInUse(错误文案为Desired image tag already exists); - 未被占用则插入一条
ImagePathReservation记录完成路径保留,随后提交事务。
这套「先自增 → 再查重 → 后保留」的设计,使得并发触发构建时每个构建拿到的 Tag 都是全局唯一的,这正是 Custom Tag 可靠性的核心。ReserveImagePath还提供了对外部传入镜像路径的独立保留入口,供非 Custom Tag 场景复用。
新功能二:作用域变量(Scoped Variables)增强
作用域变量是 Devtron 的全局配置能力之一,允许按 app/env/cluster 等限定符为变量赋予不同取值。v0.6.24(#4069)对该模块做了多项增强。
1. 变量命名与格式配置
在 pkg/variables/ScopedVariableService.go 中,VariableConfig通过环境变量控制核心行为:
| 环境变量 | 默认值 | 作用 |
|---|---|---|
SCOPED_VARIABLE_NAME_REGEX | ^[a-zA-Z][a-zA-Z0-9_-]{0,62}[a-zA-Z0-9]$ | 变量名的正则约束,必须以字母开头,总长不超过 64 字符,且不能以_/-结尾 |
VARIABLE_CACHE_ENABLED | true | 是否启用全量变量缓存(内存缓存,加载失败会回落直查数据库) |
SYSTEM_VAR_PREFIX | DEVTRON_ | 系统变量的保留前缀,命名冲突时可感知 |
SCOPED_VARIABLE_FORMAT | @{{%s}} | 变量在表达式中的占位格式,即@{{变量名}} |
也就是说,用户在模板/配置中引用变量时写的是@{{MY_VAR}}这种形式,GetFormattedVariableForName负责生成该格式。
2. 敏感变量遮蔽机制
作用域变量支持PRIVATE(敏感)类型。GetScopedVariables在返回数据时,若调用方未携带unmaskSensitiveData=true(即非超级管理员),会对PRIVATE类型变量做遮蔽处理:
if !unmaskSensitiveData && variableIdToDefinition[varId].VarType == models.PRIVATE { varValue = &models.VariableValue{Value: models.HiddenValue} isRedacted = true }返回结果中IsRedacted=true且值被替换为隐藏占位符,普通用户无法读取敏感变量明文。值得一提的是CheckForSensitiveVariables采用「默认全敏感」的安全策略——对于已删除或未知的变量,一律按敏感处理,只有超级管理员才能看到历史值。
3. 缓存与表达式推导
- 缓存机制:
VARIABLE_CACHE_ENABLED=true时,服务启动会异步执行loadVarCache将全部变量元数据载入内存(VariableCacheObj,带互斥锁)。查询时优先读缓存,缓存未加载才回退到数据库GetAllVariables(),降低高频查询压力。 - 表达式推导:
deduceVariables会扫描变量值中的@{{name}}占位符,并通过resolveExpressionWithVariableValues(正则@{{([a-zA-Z0-9-_\s]+)}})将字符串型变量值中引用的其他变量递归替换为实际取值,实现变量间相互引用;若引用的变量不存在,则记录警告并跳过该次解析。 - 作用域优先级:
GetMatchedScopedVariables+GetScopeWithPriority负责从 DB 查出的多个限定符映射中选出最精确匹配的一个(通过QualifierComparator比较限定符粒度,复合限定符如 app+env 需要子限定符全部命中才会入选),保证同一变量在多重作用域下取值唯一且符合预期。
4. API 与权限
作用域变量的 REST 接口位于 api/restHandler/scopedVariable/ScopedVariableRestHandler.go,共三个:
CreateVariables:写入变量清单,请求体为ScopedVariableManifest,校验通过后调用服务层在事务内先删旧映射再批量写入;要求超级管理员(casbin.ResourceGlobal + ActionCreate)权限;GetScopedVariables:按appId与 JSONscope查询参数获取作用域内的变量值,要求用户对该应用具备ActionGetRBAC 权限,且会校验scope.appId与 URL 中appId的一致性;GetJsonForVariables:导出全部变量为 JSON 并提供运行时生成的 JsonSchema,同样要求超级管理员权限。
其中utils.ManifestToPayload / PayloadToManifest负责 Manifest 与内部 Payload 模型的互转,保证前端表单与后端存储模型解耦。
关键 Bug 修复逐条解读
1. EA 模式下 NATS 客户端 panic(#4162)
v0.6.24 修复了 EA(Enterprise Edition)模式下 NATS 客户端在连接未建立/已关闭时被调用导致的 panic 问题。该修复属于运行期健壮性收尾——在 EA 模式下 NATS 的初始化时机与 CE 存在差异,调用方需要先确认连接状态再发布消息,避免空指针/无效连接引发的进程崩溃。
2. 重复 Tag(#4139)
如前述 Custom Tag 一节所述,CreateOrUpdateCustomTag在写入前会按EntityKey + EntityValue查询旧记录:存在则更新、不存在则创建。配合镜像路径保留表中对同一镜像路径的唯一性检查,杜绝了「同一键值对重复生成 Tag」与「同一镜像路径被多个构建占用」两类问题。
3. 镜像扫描错误处理(#4150)
镜像扫描(Image Scan)模块在 pkg/policyGovernance/security/imageScanning/ImageScanService.go 中集中了多处错误处理强化:FetchAllDeployInfo、FetchScanExecutionListing、fetchScannedAppEnvListing等入口均以Errorw记录上下文日志并在出错时返回明确的错误对象,避免错误被吞掉导致扫描结果静默失败;同时将「已扫描项/未扫描项」两个查询路径的错误处理统一,前端能够根据错误码区分「查询失败」与「无数据」。
4. valuesOverrideResponse 修复(#4149)
valuesOverrideResponse是 CD 部署触发时生成的部署参数响应对象,被优先级部署(Priority Deployment)的 CEL 评估使用。在 pkg/eventProcessor/celEvaluator/WorkFlowTriggerEvent.go 中,IsPriorityDeployment会基于valuesOverrideResponse取出 Artifact 的镜像仓库与 Tag(ExtractImageRepoAndTag)构造 CEL 表达式参数。本版本的修复针对该响应对象在特定场景下字段缺失或解析异常的问题,确保优先级判断不再因响应结构问题中断。
5. SQL 查询号变更(#4163)与 SQL 181 脚本修复(#4144)
发布说明中的 "query number changed" 指某些 SQL 迁移脚本的版本号/序号做了调整。其中 181 号脚本的修复比较典型,见 scripts/sql/181_remove_index_image_scan_deploy_info.up.sql:
-- up:将唯一索引降级为普通索引 DROP index image_scan_deploy_info_unique; CREATE INDEX image_scan_deploy_info_unique ON public.image_scan_deploy_info USING btree (scan_object_meta_id, object_type); -- down:回滚为唯一索引 DROP index image_scan_deploy_info_unique; CREATE UNIQUE INDEX image_scan_deploy_info_unique ON public.image_scan_deploy_info USING btree (scan_object_meta_id, object_type);其背景可以推断为:image_scan_deploy_info表上原本基于(scan_object_meta_id, object_type)的唯一索引在真实业务下会因同一扫描对象多次入库而触发冲突,因此将该索引改为普通 B-tree 索引以提升写入容错,同时保留查询性能。升级时请确认迁移脚本顺序已同步。
6. WorkflowDagExecutor 方法迁移(#4147)
本次变更将WorkflowDagExecutor使用到的若干方法从其依赖模块迁入 pkg/workflow/dag/WorkflowDagExecutor.go 自身,属于纯代码整理(chore),目标是减少包间耦合、让 DAG 执行器自包含。功能行为不变,无需额外配置。
文档更新与使用提示
本版本还同步了一批文档改进:
- Partial Cloning(部分克隆)能力说明(#4142):在 docs/user-guide/deploying-application/triggering-ci.md 与 docs/user-guide/integrations/build-and-deploy-ci-cd.md 中明确了 Devtron 的部分克隆特性——对大型仓库可显著缩短 CI 阶段克隆源码的耗时,进而加快构建;文档同时列出其优势(更小的镜像体积、更低的资源消耗与成本、更快的发布、更高的研发效率)。
- Exclude Git Files 章节(#4136):在既有 CI 文档中补充了「排除 Git 文件」的使用说明,用于在构建前过滤仓库中不需要参与构建的文件。
- 链接路径规范化(#4155/#4156):将文档内部链接统一为相对路径并带扩展名(或按文档场景调整为绝对路径),保证文档在 GitBook 等渲染环境下的跳转稳定性。
升级建议
- 若你正在使用镜像扫描功能,请重点验证升级后 181 号迁移是否按序执行,以及扫描列表接口在「无数据 / 查询失败」两种情形下的错误提示是否正常;
- 若你在 CI/CD 流水线中使用自定义镜像 Tag,升级后可通过 Custom Tag 配置页校验
{x}占位符与计数器的生成结果,确认同一键值对不再产生重复 Tag; - 若你使用作用域变量,注意
SCOPED_VARIABLE_NAME_REGEX、SYSTEM_VAR_PREFIX、SCOPED_VARIABLE_FORMAT等环境变量的默认约束,尤其是变量名需满足「以字母开头、以字母或数字结尾」的命名规范,否则创建变量会被拒绝。
总体而言,v0.6.24 是 Devtron 在「镜像 Tag 治理」与「全局变量体系」两个方向上的一个稳健迭代:既有面向用户的新能力(Custom Tag、作用域变量增强),也有面向稳定性的修复与文档完善。相关源码均可在 pkg/pipeline/CustomTagService.go、pkg/variables/ScopedVariableService.go、pkg/policyGovernance/security/imageScanning/ImageScanService.go 中进一步查阅验证。
- 云原生
- DevOps
- 运维
【免费下载链接】devtron
The only Kubernetes dashboard you need
相关推荐
Incus 镜像制作实战指南:从实例发布镜像到构建自定义镜像
Incus 镜像制作实战指南:从实例发布镜像到构建自定义镜像 本篇指南围绕 Incus 的镜像创建能力展开,覆盖两种主流路径:从已有实例(或实例快照)发布镜像,
后端虚拟化容器运行时Devtron 作用域变量(Scoped Variables)完全指南:YAML 定义、作用域优先级与使用实战
Devtron 作用域变量(Scoped Variables)完全指南:YAML 定义、作用域优先级与使用实战 本文是 Devtron 平台"作用域变量(Sco
云原生DevOps运维docker-selenium 镜像发布实战:从 Firefox 103.0.2 发布日志解读浏览器镜像 Tag 生成机制
docker selenium 镜像发布实战:从 Firefox 103.0.2 发布日志解读浏览器镜像 Tag 生成机制 导读:本文以 docker sele
测试后端云原生容器编排可观测性
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考