【內附完整程式碼】DevOps 入門必學:Drone CI 實戰教學

自動化部署是我們在做 DevOps 不可或缺的流程,而 Drone 是一個輕量的部署工具,本篇文章能夠讓你了解 Drone CI 如何部署,讓你很快就能把後端服務架起來!

如果你已經知道如何部署 Drone,文末提供 GIthub 連結,讓你馬上快速部署!

為什麼要自動化部署?

想像一下,你正在開發一個專案,每次要部署時都需要:

  • 手動建置程式
  • 執行測試
  • 上傳到伺服器
  • 重新啟動服務

是不是覺得要考慮的太多、太麻煩?那麼 Drone CI 就是用來解決這個問題的完美工具!

為什麼選擇 Drone CI?

  • 輕量級:相比 Jenkins,安裝和配置更簡單
  • 支援 Docker:每個建置步驟都在隔離的容器中執行
  • 支援各種部署場景,包含 Docker、Kubernetes、SSH
  • 設定檔基於 YAML:易讀易懂,方便維護

自動化流程

大致上的流程就是我們將程式碼推到 Github,然後觸發 Webhook 啟動 Drone 去跑我們自定義的指令,可以是運行單元測試,或是程式碼檢查。

Drone CI 自動化部署架構圖

Docker

Docker 是一個開源的容器化平台,用於自動化應用程式的部署、運行和管理,使用前需要先下載桌面版
如果還不太懂 Docker 概念的可以先看 這支影片,解釋的蠻清楚的。

GitHub Webhook

Webhook 是 GitHub 提供的一種自動化機制,可以用來在每次系統事件發生時向指定的 Endpoint(端點)發送一個 http 請求。例如下列事件:

  • Push
  • Pull Request

當程式碼有更新時自動通知 Drone,並觸發自動化流程,實現排檢查版、安全檢測到最後部署的自動化流程。

由於 GitHub 需要一個公開的 URL 來發送 Webhook 通知,所以我們需要使用像 Ngrok 的工具,將本機的服務暴露到公網上。

Ngrok

我們可以使用 Ngrok 在本機開發和測試 CI/CD 流程,等到需要部署時再使用生產環境的 IP 即可。

如果還沒有安裝過的夥伴可以參考【部署利器】3 分鐘搞定!新手必學 Ngrok 快速入門指南

啟動 Ngrok

ngrok http http://localhost:8080

建立 Github OAuth Application

1. 登入 Github 帳號,Profile > Settings > Develop settings > OAuth Apps > New OAuth App

2. 輸入 Ngrok 的 URL,注意 “Authorization callback” 需加上 /login

github-regeister-new-oauth-app

3. 點擊 “Register application”,你會得到 GITHUB_CLIENT_IDGITHUB_CLIENT_SECRET,記錄下來下一步會用到。

github-create-oauth-app

建立 Github Repository

1. 建立一個 Github repository,名稱我取作 drone-ci-demo,並新增一個 .env 檔案,設定參數如下:

GITHUB_CLIENT_ID=     # Github client ID
GITHUB_CLIENT_SECRET= # Github client secret
DRONE_DATA=./drone    # Volume mapping path
DRONE_SERVER_HOST=89ae-211-22-119-160.ngrok-free.app # Ngrok Domain name
ADMIN=                # your github username
DRONE_RPC_SECRET=     # Random secret key
  • 注意 DRONE_SERVER_HOST 不需要 https

DRONE_RPC_SECRET 可以請 GPT 產生給你。

2. 再新增 docker-compose.yml,貼上下面的程式碼:

version: '2'

services: 
  drone-server:
    image: drone/drone:2
    ports:
        - "8080:80"
    volumes:
        - ${DRONE_DATA}:/data
        - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
        - DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
        - DRONE_SERVER_HOST=${DRONE_SERVER_HOST}
        - DRONE_SERVER_PROTO=https
        - DRONE_USER_CREATE=username:${ADMIN},admin:true
        - DRONE_RUNNER_CAPACITY=2
        - DRONE_GIT_ALWAYS_AUTH=true
        # Github Config
        - DRONE_GITHUB_SERVER=https://github.com
        - DRONE_GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
        - DRONE_GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
        - DRONE_LOGS_DEBUG=true
        - DRONE_LOGS_TEXT=true

  drone-runner:
    container_name: drone-runner
    image: drone/drone-runner-docker:1
    restart: unless-stopped
    depends_on:
        - drone-server
    environment:
        - DRONE_RPC_PROTO=http
        - DRONE_RPC_HOST=drone-server
        - DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
        - DRONE_RUNNER_NAME="drone-test-runner"
        - DRONE_RUNNER_CAPACITY=1
        - DRONE_DEBUG=true
        - DRONE_TRACE=false
    ports:
    - "3000:3000"
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock

