iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 18
0
DevOps

不一樣的 CI/CD 工具:Concourse 初探系列 第 18

18 - 用 Concourse 生成靜態網頁

上一個實作已經使用 Concourse 來執行測試,假設專案是需要打包的套件,那麼可以該怎麼做呢?
這次使用 Middleman 生成靜態網頁後,利用社群開發的 github-release 套件將檔案發佈到 Github 的 Release 列表上。

資源

和上次一樣,先確定會用到哪些資源來處理需要處理的部分。

resources:
- name: middleman
  type: git
  source:
    uri: https://github.com/elct9620/concourse-example-middleman.git
- name: gh-release
  type: github-release
  source:
    user: elct9620
    repository: concourse-example-middleman
    access_token: {{github-token}}

這次除了使用到 git 資源外,我們還會用 github-release 來針對發布打包好的檔案到 Github 做準備。
因為要發佈到 Github 上,我們還需要 access_token 讓我們有權限使用,所以需要產生一個有 repo 或者 public_repo 權限的存取金鑰才行,另一方面為了安全性我們會在後續設定 Pipeline 時才會將這個金鑰設定進去。

工作

這次的工作除了 gettask 之外,還會再增加 put 做發布的動作。

jobs:
  - name: build-and-release
    plan:
      - get: middleman
        trigger: true
      - task: build
        file: middleman/concourse/build-task.yml
      - put: gh-release
        params:
          name: build/name
          tag: build/tag
          globs:
            - build/build-*.tar.gz

另一方面,因為隨著專案越來越複雜,我們會需要利用 Concourse 提供將部分設定檔區分開來的功能,把一些設定放到專案中。
所以這次我們針對建置的任務做分離,讓檔案從 Pipeline 的設定檔分離出來。

要注意的是,這些分離的設定檔要放在可以被存取到的地方。一般來說就是在專案中,以這個專案為例就是在 middleman 這個資源下的 concourse/build-task.yml 這個檔案。

github-release 這個資源在做 put 動作時,則需要給予一些額外的資訊。

  • name: Release 的名稱(檔案)
  • tag: Tag 的名稱(檔案)

以上兩個是必要的,而且是一個檔案。因為在 Concourse 在任務間基本上是獨立隔離的,所以只能透過這種方式來傳遞一些動態的資訊。

  • globs: 要上傳的檔案

這個參數其實不用設定,不過因為我們希望我們打包的檔案可以被釋出,所以額外指定要找哪些檔案去上傳。

任務

最後是 concourse/build-task.yml 這個檔案。

---
platform: linux

image_resource:
  type: docker-image
  source:
    repository: ruby
    tag: '2.3-alpine'

inputs:
- name: middleman

outputs:
- name: build

run:
  path: sh
  args:
    - -exc
    - |
      apk --update add build-base git libffi-dev libxml2-dev libxslt-dev \
               nodejs openssl-dev ruby ruby-bigdecimal  \
               ruby-dev ruby-io-console ruby-json zlib-dev
      cd middleman
      bundle install
      bundle exec middleman build
      export VERSION=$(date +"%Y%m%d%H%M%S")
      echo "Build Name: $VERSION"
      echo "Build - $VERSION" > ../build/name
      echo "Build Version: v1.0.0-$VERSION"
      echo "v1.0.0-$VERSION" > ../build/tag
      tar -cvzf ../build/build-$VERSION.tar.gz  build/*


和 RSpec 的基本上是一樣的,不過因為要使用 Middleman 需要編譯一些 Gem 所以需要先用 apk 安裝一部分的相依。
另一方面 github-release 也需要一些額外的檔案跟資訊(發布的 name 和標記的 tag 名稱),這邊在建置出來後,也同時將檔案打包和寫入提供資訊的檔案讓 github-release 可以做參考。

因為 Concourse 在沒有設定的情況下並不會提供額外的環境變數,所以這邊就用 date 指令產生時間戳記來當作替代。

設定 Pipeline

fly -t lite sp -p middleman-example -c concourse.yml --var "github-token=TOKEN_NAME"

最後就是將 Pipeline 新增到 Concourse 裡面,只是我們需要額外增加 --var 設定值將剛剛沒有寫在設定檔中的金鑰寫入。
如此一來就可以避免金鑰存在於 Git Repository 之中,從而減少安全性上的問題。

fly -t lite up middleman-example

一切就緒後只要啟動 Pipeline 就會開始運作,這次的範例因為需要部署到自己的 Github 專案,大家可以 Fork 範例專案後再做嘗試。

下一篇會介紹用來編譯 Golang 的命令列工具。


上一篇
17 - 資源
下一篇
19 - 用 Concourse 建置命令列工具
系列文
不一樣的 CI/CD 工具:Concourse 初探30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言