DroneCI 串接流程 (2) - CD 建置

上一篇: DroneCI 串接流程 (1) - CI 建置

在上一篇,我介紹了如何在自己的 Server 上架設 Drone 的主機,並與 Bitbucket 串接,從測試到專案建置、再到 Docker 的整合。到這裡我們已經完成了 CI 的部分,在第二個章節,我會跟大家分享如何繼續搭配 Drone 建置後續的 CD 流程。

Outline

  • CD 流程設想
  • Drone Agent 架設
  • Drone Secret 管理
  • 使用 drone-ssh plugin 部署新版本

CD 流程設想 (Continuous Delivery )

目前我們已經有了第一台 Drone Server ,後續其實可以再多架 Agent Server,而在跑 CI 測試流程的時候,可以把不同的 Pipeline 交給不同的主機去跑。指定 Pipeline 的設定一樣可以單單只由 drone.yml 完成。

在後面的章節中我們也會講到如何透過 Drone 來管理機密資訊,讓這些 Service 用到的密碼可以被隱蔽。而在所有的測試通過並跑完之後,我打算搭配 drone-ssh 這個套件來讓我能夠登入另一台 Server 並從 Docker Hub 上拉下最新版本的 Image 並完成部署:

以下是預計的架構裡面會需要的部分:

  • Drone (Master) Server : 最一開始架設,最主要專門 跑 Drone Pipeline 的 Server。
  • Drone Agent Server : 當 Pineline 需要做的事情比較多時用來幫忙分擔 Loading 的Server。
  • Secret 管理工具 : 有一些功能需要登入第三方服務的話,這個時候如果將密碼直些寫在 .drone.yml 檔案裡面(明文),那其實是非常不安全的行為,因此我們會需要工具來讓我們安全的在設定檔裡面使用這些密碼。
  • plugins/docker : Drone 裡面的 docker 插件, 使專案能夠快速推送新版至遠端 Docker Registry
  • drone-ssh : Drone 搭配的 ssh 工具,使專案能夠登入遠端另外一台主機執行寫好的指令

Agent Server 架設 ( 以Docker Compose 為例 )

Agent 的架設整體上可以分為幾個步驟:

  1. Agent Server 架設
  2. 設定 Agent Server 的 label 名稱 ,用以辨識
  3. 專案內 .drone.yml 檔案指定 跑 pipeline 的 Agent Server

補充:由於 Drone 的 Master 跟 Agent 之間是透過 RPC 溝通的,所以在啟動 Master 及 Agent 的 Container 時,記得要加上 RPC Token 相關的設定,這點可以參考 官方文件

Agent Server 架設- Docker Compose File :

基本上 Drone Agent 的架設跟第一章節提到的 Master Server 的設定相去不遠,差別只在使用的 Image 不同,其他部分 Drone 都幫我們做好了,我們只要提供相關的 RPC Token 再設定好 Server 的 Label ,以方便後面指定即可。

    version: "2.0"
    
    services:
      drone-agent:
        image: drone/agent
        restart: always
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        environment:
          DRONE_RPC_PROTO: http
          DRONE_RPC_HOST: 125.227.167.242:5999
          DRONE_RPC_SECRET: c5b06c767123123ddd763b8e8
          DRONE_RUNNER_CAPACITY: 2
          DRONE_RUNNER_NAME: drone-agent-130
          DRONE_RUNNER_LABELS: hostname:drone-agent-130

重要參數說明 :

  1. DRONE_RPC_HOST : Drone Master Server 的位置,Agent才知道要聽誰的話
  2. DRONE_RUNNER_LABELS : 用來指定 Pipeline 的識別名稱,預設是主機名。
  3. DRONE_RPC_SECRET: 與 Drone Master Server 溝通的 Token ,用來讓兩邊互相溝通,Master 端也會有相同的設定,可以用以下指令來產生 Token :
        openssl rand -hex 16

其他 Agent 相關參數說明可以參考官方文件

寫好相關設定之後就可以透過 docker-compose 啟動 container 囉!

     docker-compose up -d ./docker-compose.yml

Drone Secret 管理

Drone 內建就有 Secret 管理功能,你也可以自己架第三方的工具,如 Vault 或是 AWS Secret Manager 等…來管理,在每個 Drone 管理介面上 Repository 的 Setting 點進去之後,就可以很快找到 Secret 管理的區塊,只要輸入對應的 Secret ,後續就可以直接在 drone.yml 檔案裡面引用囉。

在 drone.yml 裡面使用 from_secret 關鍵字引用剛剛設定好的密碼:

使用 Drone SSH Plugin 部署新版本至遠端 Server

在所有流程的最後,我想要把測試完畢沒有問題的版本部署到正式環境上,我找到了一個適合的套件讓我能夠直接登入 Production 環境的主機並且執行寫好的指令,所以我只要直接從 Docker Registry 上拉下最新版並重新啟動,就完成了最後部署的部分!

到這邊我們已經從 CI 測試流程,推到 Docker 儲存庫,並且全程搭配 Drone 的 Secret Management ,所以我在寫 drone.yml 的設定時,如果有些插件必須使用密碼登入,這些資訊就能夠安全的被使用,不會輕易外流。最後使用 drone-ssh 插件,直接在 Production 環境上部署,完成 最簡單的一個 CI/CD 流程。

完整的 CI/CD 流程應該會隨著團隊專案規模而改變,例如中大型專案常常搭配 Git Flow 或是 Github Flow ,然後會搭配 PR 觸發測試,通過以後才推送到 Dev 環境,減少錯誤機率,不過把基本功能跟流程理過一次後,後面怎麼變化就看使用者的需求了,非常感謝大家看到最後,以後有發現有興趣或有需要的工具再上來跟大家分享囉!

參考文章

https://www.slideshare.net/Robert_McDermott/anatomy-of-a-continuous-integration-and-delivery-cicd-pipeline

# devOps
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×