Travis CI 系列:自動化部署博客

Travis CI 是在軟件開發領域中的一個在線的,分佈式的持續集成服務,用來構建及測試在GitHub託管的代碼。php

travis ci

對於 GitHub 的集成 Travis 作得很好,與 Jenkis 不一樣,Travis 不須要本身在服務器部署服務,而且是高度集成 GitHub 的,因此對於開源項目仍是很是友好的。html

註冊配置 Travis

註冊成功,登陸,而後添加本身的 GitHub 上的 repogit

add repo

選擇其中一個或多個你須要集成的項目,開啓 build,也就是點擊叉叉變成勾勾的過程。github

假設如今已經對某個項目開啓了 Travis,那麼先去看看 Settings 裏默認開啓的那幾項,根據本身實際需求進行設置,沒什麼特殊需求默認的設置就能夠了。shell

接下來的步驟很清楚,官方也有配圖說明:bootstrap

build step

添加 .travis.yml

說白了接下來的事情都是如何去寫這個配置文件,由於 Travis 全是根據這個配置文件去執行相應動做的。api

根據你的語言不一樣,配置也會有較大差別,由於個人博客使用 PHP 的流行框架 Laravel 寫的,因此這裏也拿它做爲例子,官方給出的最精簡的 PHP 配置文件是:安全

language: php

php:
 - 7.1.9
 - nightly
複製代碼

觸發構建

接下來如上面所說的第三步,將這個 .travis.yml 文件提交到 GitHub,那麼 Travis 就會自動觸發構建任務。ruby

我就知道第一次不會這麼簡單的,失敗了。。。bash

報錯緣由是執行 phpunit 時提示:

PHP Warning:  require(/home/travis/build/stephencode/super-admin/bootstrap/../vendor/autoload.php): failed to open stream: No such file or directory in /home/travis/build/stephencode/super-admin/bootstrap/autoload.php on line 17
複製代碼

一看是本身項目的 composer 依賴包的 autoload.php 文件沒找到,那應該是沒有執行 composer up 之類的操做,結合網上找的資料,比較好的解決方式是在 install 層添加一行:

install:
  - composer install --prefer-dist --optimize-autoloader --quiet
複製代碼

這樣就不會報上面這個錯了,而後會報接下來的一個錯。。。

1) Tests\Feature\RouteTest::testBasicTest
RuntimeException: No application encryption key has been specified.
複製代碼

其實這個是我在 Laravel 裏面的 phpunit.xml 沒有配置好的緣故。將 <env name="APP_KEY" value="base64:xxxxxx="/> 補上就好,在 <php></php> 標籤裏,這個 key 你本身去生成。

在通過五六次 build failed 以後,總算天不負我了。

build failed

自動部署到遠程服務器

如今已經能夠自動構建了,那麼接下來的一步就是部署到遠程服務器。Travis 提供 after_success 來實現這步驟。

等等,咱們要部署到遠程服務器,那麼勢必須要讓 Travis 登陸到遠程服務,那麼登陸密碼怎麼處理才能保證安全?這是首先要解決的問題,明文確定是不行的。

加密登陸密碼

