2020年10月19日 星期一

史上最齊全最詳細的Drone自動化教學文件 (1)

史上最齊全最詳細的Drone自動化教學文件


 先說這是殺人標題無誤XD

在Google關於如何建置CI/CD的Drone過程中,雖然不管國內外都找得到技術部落格的相關資訊,甚至也有網路課程,但不是版本太舊,就是許多關鍵細節沒交待清楚。

於是我在整理資訊,並且花了許多時間測試,在最後終於建置成功後,便自己做了教學文件,讓日後的我可以查詢或是其他人Google的時候找得到資料,如果有錯誤資訊也歡迎網友指正!

原文我寫在hackmd,連結在此


概述

Drone可以協助開發者commit code之後,自動將code佈署到主機,並且將佈署結果自動發布通知給相關人員,減少人為執行重複佈署的工作。

但在建立Drone之前,需要清楚該主機作為client或是server的角色,不然很容易搞混SSL/TLS Key的授權。

以下為簡單Drone流程圖

建立Drone自動化,關鍵步驟在於:

  • 清楚知道現在設定的主機是流程圖的哪個角色
  • 確認主機是Server or Client
  • 建立SSL/TLS Key免密碼登入(最重要!!)

透過SSL Key建立主機之間的連接

Drone Server與Drone Runner

Drone Server需要將Trigger訊號送至Drone Runner,所以在SSL Key的角色為Client Side, 因此要將Drone Server的帳號(比如root)的SSL Key加到Drone Runner。

Drone Server

  1. 切換成root身份

sudo su

  1. 確認SSL Key(Public Key)

ls ~/.ssh/id_rsa.pub

如果不存在就自己建立一組公私鑰:

ssh-keygen -t rsa

不設phrasepassword,後面直接Enter確定。

  1. Copy公鑰內容到Server端(Drone Runner)

ssh-copy-id centos@1.2.3.4

接著輸入Runner主機的密碼,日後即可不透過輸入密碼就能登入。
(Drone運作過程中若需要輸入帳密,佈署流程就會被中斷)

  1. 測試無密碼登入
    測試登入,應該不會出現要求輸入密碼。如果有,則使用手動方式,將公鑰加入到Server主機的authorized_keys。

ssh centos@1.2.3.4

!!注意!! 在進行SSL KEY配對之前,要確認你是用什麼使用者身份登入對方主機再做KEY配對
比如 Client: root, Server: centos

就要在client side的主機,尋找root的Public Key,並且加到server side的centos使用者的~/.ssh/authorized_keys

如果沒有確認使用者身份,很容易混亂,加錯Key,造成無法登入的問題。

Drone Runner

  1. 確認使用者是centos
  2. 確認SSL Key(Public Key)

vim ~/.ssh/authorized_keys

確認authorized_keys檔案有加入剛剛ssh-copy-id過來的Drone Server公鑰(id_rsa.pub)內容。

若是ssh-copy-id失敗,也可以使用手動複製client side的id_rsa.pub將內容貼到Server side的authorized_keys內

注意!若server與agent為跨外網的兩台主機,drone server需要建立對外的http server,若該主機已經有其他http server,需要更改預設80 port,URL指定至主機對外的IP,並且在Firewall設定Port Forwarding到內部主機。

Runner與Production

Runner需要驅動佈署到正式區主機(Production Server),所以也要建立Runner與Production的SSL連結。

Drone Runner(Agents)

  1. 切換成root身份

sudo su

  1. 確認SSL Key(Public Key)

ls ~/.ssh/id_rsa.pub

如果不存在就自己建立一組公私鑰:

ssh-keygen -t rsa

不設phrasepassword,後面直接Enter確定。

  1. Copy公鑰內容到Server端(Production Server)

ssh-copy-id root@5.6.7.8

接著輸入Runner主機的密碼,日後即可不透過輸入密碼就能登入。
(Drone運作過程中若需要輸入帳密,佈署流程就會被中斷)

