Drone-比Jenkins更輕量化的持續集成部署工具


Drone 簡介

Drone 是一個基於Docker容器技術的可擴展的持續集成引擎,由GO語言編寫,可用於自動化測試與構建,甚至發布。每個構建都在一個臨時的Docker容器中執行,使開發人員能夠完全控制其構建環境並保證隔。相對於常見的Jenkins,選中 Drone的原因在於它非常簡潔,不像Jenkins那樣復雜,同時它擁有可以滿足基本需求的能力,並且提供了許多實用的插件,如GitHubEmail微信釘釘等。

Drone 官方地址:https://www.drone.io/

Drone 開源地址:https://github.com/harness/drone

由於本人是在公司內部服務器部署的,所以都是使用的HTTP部署。HTTPS部署詳見另一位大佬的文章:https://www.cnblogs.com/yan7/p/15881087.html

Drone 版本 2.9.1

Gitea 版本 1.17.6

Docker 版本 20.10.12

Harbor 版本 1.10.10

倉庫項目 .NET5

Drone CI-Gitea

Drone官方文檔 中支持的Git倉庫有很多種:

img

本文示例也選用相對Gitlab更輕量化的Gitea,演示Gitea版本為:1.17.6,Gitea部署不是本文重點,請移步其他文章。

創建OAuth2密鑰

登錄Gitea后,點擊右上角頭像選擇設置(如果沒設置選項,需要管理員權限):

image-20220226214337176

然后選擇 應用,在最下面創建OAuth2應用,填寫名稱和重定向URI:

image-20220226221003875

點擊創建后,會跳轉到這個頁面,記住 客戶端ID客戶端密鑰,后面部署Drone會用到,客戶端密鑰在退出本頁面時候就會顯示為*,所以尤其需要記住 客戶端密鑰,然后點擊保存。

image-20220226221048768

Docker-Compose部署

Drone 數據存儲默認使用 sqlite 數據庫。並且提供支持 postgresMySql

官方文檔中強烈建議使用 postgres 而非 mysql。 某些操作在 mysql 未得到優化。 https://docs.drone.io/server/storage/database/

PS: 支持 postgres9.6 及更高版本 、 mysql:5.6 及更高版本

DockerCompose.yml

# 在執行DockerCompose前,需要創建網絡 docker network create drone
version: '3.9'
# 創建自定義網絡
networks:
  drone:
    name: drone
    driver: bridge
