用Gitlab做CI/CD並且使用Slack、Line做通知

建立時間: 2019-11-07 20:59:31
更新時間: 2019-11-09 10:06:51

一直以來

都有使用Gitlab跑CI/CD的習慣

不過之前都是斷斷續續片段的學

這陣子比較有空就來整理一篇從無到有

透過Gitlab建立VueLaravel的CI/CD環境

並且使用SlackLine做通知

以下範例皆為gitlab.com上使用CI/CD

 

初始化專案

這邊就不贅述

基本上就是在Gitlab建立專案

如果有特殊需求就另外做CI/CD的設定

 

挑選適合的container image

在Gitlab跑CI/CD都是透過container來執行

因此需要挑一個適合的container image

有很多現成包好的image

可以從Github或Docker hub可以找到

 

不過我為了打造最適合自己專案的container image

所以就自己建了一個Docker Image

並且發布到Docker hub上(ciaochung/ci-nodejs-php)

這個Image主要會在container內安裝我慣用的一些套件

包含node.js、yarn、php7.1及相關套件、composer

另外還會安裝我自己自建的環境佈署工具(ciao-deploy)

 

設定.gitlab-ci.yml

透過image載入要使用的container image來源

並且可以透過job內的only屬性設定指定的branch來執行job

 

image: ciaochung/ci-nodejs-php

cache:
  paths:
    - Frontend/node_modules
    - Backend/vendor

variables:
  MYSQL_ROOT_PASSWORD: root
  MYSQL_USER: username
  MYSQL_PASSWORD: password
  MYSQL_DATABASE: cube
  DB_HOST: 127.0.0.1

stages:
  - test
  - deploy

# 跑前端測試
frontend_test:
  stage: test
  only:
    - develop
  script:
    - cd Frontend
    - yarn
    - yarn unit

# 跑後端測試
backend_test:
  stage: test
  only:
    - develop
  script:
    - ciao-deploy --command=mysql --password="$MYSQL_ROOT_PASSWORD" --withoutSudo
    - ciao-deploy --command=mysql-user-create --rootPassword="$MYSQL_ROOT_PASSWORD" --username="$MYSQL_USER" --password="$MYSQL_PASSWORD" --withoutSudo
    - ciao-deploy --command=mysql-db-create --rootPassword="$MYSQL_ROOT_PASSWORD" --db="$MYSQL_DATABASE" --withoutSudo
    - cd Backend
    - composer install
    - cp .env.example .env
    - php artisan x-cube:create-test-database
    - ./vendor/bin/phpunit ./Modules

# 測試錯誤時用line notify通知
on_test_failure:
  stage: .post
  script:
    - curl -X POST -i https://notify-api.line.me/api/notify -F "message=[$CI_PROJECT_NAME] 專案測試失敗" -H "Content-Type:multipart/form-data" -H "Authorization:Bearer $LINE_NOTITY_API_TOKEN"
  when: on_failure


# 發佈
deploy:
  stage: deploy
  only:
    - develop
  script:
    - cd Frontend
    - yarn
    - cd ../Backend
    - composer install
    - curl -X POST -i https://notify-api.line.me/api/notify -F "message=[$CI_PROJECT_NAME] 專案發佈成功" -H "Content-Type:multipart/form-data" -H "Authorization:Bearer $LINE_NOTITY_API_TOKEN"
   

 

stage是Gitlab CI的流程分類設定

這邊大致流程是

  1. test: 測試前端、測試後端
  2. deploy: 佈署(這邊先簡單的用yarn install、composer install當作佈署流程)
  3. 佈署成功後透過Line Notify API發佈(Line Notify API Token透過Gitlab CI/CD設定)

 

最後把這個.gitlab-ci.yml加到git repo內

然後把它push到前面建的gitlab repository中

Gitlab就會依照.gitlab-ci.yml的設定

自動執行CI/CD了

 

成功之後

就會收到Line的通知

 

透過Slack Webhook做通知

除了可以用Line在job script內自行做通知

也能用Slack做更複雜的通知

畢竟Line的訊息格式比較簡易一點

 

Gitlab有提供webhook可以跟外部服務做互動

這邊的Slack webhook通知主要是在特定的事件(例如git push、新增issue、pipeline狀態改變、發佈完成)

透過Slack incoming webhook對某個slack channel發出訊息

以下為Slack incoming webhook的設定流程

 

Gitlab的Integrations設定

前往Gitlab專案的Setting>Integrations

從下方的Project services區塊點選Slack notifications

 

設定Incoming webhook

點選最上方的Add an incoming webhook連結

設定要通知的slack channel並點選Add Incoming WebHooks integeration

 

接著設定名稱或是圖片,然後複製Webhook URL

 

儲存後回到設定的slack channel上

就會看到剛才啟用的服務(Integration)已經被加進去了

 

回Gitlab設定Slack Notifications

首先勾選最上方的Active做啟用

並且勾選需要通知的事件

希望跑CI/CD的時候都做通知

需要勾選Pipeline

 

貼上剛才複製的Webhook URL

如果希望Slack在Pipeline無論成功、失敗都要通知

記得要把下圖的Notify only broken pipelines的預設勾選取消

否則只有在CI/CD失敗時才會對slack發通知

設定好之後就可以儲存了

 

Push repository測試

最後將專案push上gitlab

就可以等通知了

 

更詳細作法可參考: 官方文件