ssh root@5.6.7.8

測試登入,應該不會出現要求輸入密碼。如果有,則使用手動方式,將公鑰加入到Server主機的authorized_keys。

Production Server

  1. 切換成root

sudo su

  1. 確認SSL Key(Public Key)

vim ~/.ssh/authorized_keys

確認authorized_keys檔案有加入剛剛ssh-copy-id過來的runner公鑰(id_rsa.pub)內容。

若是ssh-copy-id失敗,也可以使用手動複製runner的id_rsa.pub將內容貼到Server side的authorized_keys內


Github(Bitbucket)與Production Server

Code佈署上去的Production Servers(以下簡稱PD)也需要與版控平台(Github, Bitbucket)建立佈署權限,相當於開發者將完成測試的codes從
Github Pull下來的動作,因此在自動佈署之前,需要完成從PD可自動從Github Pull下來的權限(不詢問密碼)。

Bitbucket

至Bitbucket專案資料夾,點擊Clone按鈕取得

xxxxx@bitbucket.org:/xxxxplatform/xxxx.git

的專案連結

Production Server

在需要的佈署的程式資料夾執行以下指令:

$ git init $ git remote add origin master $ git remote set-url origin abcdefg@bitbucket.org:/platform/xxxx.git $ sudo ssh -T abcdefg@bitbucket.org

在最後一步輸入你的Bitbucket密碼就可完成權限開通,之後在Drone對此資料夾做Pull的動作都不用再人工輸入密碼。

Github(Bitbucket)與Drone Server

Github(Bitbucket)的專案一旦收到更新,就會執行.drone.yml文件的內容,所以必須建立Runner與Github之間的金鑰連接,在執行過程才不會出錯。

Bitbucket

使用OAuth2.0與Bitbucket建立連結

  1. 登入Bitbucket

  2. 點擊你在Bitbucket的個人帳號選單 – All workspaces

  3. 選擇你個人的Workspaces

  4. 點擊Settings

  5. 點選OAuth consumers – Add consumers

參考設定
參考設定

注意,要預先設定給Drone Server使用的URL域名,如果只是要臨時測試用可使用ngrok 可以參考 這裡

  1. 紀錄Key and Secret

  2. 撰寫專案的.drone.yml

在你要佈署測試的專案內建立一個新檔案,檔名為.drone.yml,此檔案使用yaml格式撰寫如何將程式pull, test and deployment的流程。

設定Yml文件

專案pipeline的yml文件可參考官方文件 這裡
本案例以整合docker使用為主。並且使用appleboy/drone-ssh的Drone套件,將佈署流程寫在pipeline的yml檔內。

注意在yml文件內,ssh的登入使用key secret,避免密碼以明碼方式顯露。

請注意:在主機之間盡量不要用明碼顯示登入密碼,透過後台 UI 介面將密碼或者是金鑰內容儲存在 Secret 設定頁面,就可以使Runner與被佈署主機之間的通訊不因帳密問題而中止

參考設定(略)

Drone Server

  1. 在docker container目錄建立.env文件
  2. 將剛剛從Bitbucket紀錄的Key, Secret紀錄到.env file

TIPS:${DRONE_RPC_SECRET} 值可以用以下指令來產生 Token :

openssl rand -hex 16

之後把 .env 檔案放在與docker-compose.yml同一層的目錄即可。

參考設定

.env file:

(記得要放在跟docker-compose同一層目錄下)

DRONE_SERVER_HOST=drone.obolpay.com:1234
DRONE_SERVER_PROTO=http
DRONE_RPC_SECRET=111111111111
DRONE_BITBUCKET_CLIENT_ID=oooooooooooooo
DRONE_BITBUCKET_CLIENT_SECRET=12345678qwertyuasfdghzxcv          
安裝Drone Server

在設定Drone Server之前必須先安裝,安裝部份請參閱下個章節。


沒有留言:

張貼留言