在CentOS7上安裝Drone搭建CI持續集成環境

在CentOS7上安裝Drone搭建CI持續集成環境

前言

在玩過GitLab + Jenkins後,最近準備來學習Drone CI/CD,看這個雲原生的CI Server能給我們帶來什麼驚喜。

安裝前規劃

  1. 測試服務器:CentOS7 64位,有互聯網訪問權限,有root權限;
  2. 代碼倉庫:考慮到已經非常熟悉GitLab和測試服務器資源有限,這次直接採用GitHub;
  3. CI Server:本次的主角 Drone CI/CD,採用最簡單的Docker安裝方式;
  4. 域名:在我個人網站上規劃一個二級域名drone.xdevops.cn
  5. HTTPS:因爲要使用GitHub OAuth,必須使用HTTPS;
  6. Nginx:使用Nginx來做二級域名的反向代理;
  7. Pipeline:使用最簡單的Drone Docker Pipeline;
  8. 測試項目:使用我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

  1. 登錄GitHub;

  2. 打開用戶設置(Settings),打開Developer settings / OAuth Apps;

  3. 新建一個OAuth App,輸入相關信息,比如:

    # Application name
    xdevops-drone
    
    # Homepage URL
    https://drone.xdevops.cn
    
    # Authorization callback URL
    https://drone.xdevops.cn/login
    
  4. 複製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

  1. 在瀏覽器中打開https://drone.xdevops.cn;

  2. 首次打開,需要登錄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。

激活項目

  1. 在Drone中激活需要構建的GitHub項目;
  2. 在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加快構建

  1. 使用Drone系統管理員賬號(參見Drone Server中的DRONE_USER_CREATE參數配置)登錄Drone;
  2. 打開Repository的Settings,在Project Settings中勾選“Trusted” (沒有看到Trusted選項,說明Drone Server中沒有配置正確的DRONE_USER_CREATE參數和指定正確的Drone系統管理員賬號);
  3. .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。

解決方法:

  1. 修改Drone Server的啓動參數,指定正確的DRONE_SERVER_HOST和DRONE_SERVER_PROTO,比如:
--env=DRONE_SERVER_HOST=drone.xdevops.cn \
--env=DRONE_SERVER_PROTO=https \
  1. 重啓Drone Server。

代碼變更後,沒有自動觸發Drone構建

  1. 確保已經在代碼庫中編寫了.drone.yml (注意不是.drone.yaml);

  2. 確保已經安裝和運行了Drone Runner;

  3. 打開GitHub上的項目,打開Settings / Webhooks,檢查是否有Webhook觸發失敗的記錄,並手工更正Webhook的配置錯誤;

  4. Drone不支持手工觸發,如果修改配置後,需要再次push代碼才能觸發構建。

untrusted repositories cannot mount host volumes

  1. 確保Drone的Repository Settings的Project settings中已經勾選了“Trusted”;
  2. 如果沒有看到“Trusted”選項,檢查Drone Server的啓動配置參數中有沒有配置了正確的DRONE_USER_CREATE參數,並指定了正確的Drone系統管理員賬號:
--env=DRONE_USER_CREATE=username:{{DRONE_ADMIN}},machine:false,admin:true \

如果Drone連接GitHub,則{{DRONE_ADMIN}}爲GitHub賬號。

參見:

參考文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章