建立 Drone Pipeline

Drone 的 Pipeline 就是根據 .drone.yml 檔案設定的,它特別的地方是每個 Pipeline 都是在不同的 Container 上執行的,環境完全獨立。

我們先建立它,這邊我們用個簡單的範例,使用 Flake8 這個套件,他是 Python 的程式碼檢查工具,可以幫助我們檢測程式碼的排版。

kind: pipeline
name: drone-test
platform:
  os: linux
  arch: arm64

steps:
  - name: setup-python
    image: python:3.8.7
    commands:
      - python -m venv /drone/src/venv
      - . /drone/src/venv/bin/activate
      - pip install -U pip setuptools flake8
    volumes:
      - name: venv_cache
        path: /drone/src/venv

  - name: lint
    image: python:3.8.7
    commands:
      - . /drone/src/venv/bin/activate
      - cd src
      - flake8 .
    volumes:
      - name: venv_cache
        path: /drone/src/venv
    when:
      event:
        - push
        - pull_request

volumes:
  - name: venv_cache
    host:
      path: /tmp/cache/drone/venv

我們先建立一個虛擬環境,並安裝要用到的套件,Lint 的觸發條件是我們將程式碼推送 (Push) 或 PR Merge 的時候,而 main.py 就是我們要檢查的檔案。

先推送到 Github。

git init
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/<your_username>/<your_repo_name>.git
git push -u origin main
image

啟動 Drone Server

1. 推送成功後讓我們啟動 Docker 運行指令:

docker compose up -d

2. 這時候我們在網站上輸入 Ngrok URL,可以看到 Drone 已經啟動成功了。

Capture 2024 11 03 161315

3. 點擊 CONTINUE,來到登入畫面,Email 可以隨意輸入,Full Name 必須輸入擁有 admin 帳號的使用者名稱 ( 也就是剛剛 .env 輸入的 ADMIN 參數 ),才會看到後面要設定的選項。

drone-login-page

4. 登入成功後,在 Build 頁面可以看到我們剛剛建立的 Github Repo,如果沒有的話可以點選右上角的「Sync」。

截圖 2024 11 03 16.21.13

5. 點擊 “ACTIVATE REPOSITORY”,這個步驟就是建立 Drone 和 Github 的 Webhook。

截圖 2024 10 23 14.03.52

Drone 設定

將 Project Settings 設定為 Trusted,以防 Drone 在運行的時候權限不足。

drone-setting-page

我們在專案裡建立 main.py 檔案,貼上程式碼。

mkdir src  # Create a directory
touch src/main.py  # Create file
# src/main.py

def test(a,b):
    return a+b

先來確定一下專案結構,避免推送後檢測不到程式碼。

├── src/
│   └── main.py
├── docker-compose.yml
├── .drone.yml
└── .env

main.py 推送到 Github。

git add .
git commit -m "add main file"
git push

觸發 Webhook 後,Drone 就可以看到這此推送的結果顯示失敗,代表 flake8 檢查沒有通過。

截圖 2024 11 03 17.09.09

於是我們修改 main.py 讓他符合格式,再 Push 一次:

def test(a, b):
  return a + b

可以看到這次通過了!

截圖 2024 11 03 17.15.52

總結

今天我們完成了 Drone CI 的基礎程式碼檢查配置,其實 Drone 還提供了許多功能,例如:

  • 資料庫整合測試自動化
  • 單元測試與整合測試的並行執行
  • Pipeline 快取機制,保存 Drone 的運行環境,不需要每次 Push 都建立一次環境

如果你想要更快建立,可以到我的 Github 複製下來直接使用喔!