iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 28
0
Modern Web

Go into Web!系列 第 28

Day28 | CI/CD 的導入 - 環境篇

昨天講完基本的概念,今天就讓我們來建構基礎的 CI / CD 環境~

目標

今天預計會建立 giteadrone 這兩個工具,gitea 負責作為版本控制,而 drone 則是用來做 CI/CD

先備條件

docker

此次範例會使用到 dockerdocker-compose,如果沒有安裝的朋友可以參考 這裡

MariaDB

如果還沒有安裝的朋友可以參考一下連結

在 mariadb 內要建立兩個 db 分別為 giteadrone,可以透過以下指令

mysql -u <username> -p -h <ip> -e "create database gitea"
mysql -u <username> -p -h <ip> -e "create database drone"

Drone

什麼是 Drone

drone 是使用 golang 開發的 CI/CD 工具,最大的特點在於裡面進行的所有步驟都是 container base 的,因此每次執行時環境都是最乾淨的狀態。

Provider

provider 在 drone 裡的定義就是 source code 的來源,目前支援以下幾個

  • Github
  • GitLab
  • Gogs
  • Gitea
  • Bitbucket Cloud
  • Bitbucket Server

Runner

runner 為實際執行腳本的 container,由於 drone 是分散式的架構,因此 runner 可以安裝在不同的機器上。
目前支援以下 runner

Docker

將每一步都分成不同的 container 來運行

Kubernetes

將每一步都起不同的 pod 來運行

Exec

不適用於 container 的專案使用此 runner

SSH

透過 ssh 連線至遠端執行

設定檔

drone 使用 .drone.yml 來設定 CI/CD 的觸發條件與流程,也因為這個檔案是放在專案內的,因此可以跟著專案的版本進行修改,也就是可以加入版本控制。

安裝

這邊我們通過 docker-compose 來啟動 drone,首先建立一個名為 docker-compose.yml 的檔案並且輸入以下內容

version: "3.4"

安裝的部分會分成兩塊

  1. gitea
  2. drone server
  3. drone runner

gitea

gitea 的建立可以參考官方文件,在這裡面我們設定好 db 的相關連線,並且透過 volumes 將 container 內部的資料存放至外部作為持久化儲存。

  gitea:
    image: gitea/gitea:latest
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - ROOT_URL=http://<ip>:8888
      - DB_TYPE=mysql
      - DB_HOST=<ip>:3306
      - DB_NAME=gitea
      - DB_USER=<資料庫帳號>
      - DB_PASSWD=<資料庫密碼>
    restart: always
    volumes:
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - .gitea:/data
    ports:
      - "8888:3000"
      - "222:22"

drone server

server 的部分參考了 官方文件,對外設定成 8000 port,因為是結合 gitea,因此環境變數的部分都是採用 DRONE_GITEA_* 的參數,資料庫的部分用 mysql

  drone-server:
    image: drone/drone:1
    ports:
      - 8000:80
    volumes:
      - /drone:/var/lib/drone/
    restart: always
    depends_on:
      - gitea
    environment:
      - DRONE_GIT_ALWAYS_AUTH=false
      - DRONE_SERVER_HOST=${DRONE_SERVER_HOST}
      - DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO}
      - DRONE_GITEA_SERVER=0.4
      - DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID}
      - DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET}
      - DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
      - DRONE_AGENTS_ENABLED=true
      - DRONE_LOGS_PRETTY=true
      - DRONE_LOGS_COLOR=true
      - DRONE_DATABASE_DRIVER=mysql
      - DRONE_DATABASE_DATASOURCE=<資料庫使用者>:<資料庫密碼>@tcp(<ip>:3306)/drone?parseTime=true

在以上的設定中可以看到,我們將部分的參數挖空成 ${},這邊使用 .env 來儲存變數,因此可以建立 .env 檔案後加入以下內容

DRONE_SERVER_HOST=<ip>:8000
DRONE_SERVER_PROTO=http
DRONE_GITEA_SERVER=http://<ip>:8888/
DRONE_GITEA_CLIENT_ID=
DRONE_GITEA_CLIENT_SECRET=
DRONE_RPC_SECRET=test1234

關於 gitea 的 client idclient secret 的部分明天再來說明怎麼建立

drone runner

runnser 的部分就相對單純,將外部的 docker.sock mount 到 container 內部,由於 runnser 與 server 之間是使用 grpc 來溝通,因此要設定好相關的變數

  drone-agent:
    image: drone/agent:1
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_SERVER=http://drone-server
      - DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
      - DRONE_RUNNER_CAPACITY=3

啟動

我們可以通過 docker-compose up -d 的方式進行啟動,啟動過程如下

Starting drone_gitea_1 ... done
Starting drone_drone-server_1 ... done
Starting drone_drone-runner_1 ... done

測試

透過瀏覽器開啟 http://0.0.0.0:8888/install 後可以看到 gitea 的設定畫面如下

什麼都不用修改就可以直接移動到最下方點選「安裝 gitea」,安裝完成後可以看到以下畫面

按照自己的喜好註冊一組帳號即可

小結

drone 的部分現階段還看不到畫面,原因是還沒有設定 giteaclientsecret,這部分明天會多加說明~


上一篇
Day 27 | CI/CD 的導入 - 概念篇
下一篇
Day29 | CI/CD 的導入 - 設定篇
系列文
Go into Web!30

尚未有邦友留言

立即登入留言