利用 Github 和 Travis CI 自動上傳部署網站

利用 github 和 travis.org 上傳部署 (rsync) 網站

前言

feature

利用 github 和 travis.org 執行一些簡單的指令(例如爬蟲), 再加上 travis 的每日任務 (Cron Jobs) 完成自動部署、更新資料的動作~~

scenario

簡單的小工具用 PHP 抓取 政府 open API 電影資料, 找出今日活動然後顯示在頁面上…

以往~
執行爬蟲更新資料或是修改程式之後要更新線上網站的內容時…
我們都需要人工輸入指令和一台空閒的機器
雖然可以把指令寫成腳本(script)簡單的一鍵完成… 但還欠一台空閒的機器
再來就是… 懶還要更懶

簡單的事情複雜做
複雜的事情簡單做

讓整個部署、更新流程自動化、簡單化
(然後再省一台簡單的爬蟲機器)

當然~ 自動化的手續就不簡單 :sweat:

透過下面簡單的筆記分享大家一起學習學習~~

使用服務

流程大綱

  • PHP 爬蟲抓取 政府資料開放平台 - 電影類 的資料
  • 從 API 資料中找出當天活動
  • 暫存為靜態資料檔 (json)
  • 利用 rsync 將資料上傳至網站 Server
  • Slack 回報建置狀態

How

travis.org 為免費服務所以僅支援公開的 GIT repository
我們先將 git repository 設定為公開

接著編寫 .travis.yml,而部署過程會用到的帳號、密碼等…
這些內容都需要加密, 例如 ssh key, slack token
所以需要 travis cli 幫忙將密鑰進行加密打包

travis cli tools

這邊我使用別人包裝好的 docker 完成動作

Docker-travis-cli
https://hub.docker.com/r/skandyla/travis-cli/

當然~ 你也可以自行安裝在本機
(因為這個 `工具` 並不會一直使用所以我選擇用 docker 處理)
https://github.com/travis-ci/travis.rb#readme

.
.

  • 在目標的專案目錄下, 啟用 travis cli 的 docker container
docker run -it --rm -v $(pwd):/project --entrypoint=/bin/sh skandyla/travis-cli

生成 github access token & travis 登入

travis cli 需要使用到 github 權限; 生成 github access token

https://github.com/settings/tokens > Personal access tokens

所需權限為…
read:org, repo:status, repo_deployment, user:email, write:repo_hook

:face_with_symbols_over_mouth:記得勾選正確, 不然 travis login 會無法登入; 而且回應一個奇怪的錯誤訊息…

.
.

取得 github access token 後; 回到 travis cli docker container 內進入登入

travis login --org --github-token xxxxxxxxxxxxxxxxx

登入成功後, 查看登入者

travis whoami

加密 rsync 要用的 ssh private key

將 ssh private key 透過 travis cli 加密, 避免 private key 直接曝光

travis encrypt-file id_rsa --add

完成後, 會自動將加密檔存在同目錄下並將解密指令寫至 .travis.yml

e.g.

openssl aes-256-cbc -K $encrypted_0a6446eb3ae3_key -iv $encrypted_0a6446eb3ae3_iv -in super_secret.txt.enc -out super_secret.txt -d

ref.

因為 travis ci 在進行部署時是全自動的, 所以在 ssh 指令進行時… 是不會讓操作人員輸入密碼的; 因此需要透過上面的方式讓 ssh key 登入正常

travis 環境變數

在上述的加密過程中, 工具將會自動設定兩組環境變數; 如下圖

在這裡~ 我們也可以設定待使用的變數

  • HOST_IP: 網站 server IP
  • PUBLISH_PATH: 網站檔案上傳的路徑, e.g. /var/www/travis-ci-auto-deploy
  • SSH_USER: ssh 和 rsync 要使用的帳號名稱
    (ps: 你需要在網站 server 上建立一個可以 ssh key 登入的帳號)

當然, 你也可以依照自己的需求, 任意加入變數使用~
或使用 travis 預設的變數

加入 slack 回報

slack access token 也需要透過 travis cli 加密

slack travis ci APP 頁面上有詳細教學

e.g.

travis encrypt "workxplay:43xxxxxZg" --add notifications.slack

ref.
詳細請參考 slack + travis 自動回報設定

travis.yml example/demo

最後~ .travis.yml 可能長的像這樣

language: php
php:
  - '7.2'

branches:
  only:
    - master

addons:
  ssh_known_hosts:
    - "$HOST_IP"

before_install:
  - openssl aes-256-cbc -K $encrypted_12c8071d2874_key -iv $encrypted_12c8071d2874_iv -in .travis/digitalocean_travis_rsa.enc -out ~/.ssh/id_rsa -d
  - chmod 600 ~/.ssh/id_rsa
  - echo -e "Host ${HOST_IP}\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
  - php download_and_save.php

script:
  - rsync -az --delete --exclude=".*" ./* ${SSH_USER}@${HOST_IP}:${PUBLISH_PATH}

notifications:
  slack:
    secure: ZYfxxxxxxxEOnNbg=

travis build

透過 travis 頁面上和 .yml 的設定, 只要 git master branch 更新
travis 將自動 trigger build

e.g.

沒有任何錯誤一情況下
網站部署就完成了, 資料內容也一並更新
https://cola.workxplay.net/travis-ci-auto-deploy/

最後~
希望大家好好善用 travis ci 的功能, 但是不要濫用他喔 :bowing_man:‍♂

備註 & 障礙排除

Q. 什麼是 travis ci

A. 線上 CI/CD(Continuous Integration and Deployment)服務
可以綁定 github 或是其它 GIT 服務, 利用 docker 進行指定的流程及部署功能

Q. 什麼是 rsync

A. 使用更好的效率比對來源與目地端的檔案差異再進類傳輸~

Q. travis 沒反應, 不會自動編輯

A. 可能是 .travis.yml 格式或內容有誤, 可以試著用 travis cli 做 yml 驗證

travis lint

Q. SSH 或 rsync 指令出現 ECDSA 等訊息?

ssh 登入、連線時會出現下面訊息(遠端金鑰確認)該怎麼辦?

e.g.

The authenticity of host '123.123.123 (123.123.123)' can't be established.
ECDSA key fingerprint is 87:a8:8a:50:9c:a9:87:3e:c5:17:6d:b0:f1:28:7e:d3.
Are you sure you want to continue connecting (yes/no)? 

A. 讓 travis ci docker container 認識遠端機器就可以了

  • 關掉檢查
echo -e "Host ${HOST_IP}\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config

ref.
同步發表於~

工作玩樂實驗室

1個讚

:dizzy_face:

看起來很亂很難
不過,只要照著 .travis.yml, 修一些修改、調整就好了

比較有雷的地方我都踩完了