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