目标
实现 git push 后,自动将代码发布到 google 云服务器 compute engine。其它服务器同理。
准备1-免密登录操作步骤
原理
要想通过 travis 在执行服务器得脚本首先得登陆到我们的服务器,但是在 travis 不像交互式终端。一般利用用户名和密码登陆是需要输入用户名,密码的,但是 travis 里面没有提供与用户交互的界面,当然这也与自动化不符,所以我们只有利用其他方式登陆–SSH 免密登陆。
SSH 的登陆原理大家可以看这个:SSH 公钥登陆原理。大概过程就是,在客户端生成一个公钥/私钥对,将公钥内容保存到服务器 ~/.ssh/authrized_keys 中,然后客户端发起连接请求时,服务器发送一个字符串给客户端,客户端用本地的私钥对字符串进行加密然后发送给服务器,服务器将收到的加密字符串用公钥解密,如果能解密成功就登陆成功。
这里的公钥/私钥对就是登陆的关键,我们不能直接操作 travis 服务器,在上面生成公钥/私钥对,所以按照上面正常的流程就走不通,这时候就需要让 travis 伪装成一个受信的客户端去连接。也就是我们需要有一对公钥/私钥对,公钥已经保存在我们的 Linux 服务器中,私钥保存在某个 travis 能访问到的地方,在必要的时候用这个私钥去连接服务器,这里我们可以把私钥放在 git 代码仓库中,但是直接把私钥放代码中不安全,所以travis 提供了对私钥进行加密的功能,我们可以把私钥加密之后放在代码仓库,在登陆的时候 travis 解密该私钥用于连接。
了解了大概原理,接下来就是具体操作。
1、在 root 用户下创建新用户
#新建用户
useradd user1
#修改密码(应该不是必要,但是万一以后需要用密码登陆呢),按照提示设置密码。
passwd user1
#为用户添加添加权限
vim /etc/sudoers
找到#Allow root to run any commands anywhere这一段注释,在下面新增一行:
user1 ALL=(ALL) ALL
2、生成公钥/私钥对
#切换至用户user1,
su user1
cd ~
#一致默认即可
ssh-keygen -t rsa
3、将生成的公钥添加为受信列表
cd .ssh/
cat id_rsa.pub >> authorized_keys
chmod 700 ~/.ssh/
chmod 600 ~/.ssh/*
4、测试免密
#在.ssh目录下新增配置文件 config
vim config
config 内容如下
Host test
HostName [服务器ip]
User user1
IdentitiesOnly yes
IdentityFile ~/.ssh/id_rsa
5、坑点
1)添加非 root 用户执行命令权限,否则报无权限
vim /etc/sudoers
找到#Allow root to run any commands anywhere这一段注释,在下面新增一行:
```shell
user1 ALL=(ALL) ALL
准备2-安装 travis 客户端
1、安装 rvm
具体参考:https://rvm.io/rvm/security
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
echo 409B6B1796C275462A1703113804BB82D39DC0E3:6: | gpg2 --import-ownertrust
echo 7D2BAF1CF37B13E2069D6956105BD0E739499BDB:6: | gpg2 --import-ownertrust
curl -sSL https://get.rvm.io/ | bash -s stable --ruby
2、安装 ruby
rvm install ruby
3、安装 travis 命令行工具
安装 travis 命令行工具.
sudo yum install -y gcc ruby-devel zlib-devel
gem install travis
4、添加加密的私钥至代码仓库
用 travis 命令行工具登录 travis 服务器,生成加密后的私钥,保存在 github 仓库。travis 用私钥与服务器建立可信连接,从而实现免密登录
travis login
git clone [ github 代码仓库地址 ]
cd [ 仓库项目名]
travis encrypt-file ~/.ssh/id_rsa --add
运行以上命令,在 .travis.yml 中生成如下配置:
并且生成加密秘钥文件,id_rsa.enc
5、坑点
1)curl 安装必须要 key 受信,运行以下3个命令
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499
BDB
echo 409B6B1796C275462A1703113804BB82D39DC0E3:6: | gpg2 --import-ownertrust
echo 7D2BAF1CF37B13E2069D6956105BD0E739499BDB:6: | gpg2 --import-ownertrust
2)安装 travis 命令行工具前安装如下:
sudo yum install -y gcc ruby-devel zlib-devel
3) .travis.yml 生成的加密私钥配置:
当前路径需要去掉'',另外为了防止 ssh 时还需输入密码,需添加 addons 属性
准备3-安装 docker
1、安装 docker
#安装 Docker
sudo yum -y install docker
#启动 Docker 后台服务
sudo service docker start
#设置开机自启动
sudo systemctl enable docker
#添加 docker group
sudo groupadd docker
#将用户加入该 group 内
sudo usermod -aG docker user1
#重启服务
sudo service docker restart
2、坑点
1)非 root 用户没有权限运行 docker 命令,需要添加到 docker 用户组,命令如下:
#添加 docker group
sudo groupadd docker
#将用户加入该 group 内
sudo usermod -aG docker user1
#重启服务
sudo service docker restart
最终效果
提交代码
git commit -a
git push
提交代码后,触发运自动部署,效果如下:
从此提交代码后,几分钟后自动发布到 google cloud,相当方便,希望以上采坑对各位有所帮助