利用 github 和 travis.org 上傳部署 (rsync) 網站
前言
feature
利用 github 和 travis.org 執行一些簡單的指令(例如爬蟲), 再加上 travis 的每日任務 (Cron Jobs) 完成自動部署、更新資料的動作~~
scenario
簡單的小工具用 PHP 抓取 政府 open API 電影資料, 找出今日活動然後顯示在頁面上…
以往~
執行爬蟲更新資料或是修改程式之後要更新線上網站的內容時…
我們都需要人工輸入指令和一台空閒的機器
雖然可以把指令寫成腳本(script)簡單的一鍵完成… 但還欠一台空閒的機器
再來就是… 懶還要更懶
簡單的事情複雜做
複雜的事情簡單做
讓整個部署、更新流程自動化、簡單化
(然後再省一台簡單的爬蟲機器)
當然~ 自動化的手續就不簡單
透過下面簡單的筆記分享大家一起學習學習~~
使用服務
- 程式來源: https://github.com/cscolabear/travis-ci-auto-deploy
- CI 服務: travis.org
- 資料來源: 政府資料開放平台 https://data.gov.tw/dataset/6010
流程大綱
- 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
記得勾選正確, 不然 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 的功能, 但是不要濫用他喔 ♂
備註 & 障礙排除
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
- 加入 know host
https://docs.travis-ci.com/user/ssh-known-hosts/
ref.
同步發表於~
工作玩樂實驗室