目標(biāo)
實(shí)現(xiàn) git push 后,自動(dòng)將代碼發(fā)布到 google 云服務(wù)器 compute engine。其它服務(wù)器同理。
準(zhǔn)備1-免密登錄操作步驟
原理
要想通過(guò) travis 在執(zhí)行服務(wù)器得腳本首先得登陸到我們的服務(wù)器,但是在 travis 不像交互式終端。一般利用用戶(hù)名和密碼登陸是需要輸入用戶(hù)名,密碼的,但是 travis 里面沒(méi)有提供與用戶(hù)交互的界面,當(dāng)然這也與自動(dòng)化不符,所以我們只有利用其他方式登陸–SSH 免密登陸。
SSH 的登陸原理大家可以看這個(gè):SSH 公鑰登陸原理。大概過(guò)程就是,在客戶(hù)端生成一個(gè)公鑰/私鑰對(duì),將公鑰內(nèi)容保存到服務(wù)器 ~/.ssh/authrized_keys 中,然后客戶(hù)端發(fā)起連接請(qǐng)求時(shí),服務(wù)器發(fā)送一個(gè)字符串給客戶(hù)端,客戶(hù)端用本地的私鑰對(duì)字符串進(jìn)行加密然后發(fā)送給服務(wù)器,服務(wù)器將收到的加密字符串用公鑰解密,如果能解密成功就登陸成功。
這里的公鑰/私鑰對(duì)就是登陸的關(guān)鍵,我們不能直接操作 travis 服務(wù)器,在上面生成公鑰/私鑰對(duì),所以按照上面正常的流程就走不通,這時(shí)候就需要讓 travis 偽裝成一個(gè)受信的客戶(hù)端去連接。也就是我們需要有一對(duì)公鑰/私鑰對(duì),公鑰已經(jīng)保存在我們的 Linux 服務(wù)器中,私鑰保存在某個(gè) travis 能訪(fǎng)問(wèn)到的地方,在必要的時(shí)候用這個(gè)私鑰去連接服務(wù)器,這里我們可以把私鑰放在 git 代碼倉(cāng)庫(kù)中,但是直接把私鑰放代碼中不安全,所以travis 提供了對(duì)私鑰進(jìn)行加密的功能,我們可以把私鑰加密之后放在代碼倉(cāng)庫(kù),在登陸的時(shí)候 travis 解密該私鑰用于連接。
了解了大概原理,接下來(lái)就是具體操作。
1、在 root 用戶(hù)下創(chuàng)建新用戶(hù)
#新建用戶(hù)
useradd user1
#修改密碼(應(yīng)該不是必要,但是萬(wàn)一以后需要用密碼登陸呢),按照提示設(shè)置密碼。
passwd user1
#為用戶(hù)添加添加權(quán)限
vim /etc/sudoers
找到#Allow root to run any commands anywhere這一段注釋?zhuān)谙旅嫘略鲆恍校?/p>
user1 ALL=(ALL) ALL
2、生成公鑰/私鑰對(duì)
#切換至用戶(hù)user1,
su user1
cd ~
#一致默認(rèn)即可
ssh-keygen -t rsa
3、將生成的公鑰添加為受信列表
cd .ssh/
cat id_rsa.pub >> authorized_keys
chmod 700 ~/.ssh/
chmod 600 ~/.ssh/*
4、測(cè)試免密
#在.ssh目錄下新增配置文件 config
vim config
config 內(nèi)容如下
Host test
HostName [服務(wù)器ip]
User user1
IdentitiesOnly yes
IdentityFile ~/.ssh/id_rsa
5、坑點(diǎn)
1)添加非 root 用戶(hù)執(zhí)行命令權(quán)限,否則報(bào)無(wú)權(quán)限
vim /etc/sudoers
找到#Allow root to run any commands anywhere這一段注釋?zhuān)谙旅嫘略鲆恍校?```shell
user1 ALL=(ALL) ALL
準(zhǔn)備2-安裝 travis 客戶(hù)端
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、添加加密的私鑰至代碼倉(cāng)庫(kù)
用 travis 命令行工具登錄 travis 服務(wù)器,生成加密后的私鑰,保存在 github 倉(cāng)庫(kù)。travis 用私鑰與服務(wù)器建立可信連接,從而實(shí)現(xiàn)免密登錄
travis login
git clone [ github 代碼倉(cāng)庫(kù)地址 ]
cd [ 倉(cāng)庫(kù)項(xiàng)目名]
travis encrypt-file ~/.ssh/id_rsa --add
運(yùn)行以上命令,在 .travis.yml 中生成如下配置:

并且生成加密秘鑰文件,id_rsa.enc
5、坑點(diǎn)
1)curl 安裝必須要 key 受信,運(yùn)行以下3個(gè)命令
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 生成的加密私鑰配置:
當(dāng)前路徑需要去掉'',另外為了防止 ssh 時(shí)還需輸入密碼,需添加 addons 屬性

準(zhǔn)備3-安裝 docker
1、安裝 docker
#安裝 Docker
sudo yum -y install docker
#啟動(dòng) Docker 后臺(tái)服務(wù)
sudo service docker start
#設(shè)置開(kāi)機(jī)自啟動(dòng)
sudo systemctl enable docker
#添加 docker group
sudo groupadd docker
#將用戶(hù)加入該 group 內(nèi)
sudo usermod -aG docker user1
#重啟服務(wù)
sudo service docker restart
2、坑點(diǎn)
1)非 root 用戶(hù)沒(méi)有權(quán)限運(yùn)行 docker 命令,需要添加到 docker 用戶(hù)組,命令如下:
#添加 docker group
sudo groupadd docker
#將用戶(hù)加入該 group 內(nèi)
sudo usermod -aG docker user1
#重啟服務(wù)
sudo service docker restart
最終效果
提交代碼
git commit -a
git push
提交代碼后,觸發(fā)運(yùn)自動(dòng)部署,效果如下:



從此提交代碼后,幾分鐘后自動(dòng)發(fā)布到 google cloud,相當(dāng)方便,希望以上采坑對(duì)各位有所幫助