iT邦幫忙

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

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

20 - 用 Concourse 部署網站

  • 分享至 

  • xImage
  •  

這次的實作會介紹如何用 Concourse 來部署網站到 Heroku 上面,並且發送一則通知到 Slack 上。

資源

這次因為 Slack 是社群實作的資源,所以我們需要先將這個資源定義成 Concourse 可辨識的資源。簡單說就是告知 Concourse 遇到這個類型的資源要去哪裡下載 Docker Image 來使用。

resource_types:
- name: slack-notification
  type: docker-image
  source:
    repository: cfcommunity/slack-notification-resource
    tag: latest

接下來將會使用到的資源定義在下方。

resources:
- name: rails
  type: git
  source:
    uri: https://github.com/elct9620/concourse-example-rails.git
- name: notification
  type: slack-notification
  source:
    url: {{webhook}}

這次因為使用 Slack 通知,所以需要設定 Slack 的 Webhook 網址,如果是內部專案使用的話,可以直接寫入。因為這次的案例是公開在網路上的,為了避免被發送訊息騷擾,所以一樣採用參數的方式傳入。

任務

這次我們希望在跑完測試後才部署網站,所以先安排執行 RSpec 的測試,再做 Heroku 的 Deploy 操作。而 Heroku 的登入 Token 也是不應該被公開的資料,所以一樣在設定 Pipeline 的時候才傳入。

jobs:
  - name: test
  serial_groups: [deploy]
    plan:
      - get: rails
        trigger: true
      - task: rspec
        file: rails/concourse/rspec.yml
  - name: deploy
    serial_groups: [deploy]
    plan:
      - get: rails
        trigger: true
      - task: deploy
        file: rails/concourse/deploy.yml
        params:
          HEROKU_KEY: {{heroku-key}}
      - put: notification
        params:
          text: The newest version is deployed!

不過這樣的設定你會看到像這樣的畫面:

http://ithelp.ithome.com.tw/upload/images/20161220/20065771TdGB4tMGON.png

這是因為工作是平行的運行,所以我們要改用 pass 來改變順序。

jobs:
  - name: test
    plan:
      - get: rails
        trigger: true
      - task: rspec
        file: rails/concourse/rspec.yml
  - name: deploy
    plan:
      - get: rails
        passed: [test]
      - task: deploy
        file: rails/concourse/deploy.yml
        params:
          HEROKU_KEY: {{heroku-key}}
      - put: notification
        params:
          text: The newest version is deployed!

畫面就會變成這樣,就能夠在 test 工作跑完後才執行部屬。

http://ithelp.ithome.com.tw/upload/images/20161220/20065771QLWwfKSPp1.png

Slack 通知部分就如同資源的設定一樣,使用 put 的方式將需要發布的訊息當作參數傳入就可以了。
另外還可以使用資源特有的 Metadata 像是 $BUILD_ID 之類的數值。

任務

在 RSpec 測試部分需要 Rails 的環境,所以需要先安裝一些 Rails 需要的套件。

---
platform: linux

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

inputs:
- name: rails

run:
  path: sh
  args:
    - -exc
    - |
      apk --update add ruby-dev build-base zlib-dev libxml2-dev libxslt-dev tzdata yaml-dev postgresql-dev ruby-io-console ruby-json yaml nodejs
      cd rails
      bundle install
      bundle exec rspec

接下來安裝 dpl 指令來跑 Heroku 的部署。

---
platform: linux

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

inputs:
- name: rails

run:
  path: sh
  args:
    - -exc
    - |
      apk --update add git curl
      gem install dpl
      cd rails
      dpl --provider=heroku --api-key=$HEROKU_KEY --app=concourse-example-rails

因為 dpl 會自動配置好環境,所以只需要安裝最基本相依的套件(像是 curl)就可以了。一樣的理由,Token 是不應該直接寫在檔案中,所以使用環境變數來存取。這個變數是先前定義在 Pipeline 設定檔中的 HEROKU_KEY 參數。

設定

fly -t lite sp -p deploy-example -c concourse.yml --var "webhook=WEBHOOK_URL" --var "heroku-key=TOKEN"

這次有兩個參數要傳入,所以透過兩次的 --var 設定來傳入。
(如果設定非常多的話,可以考慮改用檔案儲存這些設定)

fly -t lite up -p deploy-example

最後啟動 Pipeline 就能夠自動部署網站到 Heroku 上了!

下一篇會開始討論如何開發自己的資源類型。


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

尚未有邦友留言

立即登入留言