歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~
介紹
Drone是一個流行的持續整合和交付平臺。它整合了許多流行的版本控制儲存庫服務,如GitHub,GitLab和Bitbucket,以監視程式碼更改並在提交時自動構建和測試更改。
在本教程中,我們將演示如何為您的設定完整的Drone持續整合環境。我們將配置受騰訊雲SSL保護的Nginx作為Drone的前端。加密對Drone Web介面的請求,並允許CI伺服器與原始碼伺服器安全地整合。
準備
要完成本教程,您需要一臺已經設定好可以使用sudo
命令的非root賬號的CentOS伺服器,並且已開啟防火牆。沒有伺服器的同學可以在這裡購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後在購買伺服器。
為了加密傳輸的內容,您還需要SSL證書,如何設定此證書**取決於你是否擁有可解析該伺服器的域名。
- 如果你有域名,保護你網站的最簡單方法是使用騰訊雲SSL證書服務,它提供免費的可信證書。騰訊雲SSL證書安裝操作指南進行設定。
- 如果你沒有域名,建議您先去這裡註冊一個域名,如果你只是使用此配置進行測試或個人使用,則可以使用自簽名證書,不需要購買域名。自簽名證書提供了相同型別的加密,但沒有域名驗證公告。關於自簽名證書,你可以參考為Apache建立自簽名SSL證書和如何為Nginx建立自簽名SSL證書這兩篇文章。您需要一個附加到CI伺服器的域名才能正確設定它。
同時,您還需要提前安裝好Docker、學會使用Docker Compose,並在你的伺服器上安裝好Nginx,學會配置SSL證書,具體教程如下:
- 如何在Ubuntu安裝Docker
- 如何在Ubuntu安裝Docker Compose:按照教程的第二步安裝Docker Compose。
- 如何在Ubuntu安裝Nginx:在伺服器上安裝Nginx。
- 如何使用Ubuntu的加密來保護Nginx:使用受信任的騰訊雲SSL證書保護Nginx。
完成上述教程後,您的Drone伺服器應具有:
- sudo為管理任務配置的使用者
- 啟用了UFW防火牆,阻止除埠22,80和443上的SSH,HTTP和HTTPS請求之外的所有連線。
- 已安裝Docker和Docker Compose。
- Nginx伺服器配置了由騰訊雲提供的SSL證書
接下來我們繼續安裝教程。
將程式新增到原始碼儲存庫
為了監視程式碼更改以觸發構建和測試階段,Drone將需要訪問您的原始碼儲存庫。Drone可以與GitHub,GitLab,Gogs,Bitbucket Cloud和Bitbucket Server整合。
在本教程中,我們將重點關注與GitHub儲存庫的整合,其他系統應該與本教程類似。如果您使用的是其他原始碼儲存庫,請按照上面的相應連結瞭解您需要的軟體特定配置。
首先訪問您的GitHub帳戶。點選右上角的使用者圖示,然後從下拉選單中選擇設定:
接下來,在螢幕左側的“ 開發人員設定”部分中找到OAuth應用程式項:
在隨後的頁面上,單擊“ 註冊新應用程式”:
接下來,您將看到OAuth申請登錄檔:
填寫以下欄位(這些欄位存在於GitHub上。其他儲存庫提供程式可能有不同的提示):
- 應用程式名稱:您選擇用於標識整合的名稱。如果您沒有特殊需求,“Drone”是一個不錯的選擇。
- 主頁URL:您的Drone伺服器的域名。在這裡使用
https://
,因為我們使用的是安全域。 - 應用程式描述:Drone的簡單描述及其目的。
- 授權回撥URL:這必須是
https://
,後跟Drone伺服器的域名,後跟/authorize
。如果我們的域名是example.com
,這個檔案將是。https://example.com/authorize
準備好後,單擊“ 註冊應用程式”。
在下一頁中,您將看到新應用程式的詳細資訊。我們需要的兩個專案是客戶端ID和客戶端金鑰:
複製這兩個值。我們需要這些將Drone連線到我們的GitHub帳戶。
拉取Drone Docker映象並準備配置
可以在伺服器上安裝和配置Drone。Drone作為Docker容器分發,因此如果我們在Docker Compose
檔案中使用它,它將自動下載。為了略微加快這個過程,我們可以提前下拉映象:
docker pull drone/drone:0.7
複製程式碼
Drone Docker映象是一個統一的容器,可以通過幾種不同的方式執行。我們將執行一個作為Drone伺服器執行的容器,該伺服器協調儲存庫訪問,託管Web UI並提供API。使用具有不同設定的相同映象,我們將另一個容器作為Drone代理執行,該代理負責從配置的儲存庫構建和測試軟體。
我們將使用Docker Compose在Drone主機上執行這兩個容器。首先建立一個配置目錄來儲存我們需要的檔案:
sudo mkdir /etc/drone
複製程式碼
接下來,我們將在其中建立一些檔案來配置我們的服務。
為Drone建立Docker Compose檔案
首先,在配置目錄中建立一個Docker Compose檔案:
sudo nano /etc/drone/docker-compose.yml
複製程式碼
我們將Docker Compose檔案格式標記為版本“3”。之後,我們將為上述兩種服務定義服務。
drone-server
服務將啟動偵聽8000
埠的主Drone伺服器容器。我們將主機的/var/lib/drone
目錄安裝在容器內,以便Drone可以保留其資料。我們將服務配置其自動重啟,並以我們將在/etc/drone/server.env
建立的檔案中定義的環境變數的形式讀取更詳細的配置說明。
drone-agent
服務使用相同的映象,從agent
命令開始。它接收來自主Drone伺服器例項的指令,因此雖然它不需要一般的網路訪問,但它確實需要在Drone服務之後啟動。它還需要訪問Docker的套接字檔案來啟動容器以執行實際的構建和測試步驟。與drone-server
服務一樣,此服務也將自動重啟並讀取/etc/drone/agent.env
檔案中的環境以進行其他配置。
使用以下Docker Compose檔案配置這兩個服務。注意檔案的YAML格式,因為縮排或格式化中的錯誤可能導致錯誤:
version: '3'
services:
drone-server:
image: drone/drone:0.7
ports:
- 127.0.0.1:8000:8000
volumes:
- /var/lib/drone:/var/lib/drone
restart: always
env_file:
- /etc/drone/server.env
drone-agent:
image: drone/drone:0.7
command: agent
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: always
env_file:
- /etc/drone/agent.env
複製程式碼
完成後,儲存並關閉Docker Compose檔案。
配置Drone伺服器的環境變數檔案
接下來,我們需要為的Docker Compose檔案中引用的Drone伺服器的環境變數檔案。
在開啟檔案之前,我們應該生成一個強金鑰來驗證代理和伺服器元件。雖然我們的設定將在同一臺伺服器上同時擁有這兩個元件,但隨著測試基礎架構的擴充套件,強大的金鑰至關重要。在命令列上,輸入以下命令生成金鑰:
LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 65 && echo
複製程式碼
此命令臨時將shell中的語言設定為有限的字元範圍。 然後它從/dev/urandom
獲取一個隨機位元組流,並進一步過濾掉任何非字母數字字元。我們將前65個字元作為關鍵字。
輸出看起來與此類似(不要複製下面的值!生成自己的!):
ERmA7xubDvTa8i0wYBlljc9yjT1NJPG7xOlZBwAdMAmBYL4RZE4QngxWcCLowk9KN
複製程式碼
複製生成的金鑰以在伺服器環境檔案中使用。建立一個新檔案/etc/drone/server.env
並在文字編輯器中開啟它:
sudo nano /etc/drone/server.env
複製程式碼
檔案內,我們定義Drone用於連線的環境變數以啟動服務,連線到儲存庫提供程式以及設定帳戶授權策略。您需要先從儲存庫提供程式複製的值才能正確填寫值。
首先,設定DRONE_HOST
和DRONE_SECRET
值。將DRONE_SECRET
設定為您在命令列上生成的金鑰。DRONE_HOST
設定通知Drone其可公開訪問的地址。 這應該是您的受騰訊雲保護的域名,前面是https://
。
# Service settings
DRONE_SECRET=secret_generated_on_command_line
DRONE_HOST=https://example.com
複製程式碼
接下來,我們將配置與VCS提供程式的整合,在我們的示例中為GitHub。適合您專案的設定可能會有所不同,具體取決於您的需求以及GitHub資產的組織方式。
我們將鎖定我們的Drone安裝並通過將DRONE_OPEN
設定為false
來禁用註冊。這意味著只有DRONE_ADMIN
中指定的GitHub帳戶名才能登入。
注意:如果您將協作者作為GitHub組織使用,最好將
DRONE_OPEN
設定為true
並將DRONE_ADMIN
替換為DRONE_ORGS
。DRONE_ORGS
設定允許您指定一個或多個允許其成員。Drone將限制註冊屬於這些組的使用者。
確保DRONE_ADMIN
包含您的GitHub帳戶名稱。
然後,通過將DRONE_GITHUB
設定為true
來啟用GitHub整合外掛。當我們註冊Drone應用程式時,我們將DRONE_GITHUB_CLIENT
和DRONE_GITHUB_SECRET
設定為我們從GitHub OAuth應用程式頁面複製的金鑰:
# Service settings
DRONE_SECRET=secret_generated_on_command_line
DRONE_HOST=https://example.com
# Registration settings
DRONE_OPEN=false
DRONE_ADMIN=sammytheshark
# GitHub Settings
DRONE_GITHUB=true
DRONE_GITHUB_CLIENT=Client_ID_from_GitHub
DRONE_GITHUB_SECRET=Client_Secret_from_GitHub
複製程式碼
我們已完成配置伺服器元件。在離開之前,複製DRONE_SECRET
檔案中的值。配置代理時,我們需要在下一節中設定相同的金鑰。完成後儲存並關閉檔案。
配置Drone Agent的環境變數檔案
接下來,我們將為Drone代理元件建立一個環境檔案。開啟新檔案以設定代理環境變數:
sudo nano /etc/drone/agent.env
複製程式碼
我們只需要定義兩個值。 DRONE_SECRET
將匹配sever.env
檔案中的配置。
DRONE_SERVER
設定將配置代理連線到Drone伺服器元件的方式。它將以wss://
協議字首開頭,表示連線將使用加密的Web套接字,後跟Drone伺服器的域名,並在末尾附加/ws/broker
:
DRONE_SECRET=secret_generated_on_command_line
DRONE_SERVER=wss://example.com/ws/broker
複製程式碼
完成後儲存並關閉檔案。
配置DRONE系統單元檔案
現在我們的配置檔案就位,我們可以定義一個systemd
單元檔案來管理Drone服務。
在/etc/systemd/system
目錄中開啟一個新的.service
檔案來配置服務:
sudo nano /etc/systemd/system/drone.service
複製程式碼
內部貼上以下內容:
[Unit]
Description=Drone server
After=docker.service nginx.service
[Service]
Restart=always
ExecStart=/usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml stop
[Install]
WantedBy=multi-user.target
複製程式碼
第一部分告訴systemd在Docker和Nginx可用後啟動此服務。第二部分告訴系統在發生故障時自動重啟服務。 然後,它使用Docker Compose和我們之前建立的配置檔案定義啟動和停止Drone服務的命令。最後,最後一節定義瞭如何使服務在引導時啟動。
完成後儲存並關閉檔案。
在我們啟動Drone服務之前,我們必須配置Nginx。Drone代理需要能夠連線到Drone伺服器,並且連線依賴於Nginx代理。
配置Nginx到代理請求到Drone
接下來,我們需要修改Nginx的配置以代理對Drone伺服器的請求。首先找到處理騰訊雲SSL的Nginx配置。通過輸入以下內容在所有已啟用的伺服器塊中搜尋server_name
屬性:
grep -R server_name /etc/nginx/sites-enabled
複製程式碼
/etc/nginx/sites-enabled/default: server_name example.com;
/etc/nginx/sites-enabled/default: return 301 https://$server_name$request_uri;
/etc/nginx/sites-enabled/default: server_name example.com;
/etc/nginx/sites-enabled/default:# server_name example.com;
複製程式碼
在上面的輸出中,域名(在此例項中為example.com
)正在/etc/nginx/sites-enabled/default
檔案中定義。 您需要編輯與您的域名關聯的檔案。
您可能也會看到類似這樣的內容:
/etc/nginx/sites-enabled/default: server_name _;
/etc/nginx/sites-enabled/default: return 301 https://$server_name$request_uri;
/etc/nginx/sites-enabled/default: server_name _;
/etc/nginx/sites-enabled/default:# server_name example.com;
複製程式碼
在上面的輸出中,server_name _
; 表示用作後備機制的伺服器塊。“_
”主機說明符是無效的主機,因此它永遠不會匹配。
在配置中,這些配置與listen
指令配對,後者設定default_server
選項,以便當請求的主機與其他的伺服器塊不匹配時,將充當預設值。如果找不到與您的域名匹配的server_name
定義,則應使用定義這些回退塊的檔案。
在文字編輯器中開啟與您的域最相關的檔案:
sudo nano /etc/nginx/sites-enabled/default
複製程式碼
在內部,我們將首先在現有server塊之外新增兩個部分:
upstream drone {
server 127.0.0.1:8000;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
. . .
複製程式碼
第一個塊配置一個名為drone
的上游請求,我們可以在其中代理請求。server
指令定義瞭如何連線到我們的Drone服務,該服務將在埠8000上執行。
第二個塊根據$connection_upgrade
變數的值設定一個名為$http_upgrade
的使用者定義變數,Nginx在收到“Upgrade”HTTP標頭時設定該變數。如果收到Upgrade頭,Nginx將設定$connection_upgrade
變數進行升級。如果沒有,它將設定為關閉。 這些變數允許我們在代理WebSocket請求時設定正確的標頭。
接下來,找到包含listen 443
指令的伺服器塊。 使用以下指令替換內容。確保註釋掉或刪除該塊中的任何現有配置以避免衝突:
. . .
server {
listen 443 ssl;
. . .
location / {
# try_files $uri $uri/ =404;
proxy_pass http://drone;
include proxy_params;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_redirect off;
proxy_http_version 1.1;
proxy_buffering off;
chunked_transfer_encoding off;
proxy_read_timeout 86400;
}
. . .
}
複製程式碼
proxy_pass
行告訴Nginx將此塊之外的所有流量傳遞給我們之前定義的上游。接下來,我們在proxy_params
檔案中包含一些代理頭定義,並根據之前的地圖設定新增其他頭。然後,我們調整一些其他特定於代理的設定,以確保WebSocket代理正常工作,並確保我們的元件可以有效地進行通訊。
完成儲存並關閉檔案後。
測試並重新啟動Nginx和Drone
我們的配置現已完成。我們只需啟動或重啟我們的服務即可實現配置。
首先,檢查Nginx配置是否存在語法錯誤:
sudo nginx -t
複製程式碼
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
複製程式碼
如果輸出指示存在配置問題,請返回並再次檢查Nginx配置。重新啟動Nginx:
sudo systemctl restart nginx
複製程式碼
現在Nginx可用於代理和伺服器之間的代理請求,我們可以啟動Drone:
sudo systemctl start drone
複製程式碼
檢查以確保服務能夠成功啟動:
sudo systemctl status drone
複製程式碼
● drone.service - Drone server
Loaded: loaded (/etc/systemd/system/drone.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2017-06-09 21:56:33 UTC; 2min 58s ago
Main PID: 15225 (docker-compose)
Tasks: 5
Memory: 37.7M
CPU: 1.544s
CGroup: /system.slice/drone.service
├─15225 /usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml up
└─15228 /usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml up
. . .
Jun 09 21:56:35 drone docker-compose[15225]: drone-agent_1 | pipeline: request next execution
複製程式碼
如果服務被標記為active (running)
並且日誌中沒有錯誤,則Drone已啟動並正在執行。
如果遇到問題,可以輸入以下命令檢查Nginx日誌:
sudo less /var/log/nginx/error.log
複製程式碼
您可以通過輸入以下內容來檢查Drone日誌:
sudo journalctl -u drone
複製程式碼
如果一切正常執行,請通過輸入以下內容啟用Drone:
sudo systemctl enable drone
複製程式碼
在Docker和Nginx服務可用後,Drone服務將啟動。
登入Drone以授權訪問您的儲存庫
現在Drone已啟動並執行,我們可以登入Web介面並授權應用程式使用我們的GitHub帳戶。
在Web瀏覽器中訪問伺服器的域名以檢視Drone Web介面:
https://example.com
複製程式碼
在您第一次訪問時,系統將提示您登入:
單擊登入使用您的GitHub帳戶向Drone進行身份驗證。如果您當前未登入GitHub,將首先指示您登入GitHub。
之後,系統將提示您允許Drone訪問您的GitHub帳戶:
檢視請求的許可權並進行任何調整後,單擊授權使用者名稱按鈕以授權Drone。
您將被重定向回您的Drone伺服器:
現在,您可以啟用和配置儲存庫以自動測試程式碼。
結論
在本教程中,我們將Drone設定為GitHub專案的持續整合和交付伺服器。我們將Drone設為處理身份驗證並偵聽來自我們的儲存庫的更改。我們還配置了一個可以執行測試和管理容器的Drone代理。我們還將Nginx配置為安全的反向代理。如果覺得自建太麻煩,不要著急,騰訊雲CCI持續整合服務即將開放,雲持續整合(Cloud Continuous Integration,CCI)為開發者提供支援多語言,多終端的持續整合服務,包含定時/手動啟動構建、檢視構建結果及日誌、支援快速分發交付、可擴充套件的自動化測試等功能,為專案的持續整合體系提供上游基礎服務,提升專案研發效率。 更多Linux教程請前往騰訊雲+社群學習更多知識。
參考文獻:《How To Install and Configure Drone on Ubuntu 16.04》
問答
相關閱讀
此文已由作者授權騰訊雲+社群釋出,原文連結:cloud.tencent.com/developer/a…
搜尋關注公眾號「雲加社群」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社群!