博客平台的自动化部署

一直以来,我的博客平台需要手动打包,然后FTP到VPS上进行部署更新。这样重复的体力劳动,过于浪费时间,所以今天抽空做下下自动化部署更新。

技术栈

  • 博客平台是在GitHub下做的代码管理
  • 平台前端是Angular,后端是Express
  • VPS为腾讯云服务器【Centos7.x】

这里选用Travis实现自动化部署

自动化部署流程

Code提交到GitHub后,Travis实现构建打包,然后执行同步脚本,传输文件到VPS上,最后执行重启服务脚本。

划重点

整个配置流程,说不上难,但有几个坑需要注意。

文件传输

如何传输文件呢,这里使用rsync命令

详细命令介绍,戳这里

SSH免密登录

Travis需要将打包文件传输到VPS,远程登录服务器需要用户名密码,但明文密码存在安全问题,还好travis提供了加密方案。how to do?

  1. 登录VPS

  2. 为travis创建公钥私钥

    1
    2
    ssh-keygen -f travis
    cat travis.pub >> ~/.ssh/authorized_keys
  3. 加密私钥,创建指令到YML

    1
    2
    3
    gem install travis
    travis login
    travis encrypt-file travis --add

    执行命令后,YML文件会创建如下第4步的脚本

注意

我的VPS是Centos7,执行GEM就报错了,so折腾了一把

Ruby安装

因为gem是ruby的包管理器,所以需要先安装下ruby

1
yum install ruby-dev

geo源设定

由于国内网络环境的优越,so,可能还需要设定下gem源

1
2
$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
  1. 修改脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
	- openssl aes-256-cbc -K $encrypted_b86c2ca78306_key -iv 	$encrypted_b86c2ca78306_iv -in .travis/travis.enc -out 	~/.ssh/id_rsa -d

```
自动生成的脚本还需要做一点修改

*注意*

- 最终的输出指到.ssh下
- 脚本创建时,会自动换行,注意要在一行上,否则travis构建会直接报错`Could not parse .travis.yml`

5. 添加ssh_known_hosts

如果不加,会报如下连接提示

![](http://static.1991421.cn/blog/2018-05-08-030501.png)

### 完整脚本整体配置

```yml
language: node_js
node_js: 8
addons:
ssh_known_hosts:
- 132.232.104.101
before_install:
- openssl aes-256-cbc -K $encrypted_b86c2ca78306_key -iv $encrypted_b86c2ca78306_iv -in .travis/travis.enc -out ~/.ssh/id_rsa -d
- chmod 600 ~/.ssh/id_rsa
install:
- cd backend
- npm install
- cd ..
- cd frontend
- npm install
- cd ..
script:
- cd frontend
- npm run build
- cd ..
- cd backend
- npm run build
- cd ..
after_script:
- cd ./frontend/dist/blog-admin
- rsync -az -vv --delete -e 'ssh -p 22' ./** root@132.232.104.101:/var/www/blog-admin/dist
- cd ../../..
- cd ./backend/dist
- rsync -az -vv --delete -e 'ssh -p 22' ./** root@132.232.104.101:/var/www/blog-admin
- cd ../..
- rsync -az -vv --delete -e 'ssh -p 22' backend/package*.json root@132.232.104.101:/var/www/blog-admin
- ssh -p 22 root@132.232.104.101 "cd /var/www/blog-admin;npm install --production;pm2 restart blog-admin"
branches:
only:
- master
notifications:
email:
- i@alanhe.me

写在最后

实现CI自动部署更新后,以后博客平台的修改,只需要提交到GitHub,剩下的事都自动化了,漂亮。

参考文档