上一個實作已經使用 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 時才會將這個金鑰設定進去。
這次的工作除了 get
和 task
之外,還會再增加 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
動作時,則需要給予一些額外的資訊。
以上兩個是必要的,而且是一個檔案。因為在 Concourse 在任務間基本上是獨立隔離的,所以只能透過這種方式來傳遞一些動態的資訊。
這個參數其實不用設定,不過因為我們希望我們打包的檔案可以被釋出,所以額外指定要找哪些檔案去上傳。
最後是 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
指令產生時間戳記來當作替代。
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 的命令列工具。