入门系列之在Ubuntu上安装Drone持续集成环境
歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~
本文由小鐵匠米蘭的v 發(fā)表于云+社區(qū)專欄
介紹
Drone是一個(gè)流行的持續(xù)集成和交付平臺(tái)。它集成了許多流行的版本控制存儲(chǔ)庫服務(wù),如GitHub,GitLab和Bitbucket,以監(jiān)視代碼更改并在提交時(shí)自動(dòng)構(gòu)建和測試更改。
在本教程中,我們將演示如何為您的設(shè)置完整的Drone持續(xù)集成環(huán)境。我們將配置受騰訊云SSL保護(hù)的Nginx作為Drone的前端。加密對(duì)Drone Web界面的請(qǐng)求,并允許CI服務(wù)器與源代碼服務(wù)器安全地集成。
準(zhǔn)備
要完成本教程,您需要一臺(tái)已經(jīng)設(shè)置好可以使用sudo命令的非root賬號(hào)的CentOS服務(wù)器,并且已開啟防火墻。沒有服務(wù)器的同學(xué)可以在這里購買,不過我個(gè)人更推薦您使用免費(fèi)的騰訊云開發(fā)者實(shí)驗(yàn)室進(jìn)行試驗(yàn),學(xué)會(huì)安裝后在購買服務(wù)器。
為了加密傳輸?shù)膬?nèi)容,您還需要SSL證書,如何設(shè)置此證書**取決于你是否擁有可解析該服務(wù)器的域名。
- 如果你有域名,保護(hù)你網(wǎng)站的最簡單方法是使用騰訊云SSL證書服務(wù),它提供免費(fèi)的可信證書。騰訊云SSL證書安裝操作指南進(jìn)行設(shè)置。
- 如果你沒有域名,建議您先去這里注冊(cè)一個(gè)域名,如果你只是使用此配置進(jìn)行測試或個(gè)人使用,則可以使用自簽名證書,不需要購買域名。自簽名證書提供了相同類型的加密,但沒有域名驗(yàn)證公告。關(guān)于自簽名證書,你可以參考為Apache創(chuàng)建自簽名SSL證書和如何為Nginx創(chuàng)建自簽名SSL證書這兩篇文章。您需要一個(gè)附加到CI服務(wù)器的域名才能正確設(shè)置它。
同時(shí),您還需要提前安裝好Docker、學(xué)會(huì)使用Docker Compose,并在你的服務(wù)器上安裝好Nginx,學(xué)會(huì)配置SSL證書,具體教程如下:
- 如何在Ubuntu安裝Docker
- 如何在Ubuntu安裝Docker Compose:按照教程的第二步安裝Docker Compose。
- 如何在Ubuntu安裝Nginx:在服務(wù)器上安裝Nginx。
- 如何使用Ubuntu的加密來保護(hù)Nginx:使用受信任的騰訊云SSL證書保護(hù)Nginx。
完成上述教程后,您的Drone服務(wù)器應(yīng)具有:
- sudo為管理任務(wù)配置的用戶
- 啟用了UFW防火墻,阻止除端口22,80和443上的SSH,HTTP和HTTPS請(qǐng)求之外的所有連接。
- 已安裝Docker和Docker Compose。
- Nginx服務(wù)器配置了由騰訊云提供的SSL證書
接下來我們繼續(xù)安裝教程。
將程序添加到源碼存儲(chǔ)庫
為了監(jiān)視代碼更改以觸發(fā)構(gòu)建和測試階段,Drone將需要訪問您的源代碼存儲(chǔ)庫。Drone可以與GitHub,GitLab,Gogs,Bitbucket Cloud和Bitbucket Server集成。
在本教程中,我們將重點(diǎn)關(guān)注與GitHub存儲(chǔ)庫的集成,其他系統(tǒng)應(yīng)該與本教程類似。如果您使用的是其他源代碼存儲(chǔ)庫,請(qǐng)按照上面的相應(yīng)鏈接了解您需要的軟件特定配置。
首先訪問您的GitHub帳戶。點(diǎn)擊右上角的用戶圖標(biāo),然后從下拉菜單中選擇設(shè)置:
接下來,在屏幕左側(cè)的“ 開發(fā)人員設(shè)置”部分中找到OAuth應(yīng)用程序項(xiàng):
在隨后的頁面上,單擊“ 注冊(cè)新應(yīng)用程序”:
接下來,您將看到OAuth申請(qǐng)注冊(cè)表:
填寫以下字段(這些字段存在于GitHub上。其他存儲(chǔ)庫提供程序可能有不同的提示):
- 應(yīng)用程序名稱:您選擇用于標(biāo)識(shí)集成的名稱。如果您沒有特殊需求,“Drone”是一個(gè)不錯(cuò)的選擇。
- 主頁URL:您的Drone服務(wù)器的域名。在這里使用https://,因?yàn)槲覀兪褂玫氖前踩颉?/li>
- 應(yīng)用程序描述:Drone的簡單描述及其目的。
- 授權(quán)回調(diào)URL:這必須是https://,后跟Drone服務(wù)器的域名,后跟/authorize。如果我們的域名是example.com,這個(gè)文件將是。https://example.com/authorize
準(zhǔn)備好后,單擊“ 注冊(cè)應(yīng)用程序”。
在下一頁中,您將看到新應(yīng)用程序的詳細(xì)信息。我們需要的兩個(gè)項(xiàng)目是客戶端ID和客戶端密鑰:
復(fù)制這兩個(gè)值。我們需要這些將Drone連接到我們的GitHub帳戶。
拉取Drone Docker鏡像并準(zhǔn)備配置
可以在服務(wù)器上安裝和配置Drone。Drone作為Docker容器分發(fā),因此如果我們?cè)贒ocker Compose文件中使用它,它將自動(dòng)下載。為了略微加快這個(gè)過程,我們可以提前下拉鏡像:
docker pull drone/drone:0.7Drone Docker鏡像是一個(gè)統(tǒng)一的容器,可以通過幾種不同的方式運(yùn)行。我們將運(yùn)行一個(gè)作為Drone服務(wù)器運(yùn)行的容器,該服務(wù)器協(xié)調(diào)存儲(chǔ)庫訪問,托管Web UI并提供API。使用具有不同設(shè)置的相同鏡像,我們將另一個(gè)容器作為Drone代理運(yùn)行,該代理負(fù)責(zé)從配置的存儲(chǔ)庫構(gòu)建和測試軟件。
我們將使用Docker Compose在Drone主機(jī)上運(yùn)行這兩個(gè)容器。首先創(chuàng)建一個(gè)配置目錄來存儲(chǔ)我們需要的文件:
sudo mkdir /etc/drone接下來,我們將在其中創(chuàng)建一些文件來配置我們的服務(wù)。
為Drone創(chuàng)建Docker Compose文件
首先,在配置目錄中創(chuàng)建一個(gè)Docker Compose文件:
sudo nano /etc/drone/docker-compose.yml我們將Docker Compose文件格式標(biāo)記為版本“3”。之后,我們將為上述兩種服務(wù)定義服務(wù)。
drone-server服務(wù)將啟動(dòng)偵聽8000端口的主Drone服務(wù)器容器。我們將主機(jī)的/var/lib/drone目錄安裝在容器內(nèi),以便Drone可以保留其數(shù)據(jù)。我們將服務(wù)配置其自動(dòng)重啟,并以我們將在/etc/drone/server.env創(chuàng)建的文件中定義的環(huán)境變量的形式讀取更詳細(xì)的配置說明。
drone-agent服務(wù)使用相同的鏡像,從agent命令開始。它接收來自主Drone服務(wù)器實(shí)例的指令,因此雖然它不需要一般的網(wǎng)絡(luò)訪問,但它確實(shí)需要在Drone服務(wù)之后啟動(dòng)。它還需要訪問Docker的套接字文件來啟動(dòng)容器以運(yùn)行實(shí)際的構(gòu)建和測試步驟。與drone-server服務(wù)一樣,此服務(wù)也將自動(dòng)重啟并讀取/etc/drone/agent.env文件中的環(huán)境以進(jìn)行其他配置。
使用以下Docker Compose文件配置這兩個(gè)服務(wù)。注意文件的YAML格式,因?yàn)榭s進(jìn)或格式化中的錯(cuò)誤可能導(dǎo)致錯(cuò)誤:
version: '3'services:drone-server:image: drone/drone:0.7ports:- 127.0.0.1:8000:8000volumes:- /var/lib/drone:/var/lib/dronerestart: alwaysenv_file:- /etc/drone/server.envdrone-agent:image: drone/drone:0.7command: agentdepends_on:- drone-servervolumes:- /var/run/docker.sock:/var/run/docker.sockrestart: alwaysenv_file:- /etc/drone/agent.env完成后,保存并關(guān)閉Docker Compose文件。
配置Drone服務(wù)器的環(huán)境變量文件
接下來,我們需要為的Docker Compose文件中引用的Drone服務(wù)器的環(huán)境變量文件。
在打開文件之前,我們應(yīng)該生成一個(gè)強(qiáng)密鑰來驗(yàn)證代理和服務(wù)器組件。雖然我們的設(shè)置將在同一臺(tái)服務(wù)器上同時(shí)擁有這兩個(gè)組件,但隨著測試基礎(chǔ)架構(gòu)的擴(kuò)展,強(qiáng)大的密鑰至關(guān)重要。在命令行上,輸入以下命令生成密鑰:
LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 65 && echo此命令臨時(shí)將shell中的語言設(shè)置為有限的字符范圍。 然后它從/dev/urandom獲取一個(gè)隨機(jī)字節(jié)流,并進(jìn)一步過濾掉任何非字母數(shù)字字符。我們將前65個(gè)字符作為關(guān)鍵字。
輸出看起來與此類似(不要復(fù)制下面的值!生成自己的!):
ERmA7xubDvTa8i0wYBlljc9yjT1NJPG7xOlZBwAdMAmBYL4RZE4QngxWcCLowk9KN復(fù)制生成的密鑰以在服務(wù)器環(huán)境文件中使用。創(chuàng)建一個(gè)新文件/etc/drone/server.env并在文本編輯器中打開它:
sudo nano /etc/drone/server.env文件內(nèi),我們定義Drone用于連接的環(huán)境變量以啟動(dòng)服務(wù),連接到存儲(chǔ)庫提供程序以及設(shè)置帳戶授權(quán)策略。您需要先從存儲(chǔ)庫提供程序復(fù)制的值才能正確填寫值。
首先,設(shè)置DRONE_HOST和DRONE_SECRET值。將DRONE_SECRET設(shè)置為您在命令行上生成的密鑰。DRONE_HOST設(shè)置通知Drone其可公開訪問的地址。 這應(yīng)該是您的受騰訊云保護(hù)的域名,前面是https://。
# Service settings DRONE_SECRET=secret_generated_on_command_line DRONE_HOST=https://example.com接下來,我們將配置與VCS提供程序的集成,在我們的示例中為GitHub。適合您項(xiàng)目的設(shè)置可能會(huì)有所不同,具體取決于您的需求以及GitHub資產(chǎn)的組織方式。
我們將鎖定我們的Drone安裝并通過將DRONE_OPEN設(shè)置為false來禁用注冊(cè)。這意味著只有DRONE_ADMIN中指定的GitHub帳戶名才能登錄。
注意:如果您將協(xié)作者作為GitHub組織使用,最好將DRONE_OPEN設(shè)置為true并將DRONE_ADMIN替換為DRONE_ORGS。DRONE_ORGS設(shè)置允許您指定一個(gè)或多個(gè)允許其成員。Drone將限制注冊(cè)屬于這些組的用戶。
確保DRONE_ADMIN包含您的GitHub帳戶名稱。
然后,通過將DRONE_GITHUB設(shè)置為true來激活GitHub集成插件。當(dāng)我們注冊(cè)Drone應(yīng)用程序時(shí),我們將DRONE_GITHUB_CLIENT和DRONE_GITHUB_SECRET設(shè)置為我們從GitHub OAuth應(yīng)用程序頁面復(fù)制的密鑰:
# 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我們已完成配置服務(wù)器組件。在離開之前,復(fù)制DRONE_SECRET文件中的值。配置代理時(shí),我們需要在下一節(jié)中設(shè)置相同的密鑰。完成后保存并關(guān)閉文件。
配置Drone Agent的環(huán)境變量文件
接下來,我們將為Drone代理組件創(chuàng)建一個(gè)環(huán)境文件。打開新文件以設(shè)置代理環(huán)境變量:
sudo nano /etc/drone/agent.env我們只需要定義兩個(gè)值。 DRONE_SECRET將匹配sever.env文件中的配置。
DRONE_SERVER設(shè)置將配置代理連接到Drone服務(wù)器組件的方式。它將以wss://協(xié)議前綴開頭,表示連接將使用加密的Web套接字,后跟Drone服務(wù)器的域名,并在末尾附加/ws/broker:
DRONE_SECRET=secret_generated_on_command_line DRONE_SERVER=wss://example.com/ws/broker完成后保存并關(guān)閉文件。
配置DRONE系統(tǒng)單元文件
現(xiàn)在我們的配置文件就位,我們可以定義一個(gè)systemd單元文件來管理Drone服務(wù)。
在/etc/systemd/system目錄中打開一個(gè)新的.service文件來配置服務(wù):
sudo nano /etc/systemd/system/drone.service內(nèi)部粘貼以下內(nèi)容:
[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可用后啟動(dòng)此服務(wù)。第二部分告訴系統(tǒng)在發(fā)生故障時(shí)自動(dòng)重啟服務(wù)。 然后,它使用Docker Compose和我們之前創(chuàng)建的配置文件定義啟動(dòng)和停止Drone服務(wù)的命令。最后,最后一節(jié)定義了如何使服務(wù)在引導(dǎo)時(shí)啟動(dòng)。
完成后保存并關(guān)閉文件。
在我們啟動(dòng)Drone服務(wù)之前,我們必須配置Nginx。Drone代理需要能夠連接到Drone服務(wù)器,并且連接依賴于Nginx代理。
配置Nginx到代理請(qǐng)求到Drone
接下來,我們需要修改Nginx的配置以代理對(duì)Drone服務(wù)器的請(qǐng)求。首先找到處理騰訊云SSL的Nginx配置。通過輸入以下內(nèi)容在所有已啟用的服務(wù)器塊中搜索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;在上面的輸出中,域名(在此實(shí)例中為example.com)正在/etc/nginx/sites-enabled/default文件中定義。 您需要編輯與您的域名關(guān)聯(lián)的文件。
您可能也會(huì)看到類似這樣的內(nèi)容:
/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 _; 表示用作后備機(jī)制的服務(wù)器塊。“_”主機(jī)說明符是無效的主機(jī),因此它永遠(yuǎn)不會(huì)匹配。
在配置中,這些配置與listen指令配對(duì),后者設(shè)置default_server選項(xiàng),以便當(dāng)請(qǐng)求的主機(jī)與其他的服務(wù)器塊不匹配時(shí),將充當(dāng)默認(rèn)值。如果找不到與您的域名匹配的server_name定義,則應(yīng)使用定義這些回退塊的文件。
在文本編輯器中打開與您的域最相關(guān)的文件:
sudo nano /etc/nginx/sites-enabled/default在內(nèi)部,我們將首先在現(xiàn)有server塊之外添加兩個(gè)部分:
upstream drone {server 127.0.0.1:8000; }map $http_upgrade $connection_upgrade {default upgrade;'' close; }server {. . .第一個(gè)塊配置一個(gè)名為drone的上游請(qǐng)求,我們可以在其中代理請(qǐng)求。server指令定義了如何連接到我們的Drone服務(wù),該服務(wù)將在端口8000上運(yùn)行。
第二個(gè)塊根據(jù)$connection_upgrade變量的值設(shè)置一個(gè)名為$http_upgrade的用戶定義變量,Nginx在收到“Upgrade”HTTP標(biāo)頭時(shí)設(shè)置該變量。如果收到Upgrade頭,Nginx將設(shè)置$connection_upgrade變量進(jìn)行升級(jí)。如果沒有,它將設(shè)置為關(guān)閉。 這些變量允許我們?cè)诖鞼ebSocket請(qǐng)求時(shí)設(shè)置正確的標(biāo)頭。
接下來,找到包含listen 443指令的服務(wù)器塊。 使用以下指令替換內(nèi)容。確保注釋掉或刪除該塊中的任何現(xiàn)有配置以避免沖突:
. . . 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將此塊之外的所有流量傳遞給我們之前定義的上游。接下來,我們?cè)趐roxy_params文件中包含一些代理頭定義,并根據(jù)之前的地圖設(shè)置添加其他頭。然后,我們調(diào)整一些其他特定于代理的設(shè)置,以確保WebSocket代理正常工作,并確保我們的組件可以有效地進(jìn)行通信。
完成保存并關(guān)閉文件后。
測試并重新啟動(dòng)Nginx和Drone
我們的配置現(xiàn)已完成。我們只需啟動(dòng)或重啟我們的服務(wù)即可實(shí)現(xiàn)配置。
首先,檢查Nginx配置是否存在語法錯(cuò)誤:
sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful如果輸出指示存在配置問題,請(qǐng)返回并再次檢查Nginx配置。重新啟動(dòng)Nginx:
sudo systemctl restart nginx現(xiàn)在Nginx可用于代理和服務(wù)器之間的代理請(qǐng)求,我們可以啟動(dòng)Drone:
sudo systemctl start drone檢查以確保服務(wù)能夠成功啟動(dòng):
sudo systemctl status drone ● drone.service - Drone serverLoaded: loaded (/etc/systemd/system/drone.service; disabled; vendor preset: enabled)Active: active (running) since Fri 2017-06-09 21:56:33 UTC; 2min 58s agoMain PID: 15225 (docker-compose)Tasks: 5Memory: 37.7MCPU: 1.544sCGroup: /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如果服務(wù)被標(biāo)記為active (running)并且日志中沒有錯(cuò)誤,則Drone已啟動(dòng)并正在運(yùn)行。
如果遇到問題,可以輸入以下命令檢查Nginx日志:
sudo less /var/log/nginx/error.log您可以通過輸入以下內(nèi)容來檢查Drone日志:
sudo journalctl -u drone如果一切正常運(yùn)行,請(qǐng)通過輸入以下內(nèi)容啟用Drone:
sudo systemctl enable drone在Docker和Nginx服務(wù)可用后,Drone服務(wù)將啟動(dòng)。
登錄Drone以授權(quán)訪問您的存儲(chǔ)庫
現(xiàn)在Drone已啟動(dòng)并運(yùn)行,我們可以登錄Web界面并授權(quán)應(yīng)用程序使用我們的GitHub帳戶。
在Web瀏覽器中訪問服務(wù)器的域名以查看Drone Web界面:
https://example.com在您第一次訪問時(shí),系統(tǒng)將提示您登錄:
單擊登錄使用您的GitHub帳戶向Drone進(jìn)行身份驗(yàn)證。如果您當(dāng)前未登錄GitHub,將首先指示您登錄GitHub。
之后,系統(tǒng)將提示您允許Drone訪問您的GitHub帳戶:
查看請(qǐng)求的權(quán)限并進(jìn)行任何調(diào)整后,單擊授權(quán)用戶名按鈕以授權(quán)Drone。
您將被重定向回您的Drone服務(wù)器:
現(xiàn)在,您可以激活和配置存儲(chǔ)庫以自動(dòng)測試代碼。
結(jié)論
在本教程中,我們將Drone設(shè)置為GitHub項(xiàng)目的持續(xù)集成和交付服務(wù)器。我們將Drone設(shè)為處理身份驗(yàn)證并偵聽來自我們的存儲(chǔ)庫的更改。我們還配置了一個(gè)可以運(yùn)行測試和管理容器的Drone代理。我們還將Nginx配置為安全的反向代理。如果覺得自建太麻煩,不要著急,騰訊云CCI持續(xù)集成服務(wù)即將開放,云持續(xù)集成(Cloud Continuous Integration,CCI)為開發(fā)者提供支持多語言,多終端的持續(xù)集成服務(wù),包含定時(shí)/手動(dòng)啟動(dòng)構(gòu)建、查看構(gòu)建結(jié)果及日志、支持快速分發(fā)交付、可擴(kuò)展的自動(dòng)化測試等功能,為項(xiàng)目的持續(xù)集成體系提供上游基礎(chǔ)服務(wù),提升項(xiàng)目研發(fā)效率。 更多Linux教程請(qǐng)前往騰訊云+社區(qū)學(xué)習(xí)更多知識(shí)。
參考文獻(xiàn):《How To Install and Configure Drone on Ubuntu 16.04》
問答
Angular2如何處理http響應(yīng)?
相關(guān)閱讀
HTTP/2之服務(wù)器推送(Server Push)最佳實(shí)踐
如何備份你的MySQL數(shù)據(jù)庫
MySQL 8.0 版本功能變更介紹
云學(xué)院 · 課程推薦 | 騰訊高級(jí)工程師,帶你快速入門機(jī)器學(xué)習(xí)
此文已由作者授權(quán)騰訊云+社區(qū)發(fā)布,原文鏈接:https://cloud.tencent.com/developer/article/1180481?fromSource=waitui
搜索關(guān)注公眾號(hào)「云加社區(qū)」,第一時(shí)間獲取技術(shù)干貨,關(guān)注后回復(fù)1024 送你一份技術(shù)課程大禮包!
海量技術(shù)實(shí)踐經(jīng)驗(yàn),盡在云加社區(qū)!
總結(jié)
以上是生活随笔為你收集整理的入门系列之在Ubuntu上安装Drone持续集成环境的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人生苦短:Python里的17个“超赞操
- 下一篇: 微信小程序scroll-wiew 横向滚