CI/CD 大亂鬥: Drone 1.0 功能介紹

drone ci/cd

很高興受到 Devops Taiwan 邀請到台北講『Drone CI/CD 1.0 新功能』,現場太多 CI/CD 工具一起 PK,有興趣可以看活動網頁。其實我在其他場合講過很多次 Drone 的基礎,所以這次上台北最主要探討 Drone 在今年 2019 Release 1.0 的一些重大功能,我相信大家在用舊的版本已經很順了,其實如果不升級到新的版本也是沒差。底下我會一一介紹 1.0 的新功能。有共筆紀錄,大家可以先參考看看。

影片介紹

我自己在台北分享後,又自己錄製了一段,歡迎大家參考

如果喜歡 Drone 也可以參考 Udemy 影片: http://bit.ly/drone-2019

投影片

支援 Cloud 服務

Drone 也推出了 Cloud 服務讓開源專案可以免費使用,在去年以前,Drone 其實沒有 Cloud 服務,都是作者一個人買機器讓大家使用,現在 Drone 背後有[雲端服務 Packet]12 提供硬體服務,所以現在 Drone 也可以推 Cloud 服務,但是太少人知道了,目前我將所有的開源專案也都轉到 Cloud 上面。

Build Detail 頁面

支援 ARM 及 Windows Platform

你沒看錯,Drone 開始支援原生 Windows Platform,也就是今天你想要在 Windows 上測試 .Net 程式碼,現在可以透過 Drone 來部署及測試了,這對於 Windows 用戶是一大福音,開發者現在可以包 Windows 容器運行在 Drone 平台。現在 Drone 團隊也陸陸續續將 Plugin 移植一份到 Windows Platform。

支援多主機架構 (Multi-Machine)

Drone 現在可以指定專案跑在哪一種架構上面,像是 ARM, Windows 或 AMD64,只要透過底下簡單的設定

---
kind: pipeline

platform:
  arch: arm
  os: linux

steps:
- name: build
  image: golang
  commands:
  - go build
  - go test

也可以在 YAML 設定將兩個 pipeline 丟給不同的主機去跑

---
kind: pipeline
name: backend

platform:
  arch: arm
  os: linux

steps:
- name: build
  image: golang
  commands:
  - go build
  - go test

---
kind: pipeline
name: frontend

platform:
  arch: amd64
  os: linux

steps:
- name: build
  image: node
  commands:
  - npm install
  - npm test

depends_on:
- backend

平行處理

除了可以透過兩個 pipeline 丟給不同的主機跑之外,單一主機也是可以跑平行處理的

---
kind: pipeline
name: default

steps:
- name: backend
  image: golang
  commands:
  - go build
  - go test

- name: frontend
  image: golang
  commands:
  - npm install
  - npm test

- name: build
  image: plugins/slack
  settings:
    channel: general
  depends_on:
  - backend
  - frontend

用程式寫 yaml 設定

之前寫過一篇『有效率的用 jsonnet 撰寫 Drone CI/CD 設定檔』,現在遇到相同的 YAML 設定都可以透過寫程式的方式來自動產生 YAML 設定了

local pipeline = import 'pipeline.libsonnet';
local name = 'drone-ssh';

[
  pipeline.test,
  pipeline.build(name, 'linux', 'amd64'),
  pipeline.build(name, 'linux', 'arm64'),
  pipeline.build(name, 'linux', 'arm'),
  pipeline.release,
  pipeline.notifications(depends_on=[
    'linux-amd64',
    'linux-arm64',
    'linux-arm',
    'release-binary',
  ]),
]

支援外部 Secret 管理

Drone 正式支援 Vault, Kubernetes SecretAWS Secret,團隊可以將 Drone 安裝在 k8s 或 AWS 容器內,並且使用期 Secret 管理工具,當然也可以整合大家喜歡的 Vault。

---
kind: secret
name: slack_webhook
get:
  path: secret/data/slack
  name: webhook

---
kind: pipeline
name: default

steps:
- name: build
  image: golang
  commands:
  - go build
  - go test

- name: notify
  image: plugins/slack
  settings:
    channel: general
    webhook:
      from_secret: slack_webhook

支援 Global Secret

除了上述支援 Secret Manager 以外,現在作者也支援了 Global Secret,這個功能相當重要,在 0.5 有此版本,但是 0.8 被拔掉,現在 1.0 又被加回來了,詳細 commit 可以參考這邊,未來可以在 UI 或者是 CLI 設定 Organization Secret,套用到底下全部 repository 了。

支援 Cron Job

1.0 也正是透過 UI 可以設定 Cron Job,這對於寫 Firmware 的開發者非常有幫助,半夜都需要跑 Daily build 產出相對應的 binary,現在可以透過後台直接設定了,在 Yaml 內也可以指定 pipeline 跑 cron job。

# example when configuration
when:
  cron: [ nightly ]

# example trigger configuration
trigger:
  cron: [ nightly ]

支援 Gitlab 或 bitbucket YAML 設定轉換

如果有在用 Gitlab CI 的團隊,現在可以透過 Drone CLI 直接將 YAML 設定檔轉換到 Drone 了,以 Gitlab CI 為例:

$ drone convert .gitlab-ci.yml

底下是 .gitlab-ci.yml

image: ruby:2.2

services:
  - postgres:9.3

before_script:
  - bundle install

test:
  script:
  - bundle exec rake spec

轉換後

---
kind: pipeline
name: test

platform:
  os: linux
  arch: amd64

steps:
- name: test
  image: ruby:2.2
  commands:
  - bundle install
  - bundle exec rake spec

services:
- name: postgres-9-3
  image: postgres:9.3

...

也可以直接從後台設定讀取 gitlab ci 設定

指定 Agent 機器

現在 drone 可以讓 JOB 指定機器執行,也就是假設有一個 job 需要 CPU 或記憶體非常高的機器來 跑,可以透過 YAML 來指定

kind: pipeline
name: default

steps:
- name: build
  image: golang
  commands:
  - go build
  - go test

node:
  instance: highmem

心得

drone 1.0 真的很多新功 能都很吸引開發者,大家可以先到 cloud 服務測試,再決定是不是要在公司內自己架設一台。如果大家對於 drone 有興趣,也可以參考我在 Udemy 上面的教學