博客平台的自动化部署

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

技术栈

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

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

自动化部署流程

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

划重点

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

文件传输

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

详细命令介绍,戳这里

SSH免密登录

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

  1. SSH登录VPS2-3命令均在目标VPS执行

  2. 为travis创建公钥私钥

    1
    2
      
    $ ssh-keygen -f travis
  3. 加密私钥,创建指令到YML

    1
    2
    3
    4
    5
    6
      
    $ gem install travis
    $ travis login
    $ ssh-keygen -t rsa -b 4096 -C 'qianghe421@163.com' -f ./deploy_rsa
    $ travis encrypt-file deploy_rsa --add
    $ ssh-copy-id -i deploy_rsa.pub root@1991421.cn

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

    注意

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

    rubygems安装

    1
    2
    3
    yum install rubygems
    yum install ruby-devel
    yum install make automake gcc gcc-c++ kernel-devel

    /usr/bin/ssh-copy-id: ERROR: Host key verification failed.

1
$ ssh-copy-id  -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null  -i /var/www/blog/alanhg.github.io/deploy_rsa.pub root@1991421.cn
  1. 修改脚本

    1
    - openssl aes-256-cbc -K $encrypted_b86c2ca78306_key -iv 	$encrypted_b86c2ca78306_iv -in .travis/travis.enc -out 	~/.ssh/id_rsa -d

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

    注意

  • 脚本创建时,会自动换行,注意要在一行上,否则travis构建会直接报错Could not parse .travis.yml
  1. 添加ssh_known_hosts

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

完整脚本整体配置

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
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,剩下的事都自动化了,漂亮。

参考文档