Travis CI 是在軟件開發領域中的一個在線的,分佈式的持續集成服務,用來構建及測試在GitHub託管的代碼。
對於 GitHub 的集成 Travis 作得很好,與 Jenkis 不一樣,Travis 不須要本身在服務器部署服務,而且是高度集成 GitHub 的,因此對於開源項目仍是很是友好的。php
註冊成功,登陸,而後添加本身的 GitHub 上的 repohtml
選擇其中一個或多個你須要集成的項目,開啓 build,也就是點擊叉叉變成勾勾的過程。git
假設如今已經對某個項目開啓了 Travis,那麼先去看看 Settings 裏默認開啓的那幾項,根據本身實際需求進行設置,沒什麼特殊需求默認的設置就能夠了。github
接下來的步驟很清楚,官方也有配圖說明:shell
說白了接下來的事情都是如何去寫這個配置文件,由於 Travis 全是根據這個配置文件去執行相應動做的。bootstrap
根據你的語言不一樣,配置也會有較大差別,由於個人博客使用 PHP 的流行框架 Laravel 寫的,因此這裏也拿它做爲例子,官方給出的最精簡的 PHP 配置文件是:api
language: php php: - 7.1.9 - nightly
接下來如上面所說的第三步,將這個 .travis.yml
文件提交到 GitHub,那麼 Travis 就會自動觸發構建任務。安全
我就知道第一次不會這麼簡單的,失敗了。。。ruby
報錯緣由是執行 phpunit
時提示:bash
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 以後,總算天不負我了。
如今已經能夠自動構建了,那麼接下來的一步就是部署到遠程服務器。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-user
、your-ip
、your-shell-script
都替換成本身的哦!
辛苦奮鬥了一天,老是但願別人看到本身的勞動成果的,除了寫這篇文章意外還能作點什麼呢?那天然是給本身的這個項目在 GitHub 上的 README.md 中顯示一個高大上的 build:passing
標誌,就像這樣:
此次過程當中基本都是從不會到會的一個學習過程,從中瞭解到很多新東西,也發現一些本身的短板,好比寫 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
本文參考連接: