原文連結:http://rootsongjc.github.io/blogs/continuous-integration-with-wercker/
本文介紹了wercker和它的基本用法,并用我GitHub上的magpie應用作為示例,講解如何給GitHub項目增加wercker建構流程,并将生成的鏡像自動上傳到Docker Hub上。
CI工具
開源項目的建構離不開CI工具,你可能經常會在很多GitHub的開源項目首頁上看到這樣的東西:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauQXZnRWdi1iclt2YyV2dvwVbvNmLuRGZ19Gbj5CdrJmLmhXOpRWM6x2bvw1LcpDc0RHaiojIsJye.jpg)
這些圖示都是CI工具提供的,可以直覺的看到目前的建構狀态,例如wercker中可以在
Application
-
magpie
-
options
中看到:
将文本框中的代碼複制到你的項目的
README
檔案中,就可以在項目首頁上看到這樣的标志了。
現在市面上有很多流行的CI/CD工具和DevOps工具有很多,這些工具提高了軟體開發的效率,增加了開發人員的幸福感。這些工具有:
适用于GitHub上的開源項目,可以直接使用GitHub賬戶登陸,對于公開項目可以直接使用:Travis-ci、CircleCI、Wercker。從目前GitHub上開源項目的使用情況來看,Travis-ci的使用率更高一些。
适用于企業級的:Jenkins
不僅包括CI/CD功能的DevOps平台:JFrog、Spinnaker、Fabric8
Wercker簡介
Wercker是一家為現代雲服務提供容器化應用及微服務的快速開發、部署工具的初創企業,成立于2012年,總部位于荷蘭阿姆斯特丹。其以容器為中心的平台可以對微服務和應用的開發進行自動化。開發者通過利用其指令行工具能夠生成容器到桌面,然後自動生成應用并部署到各種雲平台上面。其支援的平台包括Heroku、AWS以及Rackspace等。
Wercker于2016年獲得450萬美元A輪融資,此輪融資由Inkef Capital領投,Notion Capital跟投,融資所得将用于商業版産品的開發。此輪融資過後其總融資額為750萬美元。
Wercker于2017年4月被Oracle甲骨文于收購。
為什麼使用Wercker
所有的CI工具都可以在市面上擷取,但為何要建議使用Wercker呢?依據雲之道的準則評估了所有工具,發現Wercker正是我們需要的。
首先,無須在工作站中安裝Wecker,僅安裝一個指令行用戶端即可,建構過程全部在雲端進行。
其次,不用通過信用卡就可使用Wercker。當我們迫切希望簡化流程時,這是一件令人贊歎的事。付款承諾這一條件大大增加了開發者的壓力,這通常是不必要的。
最後,Wercker使用起來非常簡單。它非常容易配置,不需要經過進階教育訓練或擁有持續內建的博士學位,也不用制定專門的流程。
通過Wercker搭建CI環境隻需經過三個基本步驟。
1.在Wercker網站中建立一個應用程式。
2.将wercker.yml添加到應用程式的代碼庫中。
3.選擇打包和部署建構的位置。
如何使用
可以使用GitHub帳号直接登入Wercker,整個建立應用CI的流程一共3步。
一旦擁有了賬戶,那麼隻需簡單地點選位于頂部的應用程式菜單,然後選擇建立選項即可。如果系統提示是否要建立組織或應用程式,請選擇應用程式。Wercker組織允許多個Wercker使用者之間進行協作,而無須提供信用卡。下圖為設定新應用程式的向導頁面。
選擇了GitHub中的repo之後,第二步配置通路權限,最後一步Wercker會嘗試生成一個wercker.yml檔案(後面會讨論)。不過至少對于Go應用程式來說,這個配置很少會滿足要求,是以我們總是需要建立自己的Wercker配置檔案。
安裝Wercker指令行程式
這一步是可選的,如果你希望在本地進行wercker建構的話才需要在本地安裝指令行程式。本地建構和雲端建構都依賴于Docker的使用。基本上,代碼會被置于所選擇的docker鏡像中(在wercker.yml中定義),然後再選擇執行的内容和方法。
要在本地運作Wercker建構,需要使用Wercker CLI。有關如何安裝和測試CLI的内容,請檢視http://devcenter.wercker.com/docs/cli。Wercker更新文檔的頻率要比本書更高,是以請在本書中做個标記,然後根據Wercker網站的文檔安裝Wercker CLI。
如果已經正确安裝了CLI,應該可以查詢到CLI的版本,代碼如下所示。
Version:
Compiled at: -- :: + CST
Git commit: da8bc056ed99e27b4b7a1b608078ddaf025a9dc4
No new version available
本地建構隻要在項目的根目錄下輸入
wercker build
指令即可,wercker會自動下載下傳依賴的docker鏡像在本地運作所有建構流程。
建立Wercker配置檔案wercker.yml
Wercker配置檔案是一個YAML檔案,該檔案必須在GitHub repo的最頂層目錄,該檔案主要包含三個部分,對應可用的三個主要管道。
— Dev:定義了開發管道的步驟清單。與所有管道一樣,可以標明一個box用于建構,也可以全局指定一個box應用于所有管道。box可以是Wercker内置的預制Docker鏡像之一,也可以是Docker Hub托管的任何Docker鏡像。
— Build:定義了在Wercker建構期間要執行的步驟和腳本的清單。與許多其他服務(如Jenkins和TeamCity)不同,建構步驟位于代碼庫的配置檔案中,而不是隐藏在服務配置裡。
— Deploy:在這裡可以定義建構的部署方式和位置。
Wercker中還有工作流的概念,通過使用分支、條件建構、多個部署目标和其他進階功能擴充了管道的功能,這些進階功能讀着可以自己在wercker的網站中探索。
示例
我們以我用Go語言開發的管理yarn on docker叢集的指令行工具magpie為例,講解如何使用wercker自動建構,并産生docker鏡像釋出到Docker Hub中。
下面是magpie這個項目中使用的
wercker.yml
檔案。
box: golang
build:
steps:
# Sets the go workspace and places you package
# at the right place in the workspace tree
- setup-go-workspace
# Gets the dependencies
- script:
name: go get
code: |
go get github.com/rootsongjc/magpie
# Build the project
- script:
name: go build
code: |
go build -o magpie main.go
# Test the project
- script:
name: go test
code: |
go test ./...
- script:
name: copy files to wercker output
code: |
cp -R ./ ${WERCKER_OUTPUT_DIR}
deploy:
steps:
- internal/docker-push:
username: $USERNAME
password: $PASSWORD
cmd: /pipeline/source/magpie
tag: latest
repository: jimmysong/magpie
此檔案包含兩個管道:build和deploy。在開發流程中,我們使用Wercker和Docker建立一個幹淨的Docker鏡像,然後将它push到Docker Hub中。Wercker包含一個叫做
Internal/docker-push
的deploy plugin,可以将建構好的docker鏡像push到鏡像倉庫中,預設是Docker Hub,也可以配置成私有鏡像倉庫。
box鍵的值是golang。這意味着我們使用的是一個基礎的Docker鏡像,它已經安裝了Go環境。這一點至關重要,因為執行Wercker建構的基準Docker鏡像需要包含應用程式所需的建構工具。
這部分存在一些難以了解的概念。當使用Wercker進行建構時,其實并沒有使用本地工作站的資源(即使在技術層面上,建構也是在本地執行的),相反,使用的是Docker鏡像中的可用資源。是以,如果要使用Wercker編譯Go應用程式,需要首先運作包含Go的Docker鏡像。如果想要建構唯一的工件,無論它是在本地還是在Wercker的雲端運作,使用Docker鏡像都是完全合理的。
本次建構中運作的第一個腳本是go get。這一步可以go get可能需要的、但不包含在基礎鏡像中的任何東西。無論為腳本設定什麼名稱,建構輸出都會有所顯示,如下圖所示。
在build管道中,接下來的兩個腳本執行的建構和測試流程,最後一個腳本是将建構後的檔案拷貝到wercker的輸出目錄中,我們将使用該目錄建構docker鏡像。
我們注意到deploy中有兩個變量:
$USERNAME
、
$PASSWORD
,這是我們自定義的變量,當你不希望将隐私内容直接寫在代碼中的時候,可以在wercker中自定義變量,變量可以隻作用于單個pipeline,也可以是所有pipeline共享的。
可以将變量設定成Protected模式,這樣隻有設定者本人才知道該變量的值是什麼,其他人即使有共享通路權限,也看不到該變量的值,但可以重新設定來覆寫原值。
Deploy管道中配置的docker鏡像的repo、tag和cmd指令,其他容器配置都在代碼頂層目錄的
Dockerfile
中定義。當整個建構流程完成後,就可以在docker鏡像倉庫中看到剛建構的鏡像
jimmysong/magpie:latest
了。
總結
當然以上隻是一個很簡單的示例,還有很多可以優化的流程,比如我們在示例使用
latest
作為docker鏡像的tag,wercker本身提供了很多内置和建構時環境變量,我們可以在
wercker.yml
檔案裡擷取這些變量作為指令中的值。
當比于其他CI工具,wercker配置簡單,更易于使用,同時在wercker的registry中還可以看到很多别人建構的pipline可供參考,還有十分友好的workflows可用于編排建構流程和依賴。
參考
容器化應用開發部署平台Wercker獲450萬美元A輪融資
甲骨文收購創業公司Wercker 為開發人員自動化代碼測試部署
Wercker docs
Wercker workflow
magpie