本文通過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版本之前的文檔連結。