今天我們會利用 mruby 的 gem 來生成可以在任何 64 位元電腦運行的執行檔。基於昨天的 Pipleine 設定,會再加入更多設定值讓 Pipeline 豐富起來。
這次一樣只會用到 git
跟 github-release
兩個資源。
resources:
- name: example
type: git
source:
uri: https://github.com/elct9620/concourse-example-mrb.git
- name: gh-release
type: github-release
source:
user: elct9620
repository: concourse-example-mrb
access_token: {{github-token}}
今天會將完成的檔案發佈到 Github 上,並且可以下載到任何 64 位元的 Linux 電腦上使用。
跟昨天相比,其實只多了一個 exam
的任務,用來檢查編譯完成的檔案是否可以正常使用。
jobs:
- name: compile-and-release
plan:
- get: example
trigger: true
- task: compile
file: example/tasks/compile.yml
- task: exam
file: example/tasks/exam.yml
- put: gh-release
params:
name: build/name
tag: build/tag
globs:
- build/host/bin/example
今天的重點在於我們的任務設定開始有一些變化,讓編譯的動作開始有一些不同。
---
platform: linux
image_resource:
type: docker-image
source:
repository: elct9620/mrb-compiler
inputs:
- name: example
outputs:
- name: build
run:
path: sh
args:
- -exc
- |
export VERSION=$(date +"%Y%m%d%H%M%S")
echo "Release $VERSION" > build/name
echo "1.0.0-$VERSION" > build/tag
mruby-compiler $(pwd)/example $(pwd)/build
首先是 compile
任務,這次使用了自製的 mrb-compiler
Docker Image 來處理,裡面預先封裝好了 mruby 1.2.0 來加快編譯的速度。
另外這裡其實是能夠直接用下面這組設定的:
run:
path: mruby-compiler
args:
- ./example
- ./build
不過因為 github-release
的需要,所以只好改成用 sh
去執行。
另一方面是因為
mrb-compiler
這個 Docker Image 還有一些細節沒有處理好,當我們用args
參數指定時,是無法透過$(pwd)
來取的絕對路徑,反而讓mruby-compiler
這個指令無法順利的複製檔案。
接下來是 exam
任務。
---
platform: linux
image_resource:
type: docker-image
source:
repository: alpine
inputs:
- name: build
run:
path: ./build/host/bin/example
args:
- puts true
相較之下就簡單很多,我們先去除 ruby
的環境改用 alpine
來確認編譯出來的檔案可以在非 Ruby 環境中執行。
前面的任務已經指定 build
為輸出目錄,在這個任務我們則用 inputs
把這個目錄連結進來(每次都會是在 /tmp/xxxxx
的目錄下,所以是無法共享的)
取得前一個任務生成的二進位檔後,就可以直接指定路徑並且執行。
最後,跟上一篇一樣要將 Pipeline 設定到 Concourse 並且啟動 Pipeline。
fly -t lite sp -p mrb-example -c concourse.yml --var "github-token=TOKEN_NAME"
fly -t lite up mrb-example
有興趣的話,還可以嘗試看看透過 Cross Compile 和用不同作業系統的 Worker,發布支援不同作業系統的版本。
下一篇會介紹結合 Travis CI 的 dpl
工具和 Slack Notification 製作一個自動部署網站的 Pipeline!