iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 29
0

本系列文已經接近尾深,今天分享一個跟前面比較不一樣的主題,Drone CI/CD。分享這個工具的主因,是因為體會過 CI/CD 的美好就回不去了,剛好 Drone 是一套以 golang 編程的 CI/CD 工具,本篇讓我們使用 Github repo 當作目標,實現簡易的 CI testting。
drone

Install

安裝準備分為兩個部分,機器與 Repo Setting。

Machine

準備一台 VM,供應商依自己喜歡的選擇即可(筆者使用便宜的 Linode,大家有機器或 GCP 也都可以)。並在機器上安裝 OS, docker, docker-compose,以便在機器上執行 drone image。

  • OS
  • docker
  • docker-compose

VM

> docker-compose version

docker-compose version 1.26.2, build eefe0d31
docker-py version: 4.2.2
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

Repo Setting

開啟我們的 Github,在開發人員設定裡面新增 OAuth App

1

2

3

Startup

將剛剛我們準備好的 Client ID 與 Client Secret,加入啟用 drone 的 docker-compose.yml 中,並在機器上產生 drone-server 與 drone-runner 溝通用的密鑰。

Create DRONE_RPC_SECRET

> openssl rand -hex 16

db242daf100b137d40f7f40f82168b7b //我不是用這組你放心

docker-compose.yml

version: '2'

services:
  drone-server:
    image: drone/drone:1
    container_name: drone-server
    ports:
      - 80:80
    volumes:
      - /var/lib/drone:/var/lib/drone/
    restart: always
    environment:
      - DRONE_SERVER_HOST="{YOUR_MACHINE_HOST}"
      - DRONE_SERVER_PROTO=http
      - DRONE_RPC_SECRET=db242daf100b137d40f7f40f82168b7b
      - DRONE_GITHUB_CLIENT_ID="{CLIENT_ID}"
      - DRONE_GITHUB_CLIENT_SECRET="{CLIENT_SECRET}"

  drone-runner:
    image: drone/drone-runner-docker:1
    container_name: drone-runner
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_HOST=drone-server
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_SECRET=db242daf100b137d40f7f40f82168b7b
      - DRONE_RUNNER_CAPACITY=2

Start

> docker-compose up 

drone-server    | {"interval":"30m0s","level":"info","msg":"starting the cron s}
drone-server    | {"interval":"24h0m0s","level":"info","msg":"starting the zomb}
drone-runner    | time="2020-08-12T14:53:37Z" level=info msg="starting the serv"
drone-runner    | time="2020-08-12T14:53:37Z" level=info msg="successfully ping"
drone-runner    | time="2020-08-12T14:53:37Z" level=info msg="polling the remotr
drone-runner    | received signal, terminating process
drone-runner    | time="2020-08-30T04:44:49Z" level=error msg="shutting down th"
drone-runner    | drone-runner-docker: error: http: Server closed, try --help
drone-runner    | time="2020-08-30T04:45:19Z" level=info msg="starting the serv"
drone-runner    | time="2020-08-30T04:45:19Z" level=error msg="cannot ping the "
drone-runner    | time="2020-08-30T04:45:20Z" level=info msg="successfully ping"
drone-runner    | time="2020-08-30T04:45:20Z" level=info msg="polling the remotr

簡單介紹一下最常見的 kind: pipeline,如其名管道化的流程可分為數個 steps(步驟),每一個步驟為獨立的 check point,並運行於獨立的 containers 中。每個步驟內由於是啟用獨立的 containers,故可以到皆需設定所需的 image, environment, commands。

以本篇的 .drone.yml 來說,我們便是針對了這個套件,啟用了兩個 containers,分別進行了 golangci-lint靜態code掃描與 go test單元測試。

GUI
drone GUI

Usage

  1. 針對想要進行 CI testting 的專案,於 drone GUI 上啟用
    active

  2. 於該專案內增加 drone 描述檔
    .drone.yml

    workspace:
        base: /go
        path: src/github.com/WeiWeiWesley/simple_redis
    
    kind: pipeline
    name: simple_redis
    
    steps:
    - name: golangci-lint
      image: golangci/golangci-lint:v1.23.3-alpine
      commands:
        - golangci-lint run
    
    - name: go_test
      image: golang:1.12
      environment:
        CGO_ENABLED: 0
        GO111MODULE: on
      commands:
        - go get -u --insecure ./...
        - go test -cover
    
  3. Push commit 觸發 drone CI
    drone steps

  4. 通過所有步驟會獲得 ✅
    checks passed
    每次 commit 都會紀錄檢查結果
    commit

Learn more


上一篇
Day28 NSQ (Tips)
下一篇
Day30 系列文總結與回顧
系列文
Go Distributed & Go Consistently30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言