services:
  # Drone的數據庫服務
  db:
    # 拉取的鏡像名稱和版本號
    image: postgres:latest
    # 容器名稱
    container_name: drone_db
    # 該容器隨Docker啟動而啟動
    restart: always
    # 加入到drone網絡
    networks:
      - drone 
    # 端口映射,左邊宿主機端口:右邊容器內部端口
    ports:
      - '7931:5432'
    environment:
      - POSTGRES_USER=drone # PGSQL默認用戶
      - POSTGRES_PASSWORD=drone # PGSQL默認密碼
      - POSTGRES_DB=drone # PGSQL默認數據庫
    volumes:
      # 數據持久性掛載宿主機 左邊宿主機路徑:右邊容器內路徑
      - /volumes/drone/db:/var/lib/postgresql/data
  # Drone Server 服務
  server:
    image: drone/drone:2.9.1 # 目前drone最新版本為 2.9.1
    container_name: drone_server
    # 該容器隨Docker啟動而啟動
    restart: always
    # 加入到drone網絡
    networks:
      - drone 
    # 端口映射,左邊宿主機端口:右邊容器內部端口
    ports:
      - '7929:80'
    environment:
      - DRONE_SERVER_PROTO=http # 訪問協議,創建webHooks和重定向 
      - DRONE_SERVER_HOST=192.168.2.7:7929 # 主機名稱,創建webHooks和重定向
      # 與 drone runner 通訊的密鑰 可以在 服務器(Linux) 中使用 openssl 生成密鑰 
      - DRONE_RPC_SECRET=e1ad8a7f3dbc68ca9c21bcc949335009 
      # 設置管理員賬戶,username和Gitea賬戶名稱需要一致
      - DRONE_USER_CREATE=username:young,admin:true 
      - DRONE_DATABASE_DRIVER=postgres # 數據庫類型
      - DRONE_DATABASE_DATASOURCE=postgres://drone:drone@db/drone?sslmode=disable # 數據庫連接
      - DRONE_GIT_ALWAYS_AUTH=true # 使用 oauth 身份驗證信息拉取代碼
      - DRONE_GITEA_SERVER=http://192.168.2.7:3000 # gitea服務器地址
      - DRONE_GITEA_CLIENT_ID=2c921d85-e40e-41f8-90e0-c77c383786b5 # gitea 客戶端 id 剛才創建的OAuth2的客戶端Id
      - DRONE_GITEA_CLIENT_SECRET=ZVZoRWK6jR5mqgAIm6sB5VX6C2LPK1sYKv4hQWyTdULu # gitea 客戶端 密鑰 剛才創建的OAuth2的客戶端密鑰
      - DRONE_GITEA_SKIP_VERIFY=false # 禁用 gitea 鏈接時 tls 驗證

    volumes:
     # 數據持久性掛載宿主機 左邊宿主機路徑:右邊容器內路徑
      - /volumes/drone/server:/data
      - /var/run/docker.sock:/var/run/docker.sock
     # 依賴的容器
    depends_on:
      - db
  # Drone Docker Runner
  runner:
    image: drone/drone-runner-docker:1.8.0 # 目前drone-runner-docker最新版本為 1.8.0
    container_name: drone_runner
    restart: always
    networks:
      - drone # 加入到drone網絡
    ports:
      - '7930:3000'
    environment:
      # 名稱
      - DRONE_RUNNER_NAME=docker-runner
      - DRONE_RUNNER_CAPACITY=10 # 限制runner可執行的並發管道數量 默認為2
      - DRONE_RPC_PROTO=http # 訪問drone server 協議
      - DRONE_RPC_HOST=server # 訪問drone server 服務器地址
      # 與 drone server 通訊的密鑰, 需與上面Server的 DRONE_RPC_SECRET 值相同
      - DRONE_RPC_SECRET=e1ad8a7f3dbc68ca9c21bcc949335009 
      - DRONE_UI_USERNAME=admin # Drone Runner 的 UI 用戶賬號
      - DRONE_UI_PASSWORD=qwe123 # Drone Runner 的 UI 用戶密碼
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock'
    depends_on:
      - server

將上述保存,文件名為:drone-docker-compose.yml

docker-compose 執行命令:

docker-compose -f drone-docker-compose.yml up -d 
# -f dockerfile文件名,不使用-f參數時,默認就為 docker-compose.yml
# -d 后台啟動並運行容器

如果未報錯,那么docker就啟動成功了,使用Portainer查看容器狀態:

image-20220302212127683

顯示都為running狀態。

部署成功后激活存儲庫

部署成功后,訪問7929端口的頁面:

image-20220302212242994

點擊Continue會自動跳轉到Gitea的授權頁面:

image-20220302223108364

如果你瀏覽器沒有登陸Gitea,會先讓你登陸:

image-20220302213120929

登陸且授權后,就會跳轉到Drone的頁面了,只需要授權一次即可,往后我們登錄了Gitea就直接進入Drone了。

進入Drone會看到未激活的倉庫,選擇需要激活的倉庫,然后我們點擊激活它:

image-20220302213332952

激活成功后,回到Gitea查看被激活的倉庫,就會看到倉庫已經自動的配置好了WebHook(Web鈎子):

image-20220302213525371

點擊鈎子,進去找到測試推送,點擊測試推送,如果出現如下綠色,那鈎子就沒問題了:

image-20220302213635423

踩坑小Tips:

如果是紅色,且HTTP相應內容包含context deadline exceeded (Client.Timeout exceeded while awaiting headers),請檢查你的倉庫根目錄是否存在Drone的.drone.yml配置文件,我就是這個配置文件放錯了地方卡了我大半天。。。

到這里我們的Drone就安裝完畢了,激活倉庫后,我們向倉庫推送一個commit,Gitea就會發送消息通知Drone去自動構建了!

配置Drone的自動構建

