再見 Jenkins !幾行腳本搞定自動化部署,這款神器有點厲害!


在開發或生產環境中,我們經常會搞一套自動化部署方案(俗稱一鍵部署)。比較流行的一種就是Gitlab+Jenkins實現方案,不過這種方案占用內存比較大,沒有個8G內存,很難流暢運行,而且部署起來也不快。最近發現一款神器Drone,輕量級CI/DI工具,結合Gogs使用內存占用不到1G,幾行腳本就能實現自動化部署,推薦給大家!

Drone簡介

Drone是一款基於容器技術的持續集成工具,使用簡單的YAML配置文件即可完成復雜的自動化構建、測試、部署任務,在Github上已經有22K+Star。

 

 

Gogs安裝

我們將使用輕量級的Gogs來搭建Git倉庫,這里只是簡單說下安裝步驟,具體使用可以參考https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247485177&idx=1&sn=4e8b4669e7164e2826232f74ea11938e&scene=21#wechat_redirect。

  • 首先需要下載Gogs的Docker鏡像;
docker pull gogs/gogs
 
  • 下載完成后在Docker容器中運行Gogs;  
docker run -p 10022:22 -p 10080:3000 --name=gogs \
-e TZ="Asia/Shanghai" \
-v /mydata/gogs:/data  \
-d gogs/gogs

 

  • Gogs運行成功后,訪問Web頁面地址並注冊賬號:http://192.168.5.78:10080

 

 

  • 然后將我們的SpringBoot項目mall-tiny-drone的源碼上傳上去即可,項目地址:https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-drone

 

 

Drone安裝

接下來我們安裝下Drone,不愧是基於容器的CI/DI工具,使用Docker安裝很方便!

  • 首先下載Drone的Server和Runner的鏡像;
# Drone的Server
docker pull drone/drone
# Drone的Runner
docker pull drone/drone-runner-docker
 
  • 這里有個Server和Runner的概念,我們先來理解下;

    • Server:為Drone的管理提供了Web頁面,用於管理從Git上獲取的倉庫中的流水線任務。
    • Runner:一個單獨的守護進程,會輪詢Server,獲取需要執行的流水線任務,之后執行。
  • 接下來我們來安裝drone-server,使用如下命令即可;

docker run \
  -v /mydata/drone:/data \
  -e DRONE_AGENTS_ENABLED=true \
  -e DRONE_GOGS_SERVER=http://192.168.5.78:10080 \
  -e DRONE_RPC_SECRET=dronerpc666 \
  -e DRONE_SERVER_HOST=192.168.5.78:3080 \
  -e DRONE_SERVER_PROTO=http \
  -e DRONE_USER_CREATE=username:macro,admin:true \
  -e TZ="Asia/Shanghai" \
  -p 3080:80 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone
 
  • 這里的配置參數比較多,下面統一解釋下;

    • 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中注冊好。
  • 接下來安裝drone-runner-docker,當有需要執行的任務時,會啟動臨時的容器來執行流水線任務;

docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO=http \
  -e DRONE_RPC_HOST=192.168.5.78:3080 \
  -e DRONE_RPC_SECRET=dronerpc666 \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME=runner-docker \
  -e TZ="Asia/Shanghai" \
  -p 3000:3000 \
  --restart always \
  --name runner-docker \
  drone/drone-runner-docker
 
  • 這里的配置參數比較多,下面統一解釋下。
    • 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中注冊的賬號),訪問地址:http://192.168.5.78:3080/

 

 

  • 此時我們在Gogs中的項目會現在在列表中,如果沒有的話可以點下SYNC按鈕;

 

 

  • 接下來我們需要對倉庫進行設置,將倉庫設置為Trusted(否則Drone創建的容器無法掛載目錄到宿主機),最后點擊SAVE按鈕保存;

 

 

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

 

 

  • 拉到最下面,我們可以發送一個測試推送,推送成功會顯示綠色的√;

 

 

  • 此時我們在Drone中發現其實流水線執行失敗了,那是因為我們在腳本中引用了Secret中的ssh_password

 

 

  • 在倉庫的設置中添加一個Secret即可,Secret是專門用來存儲密碼的,此密碼只能被使用或刪除,無法被查看;

 

 

  • ACTIVITY FEED中使用RESTART可以重新執行該流水線,發現已經成功執行。

 

 

