最近搞了travis ci
的自动部署,小有心得,记录一下。
因为需要发布到自己的服务器中,所以travis ci
内置的一票适用于aws
等提供商的快捷方法就不适用了,只得采用目前还在实验性质
的script deploy
。
先上一段.travis.yml
配置:
language: go
go:
- '1.11'
sudo: required # 管理员权限,用于安装sshpass
script:
- go test -v ./... # 工程测试
- go build -o testProject . # 工程构建打包
before_install:
- openssl aes-256-cbc -K $encrypted_58e6f98fc3db_key -iv $encrypted_58e6f98fc3db_iv
-in deploy.sh.enc -out deploy.sh -d # 解密已加密的文件,加密的方法后文详述
before_deploy:
- sudo apt-get install sshpass # 安装sshpass
deploy:
- provider: script # 选择实验性质的script deploy
script: bash deploy.sh # 需要在发布阶段执行的脚本
skip_cleanup: true # 重要, travis ci默认会在发布阶段清理git管理的文件范围外的所有文件,不写此行会导致脚本找不到编译后的结果
on:
branch: master # 当master分支有push事件的时候执行deploy流程
因为连接到服务器一般会涉及敏感信息,所以必须进行脱敏,travis cli
内置了encrypt-file
方法。
整体流程为:
Github
;travis ci
运行的时候解密。命令则为:
4. gem install travis
安装travis
命令行工具,需要ruby(ubuntu18、WSL需使用ruby-dev)
;
5. travis login --com
登录travis
;
6. travis encrypt-file deploy.sh --com --add
加密文件, deploy.sh
为被加密文件,--com
对应登录的--com
,--add
可加密后自动将解密的命令添加到.travis.yml
文件中。
只需将travis ci
生成的release
上传到自定义的服务器即可,下面是我使用的脚本deploy.sh
:
# 通过sshpass免除scp命令输入密码的过程,通过StrictHostKeyChecking=no免除scp命令信任主机的过程
sshpass -p your_server_password scp -P 22 -o StrictHostKeyChecking=no build.release root@your_server_address:/your/project/module/
# 同上
sshpass -p your_server_password ssh -tt -p 22 -o StrictHostKeyChecking=no root@server 2>&1 << eeooff
cd /your/project/module/
pkill build.release
nohup ./build.release &
exit
eeooff
还有一种发布的方式是通过ssh-keygen
生成id_rsa
、id_rsa.public
,将私钥复制到项目中加密,需要注意的是travis encrypt-file
命令的限制,多个文件只能通过压缩后再加密,发布前解密再解压的方式来解决,即:
tar cvf example.tar foo bar && travis encrypt-file example.tar --com --add
.travis.yml
的before_install
中添加- tar xvf example.tar