那看來先得解決這個問題,Travis Docs 裏也幫我考慮到了這個避不開的問題的解決方案(Encrypting Files

咱們一塊兒來實踐一下:

首先經過 Ruby 的 gem 安裝 travis

gem install travis
複製代碼

哎,重試了幾回發現敲完這段 shell 如同石沉大海通常,屁都不放一個。。。就算開了代理仍是紋絲不動,沒辦法只能換鏡像了。

$ gem sources -l

*** CURRENT SOURCES ***

https://rubygems.org/
複製代碼

查看一下當前的鏡像,這貨(rubygems)國內出奇的難以訪問,網上一搜國內的鏡像源,Ruby China 的應該很顯眼吧~

$ gem update --system
$ gem sources --add https://gems.ruby-china.org/
複製代碼

而後再查看一下 gem 鏡像,確保只有 Ruby China 的 gem 源。

好了,如今能夠愉快的安裝 travis 了

$ sudo gem install travis
複製代碼

接下來讓咱們先在命令行中登陸 Travis

$ travis login

We need your GitHub login to identify you.
This information will not be sent to Travis CI, only to api.github.com.
The password will not be displayed.

Try running with --github-token or --auto if you don't want to enter your password anyway. Username: xxx@xxx.xxx Password for xxx@xxx.xxx: *** Successfully logged in as demo! 複製代碼

會要求你輸入 GitHub 的帳號密碼,這個是走 GitHub 的服務,因此不用擔憂密碼泄露。

將目錄切換到項目根目錄下,也就是 .travis.yml 目錄下。由於咱們須要讓 travis 遠程登陸本身的服務器,因此須要將本地保存着的 SSH 私鑰進行加密處理(默認你也是經過 SSH 免密登陸的模式哦,不清楚能夠參考我這一篇 《SSH 免密登陸》)。

$ travis encrypt-file ~/.ssh/id_rsa --add

Detected repository as xxx/xxx, is this correct? |yes| yes
encrypting ~/.ssh/id_rsa for xxx/xxx
storing result as id_rsa.enc
storing secure env variables for decryption

Make sure to add id_rsa.enc to the git repository.
Make sure not to add ~/.ssh/id_rsa to the git repository.
Commit all changes to your .travis.yml.
複製代碼

這個時候去看一下當前目錄下的 .travis.yml,會多出幾行

before_install:
  - openssl aes-256-cbc -K $encrypted_d89376f3278d_key -iv $encrypted_d89376f3278d_iv
  -in id_rsa.enc -out ~\/.ssh/id_rsa -d
複製代碼

爲保證權限正常,多加一行設置權限的 shell

before_install:
  - openssl aes-256-cbc -K $encrypted_d89376f3278d_key -iv $encrypted_d89376f3278d_iv
    -in id_rsa.enc -out ~/.ssh/id_rsa -d
  - chmod 600 ~/.ssh/id_rsa
複製代碼

還有一點可能會用上,由於 travis 第一次登陸遠程服務器會出現 SSH 主機驗證,這邊會有一個主機信任問題。官方給出的方案是添加 addons 配置:

addons:
  ssh_known_hosts: your-ip
複製代碼

到這裏,travis 就可以免密登陸本身的遠程服務器啦~

自動部署

既然已經能夠免密登陸服務器了,那麼寫一個部署腳本,在登陸時執行該腳本就能夠了,一切就是這麼順其天然就好~

寫部署腳本

我寫 Shell 腳本的水平頗有限,這邊也就給出一個最精簡的 Demo 能夠參考一下:

#!/bin/bash
cd /path/to/your-project
git pull origin master
echo 'travis build done!'
複製代碼

執行部署腳本

.travis.yml 配置文件中寫下這麼兩行:

after_success:
  - ssh your-user@your-ip "./your-shell-script"
複製代碼

記得將其中的 your-useryour-ipyour-shell-script 都替換成本身的哦!

高大上標誌

辛苦奮鬥了一天,老是但願別人看到本身的勞動成果的,除了寫這篇文章意外還能作點什麼呢?那天然是給本身的這個項目在 GitHub 上的 README.md 中顯示一個高大上的 build:passing 標誌,就像這樣:

build tag

總結

此次過程當中基本都是從不會到會的一個學習過程,從中瞭解到很多新東西,也發現一些本身的短板,好比寫 shell 腳本。。。

最後,貼出我本身的 .travis.yml,裏面有關涉及我的隱私的部分我會註釋並說明:

language: php

php:
 - 7.1.9
 - nightly

env:
 - APP_DEBUG=false

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

install:
 - composer install --prefer-dist --optimize-autoloader --quiet

notifications:
 email:
 recipients:
 - stephenfxl@gmail.com
 on_success: always
 on_failure: always

script:
 - phpunit -c phpunit.xml --coverage-text

after_success:
 - ssh xxx@xxxx.xxxx.xxxx.xxxx "./travis_build" # 請替換成本身的登陸IP和登陸用戶

addons:
 ssh_known_hosts: xxxx.xxxx.xxxx.xxxx # 請替換成本身的服務器IP

複製代碼

本文參考連接:

相關文章
相關標籤/搜索