前言
由于篇幅问题,本篇文章将不会对Drone CI如何集成Vault进行讲解。笔者会默认读者已经集成好Vault并且遇到了Secret时而能读取时而无法读取的问题。
偶遇问题
笔者有幸在Drone CI
的1.0.x版本发布的时候得知可以集成Vault,然后顺势而为将Drone CI
升级了之后顺带对Secrets
一并做了迁移工作(以前是直接用Drone CI
自带的,现在迁移到Vault上方便管理)。一开始蛮顺利的,第一第二第三个项目都没有任何问题,已经忘记是第几个项目,开始出现了自动部署的时候Secret丢失的问题。一开始以为是设置不正确,经过排查发现Vault上的值和路径是完全没问题的,.drone.yml
上的配置也是天衣无缝,找不到任何有问题的地方。
经过笔者的再三排查,终于在drone-vault
(Drone CI作者开发的一个用于Vault和Drone CI连接的插件)的日志中发现了端倪。
相信细心的你已经发现了问题所在。没错,drone-vault
替我们去Vault中去读取我们需要的Secret时很淘气地把最后最后一个Secret的名字给弄错了。但是.drone.yml
中明明是写全了,并且使用yaml的格式化工具也检测不到任何问题。愁人呐!
误打误撞解决问题
笔者当机立断,觉得既然是最后一个键被剃去了一部分,那么我加一行行不行?本着实干家的精神,说干就干!(.drone.yml
文件的结尾处在格式化后是已经自带了一行空行的,因此我是在空行后面又加了一行空行)
无心插柳柳成荫,没想到加了一行之后,Vault的Secret读取正常了!
冷静分析从根源上解决问题
虽然在空行的后面再加上一行空行可以解决读取不到的问题,可是再用代码格式化工具格式化的时候会把多余的空行移除(一般只会留一行空行),所以之前的解决方案肯定不是最终解决方案。
慢慢分析,开始怀疑问题出在Secret的名字上面,因为之前出问题的Secret的名字以d
结尾,极有可能不能以这个d
结尾,否则就会被剃掉。时间是检验真理的唯一标准,笔者新建了一个项目,读取了一个不是以d
结尾的Secret值,结果发现,一样读取不到,最后一个字母一样被剃掉了。
那么问题会出在哪呢?
会不会是某些地方的换行导致了问题的出现?心中带着这个疑问开始了另一个实践,把多余的空白换行移除。推送代码,打开Drone CI
的Web页面,我的天呐,出现了!这个一直被剃掉的最后一个Secret居然出现了!
下面贴出笔者实践的错误的.drone.yml
:
下面是正确的.drone.yml
:
一目了然是不是?
Happy Ending
至此,这篇文章就要跟大家说再见了。希望大家能从这篇文章中得到帮助。如果你对这篇文章有任何意见或建议,都欢迎给我发送邮件,优质的文章离不开读者的反馈。