編寫腳本

當我們向Git倉庫Push代碼時,會自動觸發Web鈎子,然后Drone就會從Git倉庫Clone代碼,再通過項目目錄下的.drone.yml配置,執行相應的流水線,接下來我們來看看這個腳本是如何寫的。

  • 首先我們來了解下在.drone.yml中配置的工作流都有哪些操作,看下流程圖就知道了;

 

 

  • 再來一個完整的.drone.yml,配上詳細的注解,看下就基本懂了!
kind: pipeline # 定義對象類型,還有secret和signature兩種類型
type: docker # 定義流水線類型,還有kubernetes、exec、ssh等類型
name: mall-tiny-drone # 定義流水線名稱

steps: # 定義流水線執行步驟,這些步驟將順序執行
  - name: package # 流水線名稱
    image: maven:3-jdk-8 # 定義創建容器的Docker鏡像
    volumes: # 將容器內目錄掛載到宿主機,倉庫需要開啟Trusted設置
      - name: maven-cache
        path: /root/.m2 # 將maven下載依賴的目錄掛載出來,防止重復下載
      - name: maven-build
        path: /app/build # 將應用打包好的Jar和執行腳本掛載出來
    commands: # 定義在Docker容器中執行的shell命令
      - mvn clean package # 應用打包命令
      - cp target/mall-tiny-drone-1.0-SNAPSHOT.jar /app/build/mall-tiny-drone-1.0-SNAPSHOT.jar
      - cp Dockerfile /app/build/Dockerfile
      - cp run.sh /app/build/run.sh

  - name: build-start
    image: appleboy/drone-ssh # SSH工具鏡像
    settings:
      host: 192.168.5.78 # 遠程連接地址
      username: root # 遠程連接賬號
      password:
        from_secret: ssh_password # 從Secret中讀取SSH密碼
      port: 22 # 遠程連接端口
      command_timeout: 5m # 遠程執行命令超時時間
      script:
        - cd /mydata/maven/build # 進入宿主機構建目錄
        - chmod +x run.sh # 更改為可執行腳本
        - ./run.sh # 運行腳本打包應用鏡像並運行

volumes: # 定義流水線掛載目錄,用於共享數據
  - name: maven-build
    host:
      path: /mydata/maven/build # 從宿主機中掛載的目錄
  - name: maven-cache
    host:
      path: /mydata/maven/cache

 

  • run.sh執行腳本可以實現打包應用和運行容器鏡像,之前講過這里就不再贅述了,具體可以參考https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247485031&idx=2&sn=38ee903435b46a9708ab24c9e0bc9b60&scene=21#wechat_redirect,運行成功效果如下。

 

 

總結

對比Jenkins復雜的圖形化界面操作,Drone使用腳本來定義流水線任務無疑更簡單、更直觀。Drone更加輕量級,內存占用少且響應速度快!自動化部署要啥Jenkins?直接給Git整個CI/DI功能難道不香么?

參考資料

  • 官方文檔:https://docs.drone.io/
  • 結合Maven使用:https://docs.drone.io/pipeline/kubernetes/examples/language/maven/
  • 結合SSH使用:http://plugins.drone.io/appleboy/drone-ssh/
  • 將容器目錄掛載到宿主機:https://docs.drone.io/pipeline/docker/syntax/volumes/host/

轉自https://mp.weixin.qq.com/s/IE8TD4x-BKdobiTrBdLAiw


免責聲明!

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



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