如果你曾經開發過需要經常更新版本的應用程式(如 API Service),每次把寫完的 code push 到 Git 後,通常還需要做以下這些事情:
- 將修改後的 Release 版本打包完成
- 連線到 Host VM 並停止原有服務
- 覆蓋原有的程式版本
- 重新啟動服務
其實一直以來我都是認命的這樣部署我的 Service 的,直到有一天因為專案有臨時的緊急需求,一整天重複做了快十次這樣的流程後,心裡突然有一個聲音告訴我:
John啊,你一定要做自動部署,你如果現在不出來做,連天公伯都不會原諒你!
剛好團隊近期也導入 Docker 做容器服務管理,在尋找了一些資料以及自動部署流程的教學後,便決定使用 Drone 這套服務來搭配之前已經建置在 Docker 上的 Gitea 版本控制系統來建立一套簡易的 Continuous Delivery 流程。
為什麼選擇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 的流程。