烦:每次本地提交代码到 GitHub 上后还要自己手动同步文件到云服务器,完成所谓的部署工作有点麻烦和脱节。
懒:程序员等所有自称工程师进步的先决动力,想实现一个我每次提交代码后,后面的构建,打包和部署都自动进行的流程。
因为本身代码托管在 Github 上,所以就开始折腾 Travis-CI了。
什么是CI
持续集成服务(Continuous Integration,简称 CI)。
一般指的是提供一个运行环境,自动化执行单元测试,规范检查,基于环境的构建,服务部署等流水线作业。
持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。
另外,这个是工程化实践,如果你觉得自己手动操作比整这些繁琐的流程方便多了,我觉得也是没问题的。
Travis CI
Travis CI 对 Github 上的开源项目提供免费服务,这要求必须有 Github 账号。界面也很赞~,让我想起了前东家的 PLUS 发布系统。
可以使用 github 账号直接登录, public 的仓库也直接同步到 Travis 上了, 选择想开启 Travis CI 的仓库,打开开关即可。详细配置不细说了,图形化界面,进去就知道了。
.travis.yml
Travis-CI配置文件,存放在项目根目录下。
支持多种语言,在配置文件中 language: node_js
一个比较完整的生命周期
1 | before_install |
详细配置参考 官方文档
一些准备工作
由于后面的免密登录和部署流程会涉及一些环境和配置类的操作,这个部分介绍下前置条件。
SCP命令
scp 命令用于linux下的跨主机之间的文件和目录复制
在首次连接服务器时,会弹出公钥确认的提示。这会导致某些自动化任务,由于初次连接服务器而导致自动化任务中断,
可在 StrictHostKeyChecking选项,用 -o 参数指定后,则不检查该项。
1 | scp [可选参数] file_source file_target |
rsync 命令
最终采用了 rsync 命令,我觉得都行,主要是这个同步成功了。
1 | rsync -e "ssh -o PubkeyAuthentication=yes -o stricthostkeychecking=no" -r --delete-after --quiet $TRAVIS_BUILD_DIR/public/* root@$DEPLOY_IP:/opt/hexoBlog |
centOS使用gem
因为后面要使用 gem install travis
,所以可能会需要 升级 ruby 和 切换 gem 源(亲测 ruby 版本低会安装报错,gem 用官方源真的是动都不动啊,太难了)
切换gem源
1 | $ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ |
升级Ruby
安装RAM, 一款ruby版本管理工具,类似 node 的 nvm。
1 | gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB |
安装新版 ruby
1 | rvm install 2.6 |
自动部署到远程服务器
对于项目的构建来说都是 执行配置文件中写好的脚本,这个项目可能 就是 npm install && hexo clean && hexo g
, 那么怎么执行最后一步,把文件同步传输到 云服务器上呢。 我们使用CI就是手动过程太繁琐,重复没有意义,怎么实现 免密
部署呢。
登录到 云服务器(centOS 7.x)
,进行如下操作
gem install travis 并登录
1 | gem install travis # 这步失败的话请看上面关于升级ruby和切换gem源的部分 |
登录 github 账号密码,这个安全直接连接的 github 服务
生成 ssh key 并输出对应加密的私钥到 travis
进到云服务器对应的 git 仓库目录里
1 | ssh-keygen -t rsa -b 4096 -C 'build@travis-ci.org' -f ./deploy_rsa |
项目根目录下的 deploy_rsa.enc
文件就是我们加密的私钥文件, .travis.yml
是我们的配置文件。
$encrypted_XXXXXX_key 和 $encrypted_XXXXXXXX_iv 是travis 帮忙生成的环境变量,已经同步到 huguobo/hexo-blog 这个项目上了。
还有一点可能会用上,因为 travis 第一次登录远程服务器会出现 SSH 主机验证,这边会有一个主机信任问题。官方给出的方案是添加 addons 配置,然后修改 .travis.yml 的相关配置
1 | addons: |
最终的部署配置, 我的是静态页面,部署就是同步文件到服务器固定目录,用的是 rsync
,其中 -e “ssh -o PubkeyAuthentication=yes -o stricthostkeychecking=no” 参数可以跳过第一次登录的验证。
1 | deploy: |
其他的 yml 配置需要自己根据情况配置了~
我最终的 .travis.yml 配置
1 | language: node_js |
总结
折腾了大半天,终于看到了 CI-Success 的邮件, 网站也是成功的状态,云主机对应目录的文件也确实更新了。
以后写博客 终于 只用 git push ,其他的等邮件通知了~~
另外 文中的 id_rsa.enc 文件一开始我直接 vim 复制的都是乱码,一开始一直报错 bad decrypt
,后来上主机 git clone 仓库直接仓库内生成并添加的,这可能是个坑点。
还有最后用 rsync
代替了 scp
最后也把 openssl 放在了 before_deploy 阶段,放在 before_install也是没问题的,这些都是因人而异啦。