歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐干貨哦~
介紹
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》
問答
相關閱讀
此文已由作者授權騰訊雲+社區發布,原文鏈接:https://cloud.tencent.com/developer/article/1180481?fromSource=waitui
搜索關注公眾號「雲加社區」,第一時間獲取技術干貨,關注后回復1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社區!