文章目錄
- 在CentOS7上安裝Drone搭建CI持續集成環境
- 前言
- 安裝前規劃
- 安裝過程
- 配置域名解析
- 安裝Docker
- 拉取Drone Server鏡像
- 添加GitHub OAuth Application
- 生成Drone RPC secret
- 啓動Drone Server
- 配置Nginx反向代理到Drone Server
- 爲Drone站點配置HTTPS
- 測試Drone Server
- 安裝和運行Drone Runner
- 激活項目
- 測試Drone Pipeline
- 測試Drone Pipeline for Java
- 在生產上安裝Drone
- 使用Docker Compose來安裝Drone
- 使用PostgresSQL替換默認內置的sqllite
- 讓Drone運行在集羣中,可以支持多個Job同時構建
- 讓Drone構建時使用Maven local repo加快構建
- 集成消息通知插件
- Drone特色功能
- Drone限制
- Troubleshooting
- Active repository validation failure
- 代碼變更後,沒有自動觸發Drone構建
- untrusted repositories cannot mount host volumes
- 參考文檔
在CentOS7上安裝Drone搭建CI持續集成環境
前言
在玩過GitLab + Jenkins後,最近準備來學習Drone CI/CD,看這個雲原生的CI Server能給我們帶來什麼驚喜。
安裝前規劃
- 測試服務器:CentOS7 64位,有互聯網訪問權限,有root權限;
- 代碼倉庫:考慮到已經非常熟悉GitLab和測試服務器資源有限,這次直接採用GitHub;
- CI Server:本次的主角 Drone CI/CD,採用最簡單的Docker安裝方式;
- 域名:在我個人網站上規劃一個二級域名
drone.xdevops.cn
- HTTPS:因爲要使用GitHub OAuth,必須使用HTTPS;
- Nginx:使用Nginx來做二級域名的反向代理;
- Pipeline:使用最簡單的Drone Docker Pipeline;
- 測試項目:使用我GitHub上的一個Java示例項目,主要測試Spring Boot的REST API功能;
安裝過程
配置域名解析
增加一條域名解析的A記錄,將drone.xdevops.cn
解析到服務器的公網IP。
安裝Docker
使用阿里雲Docker Yum源在線安裝Docker:
#!/usr/bin/env bash
# remove docker
sudo yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# step 1: 安裝必要的一些系統工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加軟件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新並安裝 Docker-CE
sudo yum makecache fast
sudo yum install -y docker-ce docker-ce-cli containerd.io
# Step 4: 開啓Docker服務
sudo systemctl enable docker
sudo systemctl start docker
參見:
拉取Drone Server鏡像
docker pull drone/drone:1
添加GitHub OAuth Application
-
登錄GitHub;
-
打開用戶設置(Settings),打開Developer settings / OAuth Apps;
-
新建一個OAuth App,輸入相關信息,比如:
# Application name xdevops-drone # Homepage URL https://drone.xdevops.cn # Authorization callback URL https://drone.xdevops.cn/login
-
複製Client ID和Client Secret,後面啓動Drone Server時需要用到。
生成Drone RPC secret
生成Drone Server和Drone Runner的RPC通信用的secret:
openssl rand -hex 16
啓動Drone Server
創建一個start_drone_github_server.sh
腳本用來啓動Drone Server for GitHub:
#!/usr/bin/env bash
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_GITHUB_CLIENT_ID={{DRONE_GITHUB_CLIENT_ID}} \
--env=DRONE_GITHUB_CLIENT_SECRET={{DRONE_GITHUB_CLIENT_SECRET}} \
--env=DRONE_RPC_SECRET={{DRONE_RPC_SECRET}} \
--env=DRONE_SERVER_HOST=drone.xdevops.cn \
--env=DRONE_SERVER_PROTO=https \
--env=DRONE_USER_CREATE=username:{{DRONE_ADMIN}},machine:false,admin:true \
--publish=9080:80 \
--publish=9443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:1
說明:
{{DRONE_GITHUB_CLIENT_ID}}
和{{DRONE_GITHUB_CLIENT_SECRET}}
爲GitHub OAuth App的Client ID和Client Secret;{{DRONE_RPC_SECRET}}
爲上面生成的Drone RPC secret;DRONE_SERVER_HOST
爲Drone Server的域名或IP,這裏使用域名,注意域名前面不要寫http://
或https://
;{{DRONE_ADMIN}}
爲Drone系統管理員的賬號,在這個例子中爲GitHub賬號;--publish=9080:80
和--publish=9443:443
將容器內的80和443端口映射爲服務器的9080和9443端口。
運行bash start_drone_github_server.sh
來啓動Drone Server。
配置Nginx反向代理到Drone Server
在/etc/nginx/conf.d
下創建drone.xdevops.cn.conf
配置文件:
upstream drone_server {
server 127.0.0.1:9080;
}
server {
listen 80;
listen [::]:80;
server_name drone.xdevops.cn;
location / {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_pass http://drone_server;
proxy_redirect off;
proxy_http_version 1.1;
proxy_buffering off;
chunked_transfer_encoding off;
}
}
重新加載Nginx配置:
nginx -t
nginx -s reload
在瀏覽器中訪問http://drone.xdevops.cn,驗證是否可以正常訪問。
爲Drone站點配置HTTPS
因爲GitHub OAuth需要HTTPS,因此還需要爲Drone站點配置HTTPS。
如果已經安裝了certbot並且之前已經爲Nginx的其它站點配置過HTTPS,只需要運行下面的命令來爲Drone站點配置HTTPS:
sudo certbot --nginx -d drone.xdevops.cn
再驗證站點的HTTPS證書:
再在瀏覽器中打開https://drone.xdevops.cn來驗證是否可以正常訪問,以及瀏覽器是否正常識別HTTPS證書。
參見:
測試Drone Server
-
在瀏覽器中打開https://drone.xdevops.cn;
-
首次打開,需要登錄GitHub賬號來同意授權Drone訪問你的GitHub;
安裝和運行Drone Runner
採用Docker方式來運行Drone Runner。
拉取Drone Runner的Docker鏡像:
docker pull drone/drone-runner-docker:1
創建start_drone_docker_runner.sh
腳本來運行Drone Runner:
#!/usr/bin/env bash
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=https \
-e DRONE_RPC_HOST=drone.xdevops.cn \
-e DRONE_RPC_SECRET={{DRONE_RPC_SECRET}} \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=runner1 \
-p 3000:3000 \
--restart always \
--name drone-runner \
drone/drone-runner-docker:1
說明:
{{DRONE_RPC_SECRET}}
爲上面生成的Drone RPC secret;DRONE_SERVER_HOST
爲Drone Server的域名或IP,這裏使用域名,注意域名前面不要寫http://
或https://
;
運行bash start_drone_docker_runner.sh
來啓動Drone Runner。
激活項目
- 在Drone中激活需要構建的GitHub項目;
- 在Drone中,打開項目的Settings,設置Project visibility爲Private。
測試Drone Pipeline
在項目的根目錄下創建.drone.yml
,並push到GitHub。
kind: pipeline
type: docker
name: default
steps:
- name: greeting
image: alpine
commands:
- echo Hello, Drone!
- echo Happy Sunday!
在Drone中查看是否會自動觸發構建,並查看構建結果和日誌。
測試Drone Pipeline for Java
修改項目根目錄下的.drone.yml
,並push到GitHub。
kind: pipeline
type: docker
name: ci-java8
steps:
- name: build
image: maven:3-jdk-8
commands:
- mvn install -s settings.xml -B -U
在Drone中查看是否會自動觸發構建,並查看構建結果和日誌。
測試項目的根目錄有一個settings.xml,用來指向阿里雲Maven repo來拉取Maven依賴。
在生產上安裝Drone
和上面的安裝過程相似,但是需要考慮Drone的性能和高可用。
使用Docker Compose來安裝Drone
TODO
使用PostgresSQL替換默認內置的sqllite
TODO
讓Drone運行在集羣中,可以支持多個Job同時構建
TODO
讓Drone構建時使用Maven local repo加快構建
- 使用Drone系統管理員賬號(參見Drone Server中的
DRONE_USER_CREATE
參數配置)登錄Drone; - 打開Repository的Settings,在Project Settings中勾選“Trusted” (沒有看到Trusted選項,說明Drone Server中沒有配置正確的
DRONE_USER_CREATE
參數和指定正確的Drone系統管理員賬號); - 在
.drone.yml
中定義服務器上的持久卷目錄(比如/mnt/data/maven_local_repo
),將容器內的Maven local repo (默認爲/root/.m2
) 掛載到服務器上的該目錄,示例:
kind: pipeline
type: docker
name: ci-java8
volumes:
- name: maven_local_repo
host:
path: /mnt/data/maven_local_repo
steps:
- name: build
image: maven:3-jdk-8
volumes:
- name: maven_local_repo
path: /root/.m2
commands:
- mvn install -s settings.xml -B -U
集成消息通知插件
Drone通過插件可以在流水線中集成消息通知,比如郵件通知、釘釘通知、微信通知和企業微信通知,另外也可以支持Slack通知和RocketChat通知。
參見:
用Mailgun方式在Drone pipeline中集成SMTP郵件通知
Drone特色功能
在代碼庫中顯示構建狀態
將Drone提供的一段Markdown代碼段放在項目的README.md中,就可以在代碼庫中顯示代碼構建狀態:
[![Build Status](https://drone.xdevops.cn/api/badges/cookcodeblog/gs-rest-service-maven/status.svg)](https://drone.xdevops.cn/cookcodeblog/gs-rest-service-maven)
方便地支持多分支構建
與Jenkins相比,Drone可以更方便地支持多分支構建,只要將.drone.yml
文件放在該分支下,對該分支的改動會自動觸發使用該分支下的.drone.yml
來構建。
Drone限制
不能手工觸發構建,只能自動觸發構建
Drone不支持手工觸發構建,只能自動觸發構建(發生變更時,代碼庫通過Webhook通知Drone)。
但是可以在Drone中重跑(Restart)已有的構建。
參見:
Troubleshooting
Active repository validation failure
問題:在Drone中激活項目失敗
原因:瀏覽器F12調試時,發現HTTP 500錯誤,並且Remote Address爲127.0.0.1:10808。
解決方法:
- 修改Drone Server的啓動參數,指定正確的DRONE_SERVER_HOST和DRONE_SERVER_PROTO,比如:
--env=DRONE_SERVER_HOST=drone.xdevops.cn \
--env=DRONE_SERVER_PROTO=https \
- 重啓Drone Server。
代碼變更後,沒有自動觸發Drone構建
-
確保已經在代碼庫中編寫了
.drone.yml
(注意不是.drone.yaml
); -
確保已經安裝和運行了Drone Runner;
-
打開GitHub上的項目,打開Settings / Webhooks,檢查是否有Webhook觸發失敗的記錄,並手工更正Webhook的配置錯誤;
-
Drone不支持手工觸發,如果修改配置後,需要再次push代碼才能觸發構建。
untrusted repositories cannot mount host volumes
- 確保Drone的Repository Settings的Project settings中已經勾選了“Trusted”;
- 如果沒有看到“Trusted”選項,檢查Drone Server的啓動配置參數中有沒有配置了正確的
DRONE_USER_CREATE
參數,並指定了正確的Drone系統管理員賬號:
--env=DRONE_USER_CREATE=username:{{DRONE_ADMIN}},machine:false,admin:true \
如果Drone連接GitHub,則{{DRONE_ADMIN}}
爲GitHub賬號。
參見: