持续集成
Travis CI 提供的是持续集成服务(Continuous Integration,简称 CI)。它绑定 Github 上面的项目,只要有新的代码,就会自动抓取。然后,提供一个运行环境,执行测试,完成构建,还能部署到服务器。
目标
修改代码push之后可以自动完成远程服务器端代码更新,重启。
Django站点托管在github,远程服务器从github同步代码
服务器已经配置好Nginx+uWSGI
我的目的只是远程服务器可以拉取最新代码并重启uwsgi服务就可以了
实现流程是:
代码变动push到github ==> travis-ci自动构建,测试 ==> 测试通过,登录服务器 ==> 拉取github最新代码,重启uwsgi
关键在于需要从travis远程ssh登录服务器
1. 首先在本地生成ssh密钥对,保存为id_rsa_deploy,id_rsa_deploy.pub
ssh-keygen -t rsa -C "deploy_key"
2. 将公钥复制到远程服务器的authorized_keys文件上
ssh-copy-id -i ~/.ssh/id_rsa_deploy.pub ubuntu@123.123.123.123
3. 将私钥加密传输到travis,解决ssh登录的加密问题
在本机主机安装travis,可能需要更换gem源
# 更换gem源
gem sources -l
gem sources --add https://gems.ruby-china.org/ --remove
sudo gem install travis
可能出现构建失败,安装依赖ruby-dev
sudo apt install ruby-dev
安装完成后登录travis,使用github账号
travis login --auto
目录切换到仓库根目录,生成加密文件
travis encrypt-file ~/.ssh/id_rsa_deploy --add
此时会生成加密文件id_rsa_deploy.enc
,添加--add
参数会在.travis.yml文件添加如下解密内容
openssl aes-256-cbc -K $encrypted_2bc13221a680_key -iv $encrypted_2bc13221a680_iv -in id_rsa_deploy.enc -out ~/.ssh/id_rsa_deploy -d
将解密文件的放到~/.ssh/id_rsa
,并修改文件权限chmod 600 ~/.ssh/id_rsa
另外,在使用ssh登陆的时候会确认主机信息,travis-ci自动化运行无法进行交互操作,所以在.travis.yml中添加以下内容跳过确认:
addons:
ssh_known_hosts: 123.123.123.123
接下来就可以通过ssh登录服务器进行拉取操作。
4. .travis.yml
文件
在可以进行ssh登陆之后就可以进行服务器端的操作
after_success:
- ssh ubuntu@123.123.123.123 'cd ~/projects/proj && git pull && pkill uwsgi'
从travis远程ssh登录服务器,切换到工程目录,拉取最新代码,重启uwsgi
也可以通过sh脚本运行
ssh -tt ubuntu@123.123.123.123 < run.sh
-tt
是强制分配一个伪终端进行服务器端的操作。比如需要切换到服务器的虚拟环境,进行python manage.py migrate
.travis.yml文件可以设置环境变量env:
,不能公开的环境变量可以在Travis网站的仓库设置页进行设置,脚本内部可以使用这些环境变量。
完整的.travis.yml文件
language: python
python:
- '3.6'
branches:
only:
- master
env:
- DJANGO=2.0
install:
- cd proj/
- pip install -r requirements.txt
script:
- python manage.py test users.tests.UserTestCase
before_install:
- openssl aes-256-cbc -K $encrypted_2bc13221a680_key -iv $encrypted_2bc13221a680_iv
-in id_rsa_deploy.enc -out ~/.ssh/id_rsa -d
- chmod 600 ~/.ssh/id_rsa
# - cp .travis/ssh_config ~/.ssh/config
addons:
ssh_known_hosts: 123.123.123.123
after_success:
- ssh -tt ubuntu@123.123.123.123 < run.sh
完成一键部署,只需要本地修改代码push,自动拉取,重启。