天天看點

Gogs + Drone 實作CI/CD(CI)

  本文通過docker-compose方式安裝運作drone,先将drone的server和agent鏡像拉取到本地,這樣docker-compose腳本執行速度會快一點。當然,不是必須先拉取drone鏡像,完全可以直接用docker-compose執行編寫好的腳本。

  拉取drone鏡像

sudo docker pull drone/drone:1.0.0-rc.5

sudo docker pull drone/agent:1.0.0-rc.5      

  安裝docker-compose,已安裝的話可跳過。

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose      

  需要建立一個目錄,在此目錄下編寫docker-compose.yml檔案,然後運作docker-compose指令

mkdir /etc/drone
vi /etc/drone/docker-compose.yml      

   docker-compose.yml内容如下:

version: '3'

services:
  drone-server:
    image: drone/drone:1.0.0-rc.5
    ports:
      - 10081:80
    volumes:
      - /var/lib/drone:/var/lib/drone
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    env_file:
      - /etc/drone/server.env

  drone-agent:
    image: drone/agent:1.0.0-rc.5
    command: agent
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    env_file:
      - /etc/drone/agent.env      

  生成drone和agent之間通信需要的密鑰

LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 65 && echo      

  此次生成的密鑰内容為:MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM

  在/etc/drone/目錄建立檔案server.env,儲存如下内容:

DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
DRONE_SERVER_HOST=192.168.1.137:10081
DRONE_SERVER_PROTO=http
DRONE_OPEN=true
DRONE_GOGS=true
DRONE_GOGS_SERVER=http://192.168.1.137:10080
DRONE_PROVIDER=gogs
DRONE_LOGS_TRACE=true
DRONE_LOGS_DEBUG=true      

  agent.env内容如下:

DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
DRONE_RPC_SERVER=http://192.168.1.137:10081
DRONE_LOGS_TRACE=true
DRONE_LOGS_DEBUG=true      

  通過指令啟動drone

docker-compose up -d      

  本地通路drone伺服器位址http://192.168.1.137:10081,用gogs賬号登入drone

Gogs + Drone 實作CI/CD(CI)

   登入失敗,gogs伺服器connection refused,應該是端口問題,那就開放gogs端口。請確定gogs已經啟動。

sudo firewall-cmd --zone=public --add-port=10080/tcp --permanent
sudo firewall-cmd --reload      
Gogs + Drone 實作CI/CD(CI)

  登入之後在drone面闆先同步gogs代碼倉庫,選擇一個倉庫,在設定選項填寫之前生成的密鑰,儲存設定之後,gogs倉庫會生成一個web hook

Gogs + Drone 實作CI/CD(CI)

  由于之前已經配置好了gogs,進入項目倉庫,更新web鈎子,将推送位址加上drone伺服器端口号

Gogs + Drone 實作CI/CD(CI)

  更新web hook之後,點選下面的測試推送,如果失敗提示connection refused的話,就開放drone的10081端口。

  為這個空倉庫新增.drone.yml檔案

kind: pipeline
name: greeting

steps:
- name: en
  image: alpine
  commands:
  - echo hello
  - echo world

- name: es
  image: alpine
  commands:
  - echo hola
  - echo mundo

- name: fr
  image: alpine
  commands:
  - echo bonjour
  - echo monde

- name: zh
  image: alpine
  commands:
  - echo 你好
  - echo 世界      

  送出到gogs倉庫後,自動觸發web hook事件,drone會執行yml檔案中的腳本

Gogs + Drone 實作CI/CD(CI)
Gogs + Drone 實作CI/CD(CI)

  然鵝建構卻一直pending...

Gogs + Drone 實作CI/CD(CI)

  這個drone.yml腳本比較簡單,隻是簡單的列印消息,然而不解的是不知道為什麼沒有輸出。不得其解就繼續翻官方文檔和各種issue以及網絡教程,沒什麼頭緒就把配置項盡可能寫全一點,發現原來是資料庫配置項的原因,drone預設使用sqlite做資料持久化,但是文檔也寫明說不需要額外的配置,但是按照目前的配置,雖然web hook可以觸發,但是pipeline任務一直處于pending狀态,加上資料庫配置項,終于有了動靜。

  雖然官方強烈建議使用postgres而不是mysql,但是既然drone支援使用mysql,而且我安裝的就是mysql,那當然是使用mysql配置項了。drone還強烈建議使用gitea而不是gogs呢。在server.env中加上下面這兩行配置,mysql賬号密碼和ip改成自己的。

DRONE_DATABASE_DRIVER=mysql
DRONE_DATABASE_DATASOURCE=root:password@tcp(1.2.3.4:3306)/drone?parseTime=true      

  也可以使用下面的配置,會在配置路徑下産生sqlite腳本,drone産生的資料會儲存在這個腳本中。

- DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite
- DRONE_DATABASE_DRIVER=sqlite3      

  重新執行一下pipeline腳本,終于成功。

Gogs + Drone 實作CI/CD(CI)

  以上的docker-compose.yml也可以整合為一個檔案,貼一下内容,可供參考

version: '3'
services:
  drone-server:
    image: drone/drone:1.0.0-rc.5
    ports:
      - 10081:80
    volumes:
      - ./drone:/var/lib/drone/
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_OPEN=true
      - DRONE_SERVER_HOST=192.168.1.137:10081
      - DRONE_SERVER_PROTO=http
      - DRONE_LOGS_TRACE=true
      - DRONE_LOGS_DEBUG=true
      - DRONE_GOGS=true
      - DRONE_GOGS_SERVER=http://192.168.1.137:10080
      - DRONE_PROVIDER=gogs
      - DRONE_DATABASE_DATASOURCE=root:your_password@tcp(192.168.1.137:3306)/drone?parseTime=true
      - DRONE_DATABASE_DRIVER=mysql
      - DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
  drone-agent:
    image: drone/agent:1.0.0-rc.5
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_RPC_SERVER=http://192.168.1.137:10081
      - DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
      - DRONE_LOGS_TRACE=true
      - DRONE_LOGS_DEBUG=true      

  記錄一下可能會遇到的問題:

  1、web hook可以正常推送消息,而pipeline腳本一直pending,檢查drone-server的資料庫配置項;

  2、以非root使用者運作,可能會遇到docker權限問題,需要将目前使用者加入到docker使用者組,避免重新登入的話可以su root,然後再su目前使用者;

  3、pipeline腳本執行的時候抛出docker權限異常,需要将drone-agent挂載docker執行目錄。

  通過此番操作,已經實作了持續內建,要實作持續傳遞,關鍵在于.drone.yml的編寫,Deployment部分待下回推送代碼之後再做分享。

  順便說一下drone的文檔,1.0之前的文檔提供的安裝方式是docker compose,有中文文檔;1.0之後的文檔提供的安裝方式的使用docker,隻有英文版,不過好像斷層了,沒有提供1.0版本之前的文檔連結。