自動化部署架構-採用Drone

Drone 是一套基於 Docker Container 技術的 CI/CD 服務,它是用 Go 語言所開發,可以安裝在任何作業系統內,你可以把 Drone 當作是開源版的 Travis 服務。
* Drone 本身不支援排程任務,也就是說無法像 Jenkins CI 一樣可以設定每天幾點幾分執行單一 Job 任務

安裝Drone

// 或透過Go取得
go get github.com/drone/drone-cli/drone
  • 透過 docker-compose 安裝
// 透過 composer
docker pull drone/drone:0.8
docker pull drone/agent:0.8
  • 直接安裝drone-cli
curl -L https://github.com/drone/drone-cli/releases/download/v0.8.6/drone_linux_amd64.tar.gz | tar zx
sudo install -t /usr/local/bin drone

準備開發環境

  • Github 部分
    • 開啟OAUTH(Settings -> Developer settings->Register a new application)
      需要打開Tag
  • 申請專案 Token

Drone 使用步驟

  • .drone.yml 就是一個告訴 Drone 你要如何測試、建置這個環境的檔案,這個檔案要被放置在倉庫的根目錄,這部分很進階、玩法很多,還請自行參考官方文件
  • 所有步驟都建立在 .drone.yml 中,可以動態去調整
  • Git clone -> testing -> Verify Quality ->Build
  • Git Clone
workspace:
   base: /go
   path: src/github.com/go-training/drone-golang-example

git clone:
   git:
      images: plugins/git
      depth: 50
      tags: true
  • testing 及 Verify Quality
pipeline:
   backend:
      image: golang
      commands:
         - go get
         - go build
         - go test
   test:
      images: golang:1.9
      pull: true
      comands:
         - make fmt-check  // Code Quality
         - go vet
         - go test -v .   // testing

上述的command 底層實際上會包成類似底下的指令:

#!/bin/sh
set -e
make fmt-check
make test
  • Build
build_linux_amd64:
   image: golang: 1.9.2
   group: build
   evironment:
      - CGO_ENABLE=0
      - GOOS=linux
      - GOARCH=amd64
    commands:
       - go build -v -a -o release/linux/amd64/helloworld

build_linux_i386
   image: golang:1.9.2
   group: build
   environment:
      - CGO_ENABLE=0
      - GOOS=linux
      - GOARCH=i386
   commands:
       - go build -v -a -o release/linux/amd64/helloworld
  • Build Docker
publish_server:
   image: plugins/docker
   pull: true
   repo: appleboy/helloworld
   secrets: [ docker_username, docker_password ]
   default_tags: true
   when:
      event: [ push, tag ]
  • secrets Security 解說
    • Drone CLI or Web Console
drone secret add \
   --repository go-training/drone-goang-example \
   --event push --event tag \
   --image plugins/docker \
   --name docker_username \
   --value justjii
  • Notifiation Plugin
    • Slack, LINE
discord:
   image: appleboy/drone-discord
   pull: true
   secrets:
     - source: webhook_prod_id
        target: webhook_id
     - source: webhook_prod_token
        target: webhook_token
    when:
       status: [ success, failure ]

Drone plugin

  • Volume
  • SFTP cache

Cache Broken

  • skip cache or cache skip
    • Only for SFTP cache

Drone Plugin

  • go
  • php
  • bashrc
#!/bin/sh

curl \
   -X ${PLUGIN_MEYHOD} \
   -d ${PLUGIN_BODY} \
   ${PLUGIN_URL}

Try Drone without Server

透過第三方工具(cron)整合 Drone API 達成自動排程的效果

  • 透過 CLI 呼叫 Drone 執行指定的專案 Job Number
drone build start --fork <repository> <build>
// fork 代表啟動新的任務,並非是重新啟動該編號任務

// 根據專案 Branch 名稱得到最後 Build Number
drone build last --format="{{ .Number }}" --branch=<branch> <repository>
  • 拿到最後一個 Number 後,就可以開始寫 Cron job 任務:
// 將 branch 及 octocat/hello-world 換成您的專案名稱即可。
* 22 * * * drone build start --fork octocat/hello-world $(drone build last --format="{{ .Number }}" --branch=master octocat/hello-world)

相關工具

參考文件