从上手 Travis CI 时犯的错误聊起


现在是 2021 年 5 月 22 日晚 21 点,距我开始上手 travis ci 已经过去了 5 个小时。我大约花了 4 个小时才最终配置好一个最简单的对个人主页 (http://www.saltroping.com) 的自动部署,而这 4 个小时里我走过无数弯路,犯下无数错误,甚至一度想要放弃这个想法,不过最终我还是决定把这件简单的小事做完。而正是因为这个过程非常艰难,回头看来很多错误也非常蠢笨,所以我在此复盘这个过程,以此作为一次踩坑记录和反思。

为什么要用 Travis CI

使用 Travis CI 的原因,有百分之七十是突发奇想,百分之二十是从众,百分之十是想要自动部署我的个人主页。Travis 最大的好处在于可以和 Github 几乎无缝联动,使得从开发到部署整个流程非常连贯清晰。对于一个简单的静态网页自动部署来说,确实也相对方便。

回顾大体过程

首先要在 Travis 网页中启动 Travis,之后在项目中新建 Travis 配置 .travis.yml,其中包括项目语言、install 脚本、script 脚本、deploy 脚本等。之后在每次提交时,Travis 便可以按照仓库中的 .travis.yml 运行。这基本就是使用 Travis 的方法。 因为我要将项目部署到服务器上,因此需要 Travis 在部署时能够通过 ssh 执行服务器上的半自动部署脚本。但 travis 在执行过程中并不能实现输入密码等操作,所以首先需要在服务器生成 sshkey,让 Travis 携带 sshkey 公钥访问服务器,这样就可以直接通过 sshkey 登录服务器,而避免了密码操作。但直接将公钥放在项目文件中毫无疑问是非常危险的举措,所以需要让 Travis 对公钥加密后上传,并在 .travis.yml 中写好解密脚本,这样 Travis 执行时可以当场解密公钥。而解密脚本中需要用到一些环境变量解密,这些环境变量存放在 Travis 服务器中并不公开,于是便保证了安全。

犯下的错误和踩过的坑

一些具体操作网络上资料很多,官方文档也有说明,我就不多赘述。 但尽管如此我还是犯了很多错误踩了很多坑,我可以在此列举一下,希望能帮到和我遇到一样的问题(大概不可能)的人。 Travis CI 账号未激活。这个问题大概没有人会遇到,纯属是我的问题。 iv undefined. 这出现在解密脚本中,简单来说这个报错的意思是你的环境变量没有添加到 Travis 中。但一般来讲在加密文件时,Travis 会自动将变量上传到服务器,不会发生上述问题。所以如果出现这个问题,有可能是你传错了 Travis 服务器。Travis 有多个服务器,如 travis-ci.comtravis-ci.org 等等,在执行travis logintravis decrypt-file等指令时常常会加上 –com 之类的选项表示是对哪个服务器操作,而如果没有的话则是使用 ~/.travis/config 文件中的 endpoints 所指定的服务器。如果你在加密时生成的环境变量没有上传到你在网页上使用的服务器的话,那么你在执行中便没有办法读取到解密需要用到的变量。 The command “rake” exited with 1. 这个报错可能是没有指定配置中的 install 和 script,导致 travis 不知道如何去执行脚本。一般来说,在开头指定语言后,travis 可以按照语言的默认执行方式去执行,但如果没有指定语言,就必须手动填写 install 和 script。如果和我一样希望直接跳过,那么可以直接令 install:true scipt:true。 **一些 Git 和 Github 相关问题。**这些问题参考资料有非常多,有时解决的方式也千奇百怪。但可以说 Git 和 Github 的问题很多时候并不能算问题,大部分时候也不会消耗太多时间精力。

为什么总是在”解决问题”

记得之前听过一个说法,真正的技能不是“解决问题”。如果一个声称拥有某项技能的人在处理这项任务时,只是查找各种解决方案去“解决问题”,那他不能叫拥有这项技能。 这也能解释为什么我在上手 Travis 的时候总是在解决一些细枝末节的小问题,总是在踩一些坑。因为从一开始,我便是以“解决问题”的方式去做这件事情。我直接去查资料,查教程,大体看过一遍后便开始一步一步跟着做,碰到什么问题什么报错便再去查资料,不断递归。在复制粘贴指令的时候,我只考虑我的输入是什么,我的输出和教程上的输出是否一致,如果一致便继续下一步,而从没有仔细看明白其中的过程。实际上我上述的问题如果真的按照教程走的话完全不会遇到,但没有一个人写下自己的经验是为了让别人复制粘贴的,在自己上手的过程中必然会遇到不一样的状况,而想要灵活地处理各种状况就必然不能去“解决问题”,而是切实地明白这一系列步骤背后的逻辑,切实地明白这一条条命令背后的含义。 所以尽可能少地复制粘贴,尽可能多地思考为什么。不要总是去“解决问题”,而是经常去学习技能。只有脱离手把手教学的模式,才能够最高效地学习。