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服務器connection refused,應該是端口問題,那就開放gogs端口。請確保gogs已經啟動。

sudo firewall-cmd --zone=public --add-port=10080/tcp --permanent
sudo firewall-cmd --reload

 

  登錄之后在drone面板先同步gogs代碼倉庫,選擇一個倉庫,在設置選項填寫之前生成的密鑰,保存設置之后,gogs倉庫會生成一個web hook

  由於之前已經配置好了gogs,進入項目倉庫,更新web鈎子,將推送地址加上drone服務器端口號

  更新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文件中的腳本

  然鵝構建卻一直pending...

 

  這個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腳本,終於成功。

 

  以上的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版本之前的文檔鏈接。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM