一个计算机技术爱好者与学习者

0%

使用Travis CI部署项目到服务器

1. 前言

《Hexo配置Travis CI自动发布》一文中,我们学习了使用travis-ci构建发布hexo项目的方法。

因为项目的特殊性,所以发布时只是把代码push到了git仓库,并没有把代码发布到我们自己的服务。本文,我们就来学习一下怎样通过travis-ci,把项目发布到我们自己的服务器。

需求:
已知hexo项目部署在github,百度抓取不到github的内容,因此我们想要在自己的服务器也部署一份代码,国内的流量打到自己的服务器。实现国内流量 -> 阿里云服务器,国外流量 -> github pages。
配置 hexo-deploy ,在发布时会同时发布静态页面到 voidking.github.iovoidking
阿里云服务器上有项目 /opt/nginx/work/voidking ,项目仓库为 voidking
现在想要实现的是,当使用 hexo-deploy 之后,阿里云服务器上的代码能够自动更新。

2. 思路

给 voidking.github.io 项目配置travis-ci,当静态页面更新完成后,在阿里云服务器上执行 git pull。
中间需要解决的主要问题是: travis-ci 访问阿里云服务器的权限问题。

另外,因为 voidking.github.io 项目是线上项目,所以我们创建一个在github上和travis-ci上分别创建一个 travis-test 项目,用来测试travis-ci的配置。

3. 配置travis-ci

3.1. 服务器密钥配置

1、创建一个用户专门用来更新代码

1
2
3
useradd -m voidking -s /bin/bash
passwd voidking
chown voidking -R /opt/nginx/work/

2、生成密钥

1
2
3
su voidking
cd ~
ssh-keygen

执行完之后,.ssh目录下生成了 id_rsa 和 id_rsa.pub。

3、使密钥生效

1
2
3
ALI_IP="8.136.13.58"
ssh-copy-id -i .ssh/id_rsa.pub voidking@${ALI_IP}
ssh voidking@${ALI_IP}

3.2. 安装travis client

直接安装travis破坏服务器环境,因此最好使用Docker安装travis。
1、运行travis容器

1
2
3
docker pull ruby:slim
docker run --name travis -it -d ruby:slim /bin/bash
docker exec -it travis /bin/bash

2、容器内安装travis client

1
2
3
# gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
gem install travis
travis -h

3.3. travis-ci密钥配置

1、拷贝密钥到容器

1
2
docker cp /home/voidking/.ssh/id_rsa travis:/tmp
docker exec -it travis /bin/bash

2、登录travis-ci

1
2
cd /tmp
travis login --com --github-token xxxxxx

3、对id_rsa加密,生成id_rsa.enc;同时生成服务端解密命令

1
2
touch .travis.yml
travis encrypt-file id_rsa --add --com --repo=voidking/travis-test

详情参考Encrypting Files

执行完命令,会生成加密文件 id_rsa.enc,.travis.yml 中会被写入解密命令:

1
2
before_install:
- openssl aes-256-cbc -K $encrypted_f217180e22ee_key -iv $encrypted_f217180e22ee_iv -in id_rsa.enc -out id_rsa -d

并且,变量 encrypted_f217180e22ee_keyencrypted_f217180e22ee_iv 会填入travis-ci上travis-test项目中的环境变量配置中。

3.4. travis.yml配置

1、访问Travis CI Pro,找到 travis-test 项目,Settings,在Environment Variables一栏填入Name为GITEE_TOKEN,VALUE为gitee的access token。

2、在github上 travis-test 项目中放入 id_rsa.enc

3、在github上 travis-test 项目中创建 .travis.yml,内容为

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
sudo: false
language: python
python:
- 3.6
branches:
only:
- main # build main branch only

env:
global:
- ALI_IP: 8.136.13.58
- GIT_USER: voidking
- GITEE_PAGES_REPO: gitee.com/voidking/voidking.git

addons:
ssh_known_hosts:
- 8.136.13.58

before_install:
- openssl aes-256-cbc -K $encrypted_f217180e22ee_key -iv $encrypted_f217180e22ee_iv -in id_rsa.enc -out ~/.ssh/id_rsa -d
- chmod 600 ~/.ssh/id_rsa

script:
- ssh voidking@${ALI_IP} "cd /opt/nginx/work/voidking/ && git pull --force --quiet \"https://${GIT_USER}:${GITEE_TOKEN}@${GITEE_PAGES_REPO}\" master:master"

after_success:
- echo "deploy success"

4、提交代码

1
2
3
git add .
git commmit -m "添加travis.yml"
git push

5、验证
打开travis voidking/travis-test ,可以看到脚本已经成功执行。

登录阿里云服务器,git log查看代码版本,确实也已经更新到了最新版。nice!

最后,同样的步骤配置到 voidking.github.io 项目上即可。

4. 配置travis-ci简化版

上面的流程,安全性较高,但是整个流程很麻烦,有没有更简单的办法?必须是有的。
方法一:安装sshpass,直接使用密码登录服务器执行命令。
方法二:把私钥作为参数配置到travis-ci,使用时写入到文件中。

本节中我们研究一下方法二的配置方法。

4.1. 服务器密钥配置

1、创建一个用户专门用来更新代码

1
2
3
useradd -m voidking -s /bin/bash
passwd voidking
chown voidking -R /opt/nginx/work/

2、生成密钥

1
2
3
su voidking
cd ~
ssh-keygen

执行完之后,.ssh目录下生成了 id_rsa 和 id_rsa.pub。

3、使密钥生效

1
2
3
ALI_IP="8.136.13.58"
ssh-copy-id -i .ssh/id_rsa.pub voidking@${ALI_IP}
ssh voidking@${ALI_IP}

4.2. travis-ci密钥配置

1、加密私钥
cat .ssh/id_rsa | base64 | tr -d '\n'

2、访问Travis CI Pro,找到 travis-test 项目,Settings,Environment Variables。创建两组环境变量:

  • Name为GITEE_TOKEN,VALUE为gitee的access token。
  • Name为ID_RSA,VALUE为加密后的私钥。

4.3. travis.yml配置

1、在github上 travis-test 项目中创建 .travis.yml,内容为

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
sudo: false
language: python
python:
- 3.6
branches:
only:
- main # build main branch only

env:
global:
- ALI_IP: 8.136.13.58
- GIT_USER: voidking
- GITEE_PAGES_REPO: gitee.com/voidking/voidking.git

addons:
ssh_known_hosts:
- 8.136.13.58

before_install:
- echo ${ID_RSA} | base64 -d > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa

script:
- ssh voidking@${ALI_IP} "cd /opt/nginx/work/voidking/ && git pull --force --quiet \"https://${GIT_USER}:${GITEE_TOKEN}@${GITEE_PAGES_REPO}\" master:master"

after_success:
- echo "deploy success"

2、提交代码

1
2
3
git add .
git commmit -m "简化travis.yml"
git push

3、验证
打开travis voidking/travis-test ,查看脚本执行日志。
登录阿里云服务器,git log查看代码版本。