Drone支持不同環境的不同管道配置,這里我使用Docker Pipelines管道配置簡單來說就是Drone的每一步操作都在一個臨時的Drone的容器中進行,容器操作完會自動銷毀,容器之間會共享當前的工作目錄。

本人這里使用了私有鏡像倉庫 Harbor Harbor的搭建文章點擊此處。

Drone 配置文件 .drone.yml 如下:

kind: pipeline # 默認為 pipeline
type: docker 
name: deployment # 構建文件名稱

steps: # 數組結構,流水線化的構建步驟
# 步驟1 將鏡像推送到 Harbor
- name: publish 2 harbor
  pull: if-not-exists # 如果鏡像不存在則拉取,免去每次都要重新下載
  image: plugins/docker
  settings: 
    dockerfile: Demo/Dockerfile  # Dockerfile 在項目中的位置
    tags: latest # 生成鏡像后的Tag標簽
    insecure: true	# 是否不安全
    registry: 192.168.2.7:8088	# 私有鏡像倉庫地址
    repo: 192.168.2.7:8088/zhjs/drone-ci-demo   # 倉庫地址/Harbor項目名稱/自定義鏡像名稱
    username: 
     # 從drone倉庫配置中秘密空間讀取用戶名
      from_secret: docker_username
    password: 
    # 從drone倉庫配置中秘密空間讀取密碼
      from_secret: docker_password
# 步驟2 使用ssh訪問主機,拉去鏡像並運行部署
- name: deploy
  pull: if-not-exists # 如果鏡像不存在則拉取,免去每次都要重新下載
  image: appleboy/drone-ssh 
  settings:
   # 需要部署的主機地址
    host: 192.168.2.7
   # 主機ssh端口
    port: 22
    # 主機登陸用戶名
    username: root
    password: 
    # 從drone倉庫配置中秘密空間讀取密碼
      from_secret: ssh_pwd
    script: 
      - echo =========暫停並刪除舊容器========
      - docker stop drone-ci-demo-1 && docker rm drone-ci-demo-1
      - docker stop drone-ci-demo-2 && docker rm drone-ci-demo-2
      - echo =========刪除舊鏡像=============
      - docker rmi 192.168.2.7:8088/zhjs/drone-ci-demo:latest 
      - echo ========從harbor拉取最新鏡像========
      - docker pull 192.168.2.7:8088/zhjs/drone-ci-demo:latest 
      - echo ===============運行鏡像==========
      - docker run --name drone-ci-demo-1 -p 5555:80 -d 192.168.2.7:8088/zhjs/drone-ci-demo:latest
      - docker run --name drone-ci-demo-2 -p 5556:80 -d 192.168.2.7:8088/zhjs/drone-ci-demo:latest
      - echo ========部署成功========
  # 步驟3 部署完成,郵件通知
- name: notify
  pull: if-not-exists # 如果鏡像不存在則拉取,免去每次都要重新下載
  image: drillster/drone-email  
  settings:
    recipients_only: true # 只發送給指定郵件收件人,不默認發送給流水線創建人
    host: smtp.qq.com      #SMTP服務器 例如 smtp.qq.com  
    port: 465   #SMTP服務端口  例如QQ郵箱端口465
    subject: "Drone Build Complete!"  # 郵件主題內容
    username:   #郵箱用戶名
      from_secret: qqmail_username
    password:   #郵箱密碼
      from_secret: qqmail_pwd
    from: 
      from_secret: qqmail_username
    recipients:   #收件人 
      from_secret: email_recipients  #  格式:xxxx,xxxx
  when:    #執行條件 
    status: 
    - success
    - changed
    - failure 

文件編寫完成后,把代碼git push到倉庫中,Gitea會通知Drone進行部署,Drone找到.drone.yml配置文件,就會按照配置文件中的步驟進行構建了,部署期間可以在Drone中查看到每一步的部署情況

image-20220302222030963

image-20220308135516825

首次部署的速度可能略慢,最終部署成功圖:

image-20220308135932510

image-20220302224642834

總結:對於小團隊來說,總體是完全可以接受的,自動部署一旦配置好了,所有的編譯/測試/打包/部署的工作就交給Drone去完成了,而我們只需要專注於我們的代碼編寫就行了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM