天天看點

使用Wercker進行持續建構與釋出

原文連結:http://rootsongjc.github.io/blogs/continuous-integration-with-wercker/

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

CI工具

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

使用Wercker進行持續建構與釋出

這些圖示都是CI工具提供的,可以直覺的看到目前的建構狀态,例如wercker中可以在

Application

-

magpie

-

options

中看到:

使用Wercker進行持續建構與釋出

将文本框中的代碼複制到你的項目的

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使用者之間進行協作,而無須提供信用卡。下圖為設定新應用程式的向導頁面。

使用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可能需要的、但不包含在基礎鏡像中的任何東西。無論為腳本設定什麼名稱,建構輸出都會有所顯示,如下圖所示。

使用Wercker進行持續建構與釋出

在build管道中,接下來的兩個腳本執行的建構和測試流程,最後一個腳本是将建構後的檔案拷貝到wercker的輸出目錄中,我們将使用該目錄建構docker鏡像。

我們注意到deploy中有兩個變量:

$USERNAME

$PASSWORD

,這是我們自定義的變量,當你不希望将隐私内容直接寫在代碼中的時候,可以在wercker中自定義變量,變量可以隻作用于單個pipeline,也可以是所有pipeline共享的。

使用Wercker進行持續建構與釋出

可以将變量設定成Protected模式,這樣隻有設定者本人才知道該變量的值是什麼,其他人即使有共享通路權限,也看不到該變量的值,但可以重新設定來覆寫原值。

Deploy管道中配置的docker鏡像的repo、tag和cmd指令,其他容器配置都在代碼頂層目錄的

Dockerfile

中定義。當整個建構流程完成後,就可以在docker鏡像倉庫中看到剛建構的鏡像

jimmysong/magpie:latest

了。

使用Wercker進行持續建構與釋出

總結

當然以上隻是一個很簡單的示例,還有很多可以優化的流程,比如我們在示例使用

latest

作為docker鏡像的tag,wercker本身提供了很多内置和建構時環境變量,我們可以在

wercker.yml

檔案裡擷取這些變量作為指令中的值。

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

參考

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

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

Wercker docs

Wercker workflow

magpie