HEROKU

前言

這幾個月透過家裡頭的桌機來定時跑爬蟲以及更新 Firebase 資料庫,不過電費也是一筆固定支出,所以趁今天想到這件事,便來搬移到免費的 HEROKU 來做這些事。
 

HEROKU

是一個有提供免費伺服器方案的平台,支援的語言算多,而我的爬蟲是以 Python 3.6 作為開發語言的,故選擇它來玩玩。
在免費的方案之中有一些限制,如 24 小時內得休息 6 小時之類的;
不過在這邊,我需要的只是一個可以執行 Cron Job 的地方,所以不需要升級主機的部分。
目前我的 HEROKU 裡頭包含著三個動作:

  • 每天台灣時間 00:00 時,到星座網爬蟲並記錄當日運勢到 Firebase
  • 每天台灣時間 09:00 時,到 PTT CodeJob 以及 Soft_Job 版搜尋 iOS 相關的文章,並 mail 到我的信箱
  • 每天台灣時間 12:00 時,爬 PTT 一些熱門看板的文章並發佈到機器人部落格以及機器人推特之中

我分成三個 .py 檔案,下方會說明我的作法。

簡單的建構步驟

首先,先到 HEROKU 的 dashboard 建立一個新的 App,接著照著它的敘述完成 Git 的建置。
我在資料夾當中,放入了下列的檔案:

  • PTT.py - 12:00 該做的事
  • iOS.py - 09:00 該做的事
  • Astro.py - 00:00 該做的事
  • requirements.txt - 提供給 HEROKU 知道要在這台機器上安裝哪些 Python 的套件
  • serviceAccountCredentials.json - 存取 Firebase 所需要的 credential 文件
  • Procfile - 用來告知 HEROKU 關於這個 App 的一些參數
  • clock.py - 利用 apscheduler 來完成 cron job 的撰寫

clock.py

import os
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
@sched.scheduled_job('cron', hour=0)
def scheduled_job():
    print('This job is run every day at UTC+8 8am.')
    os.system("python astro.py")
@sched.scheduled_job('cron', hour=1)
def scheduled_job2():
    print('This job is run every day at UTC+8 9am.')
    os.system("python ios.py")
@sched.scheduled_job('cron', hour=4)
def scheduled_job3():
    print('This job is run every day at UTC+8 12pm.')
    os.system("python ptt.py")
sched.start()

Procfile

clock: python clock.py

接著透過下方指令推送到 HEROKU 上頭部署

git push heroku master

便可以在 Free Dynos 的頁面看到我們剛剛定義的 clock python clock.py,接著把它打開即可。
螢幕快照 2018-05-18 下午5.12.43

Commitizen

閒聊一下

最近處於求職的階段,評估一份職缺的觀點也和過往不同;
以這篇文章來說,Git Commit Style 便是其中一點,詢問對方是否有固定的 commit 格式,
就可以大致上瞭解團隊的風格是哪種。
若還沒有個規範,或是想要參考的,可以繼續閱讀下去。

Git Commit

是以 AngularJS 的格式,區分成

<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

其中 typescopesubjectbodyfooter 等,有一定的規範,
詳細的內容可以在 angular.js/DEVELOPERS.md 看到。
這篇文章主要要介紹的是一個可以讓 commit 符合上述規範的工具 - Commitizen

Commitizen

Commitizen 是以 Node.js 所開發出的一套工具,使用者可以透過它來處理 commit 的風格一致性。

安裝

我們可以透過 npm 的方式來取得

npm install -g commitizen

並且安裝 cz-conventional-changelog

npm install -g cz-conventional-changelog

在電腦中安裝完上述兩者之後,先切換到你所開發的 iOS 專案資料夾底下,
由於 Commitizen 是以 Node.js 開發,你需要在 iOS 專案裡頭建構一些 npm 所需要的環境,
故記得補上 npm 初始化以及使用 convertional-changelog

npm init
commitizen init cz-conventional-changelog --save --save-exact

輸入完專案相關資訊後,便可以使用 Commitizen 了!

使用

之後,就以 git cz 的方式來取代原本的 git commit
若所在的專案並沒有使用 Commitizen 的話,系統則會自動以原先 git commit 的方式來進行。
執行 git cz 之後,會以選單的方式來一步步符合剛剛訂的規範。

自動驗證 Commit 是否符合 AngularJS

在多人開發的時候,我們可以透過 commit 之前先執行一段 JavaScript 來確保 commit 的格式符合要求,來避免專案之中的 commit style 有不一致的情況發生。
首先我們得先安裝一些套件

npm install semver-regex --save-dev
npm install ghooks --save-dev

並加入驗證的 validate-commit-msg.js 檔案以及在 package.json 之中宣告。

"config": {
    "ghooks": {
        "commit-msg":"./validate-commit-msg.js"
    }
 }

若發生了權限上的問題,如

/bin/sh: ./validate-commit-msg.js: Permission denied

則可以透過 chmod 來調整 validate-commit-msg.js 的存取權限。

chmod 755 validate-commit-msg.js

這樣一來,便大功告成了!
若有人在專案中下了不符合標準的 commit,如

git commit -m "Test"

則會無法順利完成動作,且得到錯誤訊息:

INVALID COMMIT MSG: does not match "<type>(<scope>): <subject>" !
test

CHANGELOG

CHANGELOG 的部分,在此規範下會以 Bug FixesFeaturesBREAKING CHANGES 這三種 type 來產出,意思是指其他的 type 並不會被寫進 CHANGELOG.md 裡頭。
我們可以執行

conventional-changelog -p angular -i CHANGELOG.md -w

來生成 CHANGELOG.md 檔案,也可以在 package.json scripts 之中加入

{
    "scripts": {
        "changelog":"conventional-changelog -p angular -i CHANGELOG.md -w"
    }
}

這樣,之後只需要執行

npm run changelog

後記

在第一份工作時,便有嘗試引用進入到專案之中,不過那時候沒有完整地使用所有功能;
如驗證 commit、自動產生 CHANGELOG.md 等,
最近在整理 iOSTaiwan/resource 時,便認真的走過一次流程。
相關的檔案,如 .gitignorevalidate-commit-msg.jspackage.json 都可以在此專案中找到。
最後感謝 pofat 當初的分享,可以在 iOSTaiwan/resource 裡頭找到相關資源,
讓這次的建構流程跑起來算是順利,也祝福他新婚快樂💒

Bitnami