使用Wercker進行持續構建與發佈

原文鏈接:http://rootsongjc.github.io/blogs/continuous-integration-with-wercker/

本文介紹了wercker和它的基本用法,並用我GitHub上的magpie應用作爲示例,講解如何給GitHub項目增加wercker構建流程,並將生成的鏡像自動上傳到Docker Hub上。

CI工具

開源項目的構建離不開CI工具,你可能經常會在很多GitHub的開源項目首頁上看到這樣的東西:

wercker status badge

這些圖標都是CI工具提供的,可以直觀的看到當前的構建狀態,例如wercker中可以在Application-magpie-options中看到:

wercker status badge設置

將文本框中的代碼複製到你的項目的README文件中,就可以在項目主頁上看到這樣的標誌了。

現在市面上有很多流行的CI/CD工具和DevOps工具有很多,這些工具提高了軟件開發的效率,增加了開發人員的幸福感。這些工具有:

適用於GitHub上的開源項目,可以直接使用GitHub賬戶登陸,對於公開項目可以直接使用:Travis-ciCircleCIWercker。從目前GitHub上開源項目的使用情況來看,Travis-ci的使用率更高一些。

適用於企業級的:Jenkins

不僅包括CI/CD功能的DevOps平臺:JFrogSpinnakerFabric8

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: 1.0.882
Compiled at: 2017-06-02 06:49:39 +0800 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共享的。

在wercker中設置環境變量

可以將變量設置成Protected模式,這樣只有設置者本人才知道該變量的值是什麼,其他人即使有共享訪問權限,也看不到該變量的值,但可以重新設置來覆蓋原值。

Deploy管道中配置的docker鏡像的repo、tag和cmd命令,其他容器配置都在代碼頂層目錄的Dockerfile中定義。當整個構建流程完成後,就可以在docker鏡像倉庫中看到剛構建的鏡像jimmysong/magpie:latest了。

使用wercker自動構建的docker鏡像magpie

總結

當然以上只是一個很簡單的示例,還有很多可以優化的流程,比如我們在示例使用latest作爲docker鏡像的tag,wercker本身提供了很多內置和構建時環境變量,我們可以在wercker.yml文件裏獲取這些變量作爲命令中的值。

當比於其他CI工具,wercker配置簡單,更易於使用,同時在wercker的registry中還可以看到很多別人構建的pipline可供參考,還有十分友好的workflows可用於編排構建流程和依賴。

參考

容器化應用開發部署平臺Wercker獲450萬美元A輪融資

甲骨文收購創業公司Wercker 爲開發人員自動化代碼測試部署

Wercker docs

Wercker workflow

magpie

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章