Drone是一個CI/CD的新起之秀菜秦,drone的主要特性就是所有的CI/CD流程都是借助Docker容器來構(gòu)建。所以Drone的pipline非常容易書寫和維護咱枉。并且由于直接把Docker容器當做一等公民卑硫,那么我們在各種場景下定制化自己的插件也將變得非常便利徒恋。因為最終Drone都是調(diào)用的插件Docker容器蚕断,所以開發(fā)團隊可以使用任意自己熟練擅長的語言去定制內(nèi)部自定義插件。
本文我們一起動手用Go寫一個drone插件入挣!通過一個完整的簡單的流程亿乳,我們一起學(xué)習(xí)如何定制化自己的CI/CD流程。baba再也不用擔心CI/CD不夠完善了径筏!
前期準備
Docker Hub 賬戶葛假,為了簡化流程,所以我們此次把我們的插件鏡像發(fā)布到公共鏡像倉庫滋恬。
Golang 開發(fā)環(huán)境聊训,這個不用多說了??
Docker 本地環(huán)境,用來構(gòu)建和發(fā)布我們插件的鏡像恢氯。
設(shè)計插件接口
首先我們要關(guān)注带斑,當我們在寫Dronefile(.drone.yml)的時候,我們需要Drone給我們的插件傳遞什么信息:
”Drone在啟動我們的鏡像的時候會把
settings
字段下的參數(shù)以前綴為PLUGIN_
的全大寫環(huán)境變量的方式傳入給插件勋拟。
PLUGIN_CHANNEL=general
PLUGIN_WEBHOOK=https://hooks.slack.com/services/...
PLUGIN_TEXT=hello
注意:Drone傳遞給插件的環(huán)境變量支持大部分的數(shù)據(jù)類型比如:string, integer, float, boolean, arrary等勋磕。傳入數(shù)組時是一個以逗號分隔的字符串。比如有如下配置文件:
...
settings:
names: [ john, tom]
那么傳遞的參數(shù)是下面這樣的:
開始寫代碼
我們在之前的設(shè)置中給我們講要寫的插件傳遞了兩個參數(shù)
webhook:一個需要插件去請求的URL
data:代表我們想傳遞給插件的數(shù)據(jù)
接下來我們就在我們的Go代碼中使用它們敢靡,下面是一個簡單的示例:
發(fā)布測試
接下來我們將要把我們寫好的插件打包成Docker鏡像挂滓,然后發(fā)不到Docker Hub上,最終我們在我們的Drone平臺上來測試這個插件啸胧。
編譯
為了最小化我們的插件赶站,我們將要使用alpine
鏡像來構(gòu)建我們的插件,如果你不清楚如何最小化構(gòu)建Docker鏡像纺念,可以翻閱作者的歷史文章亲怠,里面記錄了一些Dockerfile最佳實踐的方法。話不多說開始吧柠辞!
先編譯好alpine的目標二進制文件:
然后基于此可執(zhí)行二進制我們就可以構(gòu)建我們的插件了团秽,下面是一個簡單的Dockerfile示例:
構(gòu)建發(fā)布
下面的流程就比較簡單了,使用Docker來構(gòu)建你自己的公有鏡像并發(fā)不到Docker Hub就可以了,如果你對這里不太熟悉的話习勤,可以去看看官網(wǎng)文檔踪栋,或者使用docker build -h
和docker push -h
來查看幫助文檔。這里筆者只列出自己構(gòu)建的命令:
等待一會兒就好了图毕,如果這里你想偷懶你可以直接用筆者構(gòu)建好的鏡像來測試夷都。docker pull dayuoba/my-awesome-plugin
測試插件
接下來我們就可以測試我們的插件了,初始化好一個Drone下的項目予颤,添加.drone.yml
文件囤官。然后push等待測試即可。
接下來就是去Drone上面看看我們的構(gòu)建日志來測試我們的插件了蛤虐。
總結(jié)
到這兒党饮,這篇文章基本就結(jié)束了,參照這個思路你就可以按照自己業(yè)務(wù)的需求來構(gòu)建自己的Drone插件了驳庭。