Drone 相對於常見的 Jenkins,選中 Drone 的原因在於它非常簡潔,不像 Jenkins 那樣復雜,同時它擁有可以滿足基本需求的能力,並且提供了許多實用的插件。
而且 Jenkins 包含了大量的圖形化界面,雖然大而全,但是在有時候只想簡單的做一個 CI 的容器時就顯得有些笨重,本文簡單的介紹使用 docker 搭建 drone 項目,並發布一個 SpringBoot 的 Java 項目。
Drone 文檔給出了相對於不同git倉庫和部署方式的方案,支持的git倉庫有:GitHub,GitLab,Gitea,Gogs 等,本文使用 Gogs 倉庫
使用 Docker 安裝 Drone
首先下載 Drone 的 Server 和 Runner 的鏡像
docker pull drone/drone:2
docker pull drone/drone-runner-docker:1
Server:為 Drone 的管理提供了 Web 頁面,用於管理從 Git 上獲取的倉庫中的流水線任務
Runner:一個單獨的守護進程,會輪詢 Server,獲取需要執行的流水線任務,之后執行
安裝 drone-server
sudo docker run \
--volume=/home/cl/drone:/data \
--env=DRONE_AGENTS_ENABLED=true \
--env=DRONE_GOGS_SERVER=http://192.168.50.228:13000 \
--env=DRONE_RPC_SECRET=rpc_secret \
--env=DRONE_SERVER_HOST=192.168.50.228:3080 \
--env=DRONE_SERVER_PROTO=http \
--env=DRONE_USER_CREATE=username:chenglong,admin:true \
--publish=3080:80 \
--publish=443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:2
DRONE_GOGS_SERVER:用於配置 Gogs 服務地址
DRONE_RPC_SECRET:Drone 的共享秘鑰,用於驗證連接到 server 的 rpc 連接,server 和 runner 需要提供同樣的秘鑰
DRONE_SERVER_HOST:用於配置 Drone server 外部可訪問的地址
DRONE_SERVER_PROTO:用於配置 Drone server 外部可訪問的協議,必須是 http 或 https
DRONE_USER_CREATE:創建一個管理員賬號,該賬號需要在 Gogs 中注冊好,否則在后面無法將倉庫設置為Trusted
安裝 drone-runner-docker
sudo docker run --detach \
--volume=/var/run/docker.sock:/var/run/docker.sock \
--env=DRONE_RPC_PROTO=http \
--env=DRONE_RPC_HOST=192.168.50.228:3080 \
--env=DRONE_RPC_SECRET=rpc_secret \
--env=DRONE_RUNNER_CAPACITY=2 \
--env=DRONE_RUNNER_NAME=docker-runner \
--publish=3000:3000 \
--restart=always \
--name=runner \
drone/drone-runner-docker:1
DRONE_RPC_PROTO:用於配置連接到 Drone server 的協議,必須是 http 或 https
DRONE_RPC_HOST:用於配置 Drone server 的訪問地址,runner 會連接到 server 獲取流水線任務並執行
DRONE_RPC_SECRET:用於配置連接到 Drone server 的共享秘鑰
DRONE_RUNNER_CAPACITY:限制 runner 並發執行的流水線任務數量
DRONE_RUNNER_NAME:自定義 runner 的名稱
Drone 的使用
訪問下 Drone 的控制台頁面,第一次登錄需要輸入賬號密碼(在Gogs中注冊的賬號),訪問地址就是剛剛制定的 DRONE_SERVER_HOST 的地址。此時我們在Gogs中的項目會現在在列表中
點擊項目后點擊 Activate Repository

接下來我們需要對倉庫進行設置,將倉庫設置為 Trusted,最后點擊SAVE按鈕保存

保存成功后會在 Gogs 中自動配置一個 Web 鈎子,當我們推送代碼到 Gogs 中去時,會觸發這個鈎子,然后執行在 Drone 中的流水線任務

這里要注意,現在 Gogs 的 WebHooks 是沒有辦法測試的,點擊后會提示 io timeout,這是由於我們項目中還沒有配置 .drone.yml 文件導致的,添加后即可正常調用
剩下的就是 .drone.yml 腳本的編寫了,這個腳本要放在項目的根目錄下,我這里簡單的演示一下在項目的部署。
.drone.yml
kind: pipeline
type: docker
name: house-pipeline
steps:
- name: build image
image: maven:3-jdk-11
volumes:
- name: maven-cache
path: /root/.m2/repository
- name: maven-build
path: /app/build
commands:
- mvn install -DskipTests=true -Dmaven.javadoc.skip=true
- mv -f /drone/src/target/*.jar /app/build/house.jar
- name: build-start
image: appleboy/drone-ssh
settings:
host: 192.168.50.228
username: cl
password:
from_secret: ssh_password
port: 22
command_timeout: 5m
script:
- cd /home/cl/maven-build
- chmod +x run.sh
- sh run.sh
volumes:
- name: maven-cache
host:
path: /home/cl/repository
- name: maven-build
host:
path: /home/cl/maven-build
run.sh
#!/bin/bash
source /etc/profile
nohup java -jar -Xmx1024M -Xms256M -Duser.timezone=GMT+8 house.jar --server.port=5188 > house.log 2>&1 &
注意 yml 的語法,使用空格而不是 Tab 可以減少看不見的錯誤
在使用 shell 腳本發布項目的時候,如果提示 java command not found,需要先執行一下 source 一下環境變量,這樣就能正常使用了
簡單解釋一下 .drone.yml,具體的使用請參考官網 demo,這里不做詳細說明
掛載容器的 /root/.m2/repository 和 /app/build 到宿主機,方便重復使用 .m2 倉庫以及保存打包好的 jar 文件
使用 appleboy/drone-ssh 這個鏡像遠程到制定的服務器中,然后調用 shell 腳本發布項目
成果
配置好后,每當我提交代碼到指定分支后,drone 就會幫我們自動部署項目啦。

