术语:Dirty/Changed
ambot package 体系中广泛使用了 Dirty 这一概念,但在不同的场景下其语义不尽相同。
Dirty Package
如果在 ambot-version 中查看到 tag 是 <no tag> D ,其中的 D 就代表 dirty,使用 -a 或 --show-dirty 更能看到一个独立的 Dirty 列,同时 Version 列也会包括 -dirty 后缀,BUILD 脚本中也有 dirty 这一预定义变量。
以上的 dirty 是一个相同的含义,其含义是在打包时工作路径存在未提交内容(包括 untracked, unstaged, staged),因此 dirty package 的 commit 是无意义的,因为实际执行代码可能已经在编译前被修改。
dirty package 的存在是危险的,其意味着相关版本管理均将无效。同时 dirty package 无法被升级(除非特殊为 dirty 进行打包)。因此,ambot-packager 默认将拒绝打包 dirty 环境,同时 ambot-install 也将拒绝安装 dirty package
(Update) Dirty 状态
在正在确定的升级流程中,提到了「如果是 dirty 状态则禁止升级」,我们在本段中将这一 dirty 称为 update dirty。
可能为 Update Dirty 的内容目前有三个:Software Mount、Config Mount、Service。
对于 Mount 而言(包括 Software Mount 和 Update Mount),Update Dirty 状态等同于 Update Changed(详情请参考下面的 Changed 状态)。
对于 Service 而言,Update Changed 状态会导致 Update Dirty(详情请参考下面的 Changed 状态),另外,如果使用过 ambot-service edit 并进行了实质修改则也为 Update Dirty。
你可以使用 ambot-git why-dirty -p [pkg-id] 来查看具体什么导致了 Dirty。
解决 Update Dirty 的唯一办法是使用 ambot-git revert 命令,具体请参考文档或使用 ambot-git revert -h 查看帮助(这个命令可能失败,因此只允许手工执行、不可放入自动化)。
(Update) Changed 状态
一个 Changed 状态会始终导致 Dirty 状态
如果你在 ambot-version 中查看到一行为黄色、package 名称后有 * 或是使用 -a 或 -c 参数时出现的 Changed 列不为空即证明这个 Package 处于 Changed 状态。
Changed 状态意味着所展示的目录(安装路径或配置路径)存在未经标准流程的修改,例如手动编辑过配置文件、替换过程序等,或是修改了服务配置但并未使用 ambot-service edit 。
注: Config Changed 状态可能是异常情况也可能是因为 vars 无法覆盖所有的情形导致的。如果一个 Config 文件的变更完全可以利用 vars 修改那么这是一个异常,相关修改人员应当复原这一修改并依据标准流程重新修改。而如果一个 config 文件初期并未被标记为依靠模板渲染或是模板变量未覆盖所期望的修改,则这不是一个异常,这种情况相关人员在先行修改后应当告知部署团队在下一个版本中将之稳定为模板,并在相关版本升级后将这一修改使用模板完成。
你可以使用 ambot-git why-changed -p [pkg-id] 来查看具体什么导致了 Changed。
解决 Update Dirty 的唯一办法是使用 ambot-git restore 命令,具体请参考文档或使用 ambot-git restore -h 查看帮助(这个命令可能失败,因此只允许手工执行、不可放入自动化)。