使用 Docker & Drone 建立簡易自動部署流程 — Part1

John
9 min readJul 18, 2018

如果你曾經開發過需要經常更新版本的應用程式(如 API Service),每次把寫完的 code push 到 Git 後,通常還需要做以下這些事情:

  1. 將修改後的 Release 版本打包完成
  2. 連線到 Host VM 並停止原有服務
  3. 覆蓋原有的程式版本
  4. 重新啟動服務

其實一直以來我都是認命的這樣部署我的 Service 的,直到有一天因為專案有臨時的緊急需求,一整天重複做了快十次這樣的流程後,心裡突然有一個聲音告訴我:

John啊,你一定要做自動部署,你如果現在不出來做,連天公伯都不會原諒你!

剛好團隊近期也導入 Docker 做容器服務管理,在尋找了一些資料以及自動部署流程的教學後,便決定使用 Drone 這套服務來搭配之前已經建置在 Docker 上的 Gitea 版本控制系統來建立一套簡易的 Continuous Delivery 流程。

理想中的自動部署流程,大概是 Push 完 code 就可以泡咖啡等結果的概念。

為什麼選擇Drone?

  • 佔用記憶體資源少(僅約20MB)
  • 所有建置環境皆在 Docker 上實作,避免與系統互相干擾
  • 有多樣 Plugin 可供串接服務
  • 可與各種版本控制系統快速串接(GitHub、GitLab、Gitea、Gogs、Bitbucket 等)
  • 以簡易撰寫 yaml 檔案的方式定義部署流程

以下會詳細介紹從安裝 Docker 到將 Drone 執行為 Docker Container 提供未來部署使用的流程。

(提醒:以下的安裝步驟皆為在 Ubuntu Server 16.04 LTS 環境下安裝,若你的 OS 為 Windows 或 macOS,請參考 Docker 官方文件說明完成安裝。)

安裝Docker & Docker Compose

1. Update Package

$ sudo apt-get update

2. 安裝套件使 apt 可以使用 https 來源的 Repository

$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common

3. 加入 Docker 官方 GPG 金鑰

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4. 測試是否成功加入金鑰

$ sudo apt-key fingerprint 0EBFCD88

pub 4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22

如果成功,應會出現如上方的回應。

5. 將 Repository 設置為 stable 版本,並再次 Update Package

$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
$ sudo apt-get update

6. 安裝 Docker CE

$ sudo apt-get install docker-ce

7. 測試 Docker 是否正確安裝

$ sudo docker run hello-world

如果在Terminal中看到Hello from Docker!的歡迎訊息,則表示已經完成了Docker的安裝。

8. 將 Ubuntu 使用者加入 Docker Group

$ sudo usermod -aG docker $(whoami)

此指令可以讓之後使用Docker相關指令時不需再加上sudo,重新登入Ubuntu後即可使用。

9. 安裝 Docker Compose

$ sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

10. 給予 Docker Compose 執行權限

$ sudo chmod +x /usr/local/bin/docker-compose

11. 測試 Docker Compose 是否安裝成功

$ docker-compose --version
docker-compose version 1.21.2, build 1719ceb

如出現版本資訊,即為完成安裝。

安裝 Drone

由於 Drone 可搭配不同的版本控制系統進行自動部署流程,安裝方式也會有些許不同,以下範例為使用自行建立在 Docker 上的 Gitea 進行實作(可參考此連結於 Docker 安裝 Gitea)。若有不同版本控制系統的需求,可詳見Drone 官網文件下的 Integrations 安裝說明。

首先先建立一個名為 docker-compose.yml 的檔案:

$ vi docker-compose.yml

並寫入如下內容,並將 Gitea URL 及隨機密碼(可由此生成)填入

version: '2'

services:
drone-server:
image: drone/drone:0.8
ports:
- 80:8000
- 9000
volumes:
- /var/lib/drone:/var/lib/drone/
restart: always
environment:
- DRONE_OPEN=true
- DRONE_HOST=你的Drone Host
- DRONE_GITEA=true
- DRONE_GITEA_URL=你的Gitea Host
- DRONE_ADMIN=想設定為admin權限的Gitea帳號
- DRONE_SECRET=你的隨機密碼

drone-agent:
image: drone/drone:0.8
command: agent
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_SERVER=drone-server:9000
- DRONE_SECRET=你的隨機密碼

在這裡要注意的是,若你想將預設的 80 port 變更為其他的 port ,請一併變更 Drone Server 的 ports 以及 DRONE_HOST 參數。

EX.如想將 Drone Server 從 80 port 改為 8080 port ,則參數會如下所示:ports:
- 8080:8000
- 9000
environment:
- DRONE_HOST=${你的Drone Host}:8080

Compose 設定檔完成並儲存後,使用以下命令開啟 Drone Server & Agent:

$ docker-compose up -d

並使用瀏覽器開啟 Drone Web 介面,如果順利安裝完成會進入登入介面,請使用你的 Gitea 帳號密碼進行登入,進入後會看到如下的畫面:

請先將想使用 Drone 來控管部署流程的專案開啟,並進入專案設定中(右上角選擇 Settings),可看到可供設定的選項:

Repository Hooks 的選項為 Gitea 接收到何種動作時會觸發 Drone 動作,在這邊我們先使用預設的 push 及 pull request,並將 Project Settings 的 Trusted 打勾(需擁有 admin 權限的帳號才可開啟)。

安裝 Drone CLI

因 Drone Web 介面只有較為陽春的 Project 設定選項,如果想要設定比較細項的功能(如添加 Secret 變數等),必須使用 Command Line 工具與 Drone Server 進行互動。

首先請在 Terminal 中輸入以下指令完成安裝:

curl http://downloads.drone.io/release/linux/amd64/drone.tar.gz | tar zx
sudo install -t /usr/local/bin drone

安裝完成後,必須在系統的環境變數內添加 Drone Server 的 URL 及 Access Token,你可以在 Drone Web 介面右上角選單的 Token 頁面看到你的 Personal Access Token,並使用下面指令加入環境變數:

export DRONE_SERVER=你的Drone Server URL
export DRONE_TOKEN=你的Personan Access Token

完成後請使用下面指令確認 CLI 是否有正確連接到 Drone Server,若設定成功的話,CLI 會顯示你的帳號及 Email 資料。

$ drone info
User: stu60610
Email: stu60610@gmail.com

以上步驟為基礎安裝 Docker 及 Drone 的詳細說明,接下來的 Part 2 將會介紹如何將一個 Node.js 所撰寫的專案透過 Push 至 Gitea 後,自動完成測試 → 建置 → 發佈 → 部署至 Docker 的流程。

--

--