雖然目前有非常多好用的資源可用,不過有時候也會希望能夠客製化資源。像是上一篇文章介紹的 dpl
其實是可以封裝成一個資源來使用。
要時做客製化的資源類型,要先了解其背後的運作原理。
資源基本上是透過三個指令來組成的,背後透過什麼語言實作本身並沒有影響,只要可以接受 STDIN
STDOUT
跟參數等就能夠正常運作。
/opt/resource/check
/opt/resource/in
/opt/resource/out
在不同的時機點 Concourse 會呼叫上述三個的檔案,來做對應得處置。
在 Concourse 中,要檢查這個資源是否需要更新就會執行 check
這個指令。預設會每分鐘執行一次,所以在前面的案例中,我們使用下面的設定會自動觸發工作。
get: my-repo
trigger: true
就是因為執行完 check
得到版本有差異的結果時,就會自動啟動這個工作。
當我們設定 get
時,如果一個任務需要這個資源提供些檔案時,就會去呼叫 in
這個指令。
Concourse 會把這些資訊寫入 STDIN 給我們。
{
"source": {
"uri": "git://some-uri",
"branch": "develop",
"private_key": "..."
},
"version": { "ref": "61cebf" }
}
並且帶入一個參數,告訴我們要將檔案放到哪個目錄。
一個任務結束後我們希望更新這個資源,像是發佈到 Githbu 的 Release 頁面,或者發送一則 Slack 通知。這個時候我們用 put
就會將資訊寫入 out
這個指令。
Concourse 會把這些資訊寫入 STDIN 給我們。
{
"params": {
"branch": "develop",
"repo": "some-repo"
},
"source": {
"uri": "git@...",
"private_key": "..."
}
}
任務透過資源取得檔案後,做過處理後放置的檔案和 in
一樣會當作參數傳入。
簡單整理一下整個資源的流程,其實概念上非常簡單,但是卻因為這樣抽象的設計讓彈性變得非常大。
自訂資源的概念就是這樣簡單,下一篇會簡單介紹 Docker 的使用。