歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~前端
本文由 小鐵匠米蘭的v 發表於 雲+社區專欄
Drone是一個流行的持續集成和交付平臺。它集成了許多流行的版本控制存儲庫服務,如GitHub,GitLab和Bitbucket,以監視代碼更改並在提交時自動構建和測試更改。nginx
在本教程中,咱們將演示如何爲您的設置完整的Drone持續集成環境。咱們將配置受騰訊雲SSL保護的Nginx做爲Drone的前端。加密對Drone Web界面的請求,並容許CI服務器與源代碼服務器安全地集成。git
要完成本教程,您須要一臺已經設置好可使用sudo
命令的非root帳號的CentOS服務器,而且已開啓防火牆。沒有服務器的同窗能夠在這裏購買,不過我我的更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後在購買服務器。github
爲了加密傳輸的內容,您還須要SSL證書,如何設置此證書**取決於你是否擁有可解析該服務器的域名。docker
同時,您還須要提早安裝好Docker、學會使用Docker Compose,並在你的服務器上安裝好Nginx,學會配置SSL證書,具體教程以下:shell
完成上述教程後,您的Drone服務器應具備:數據庫
接下來咱們繼續安裝教程。瀏覽器
爲了監視代碼更改以觸發構建和測試階段,Drone將須要訪問您的源代碼存儲庫。Drone能夠與GitHub,GitLab,Gogs,Bitbucket Cloud和Bitbucket Server集成。安全
在本教程中,咱們將重點關注與GitHub存儲庫的集成,其餘系統應該與本教程相似。若是您使用的是其餘源代碼存儲庫,請按照上面的相應連接瞭解您須要的軟件特定配置。服務器
首先訪問您的GitHub賬戶。點擊右上角的用戶圖標,而後從下拉菜單中選擇設置:
接下來,在屏幕左側的「 開發人員設置」部分中找到OAuth應用程序項:
在隨後的頁面上,單擊「 註冊新應用程序」:
接下來,您將看到OAuth申請註冊表:
填寫如下字段(這些字段存在於GitHub上。其餘存儲庫提供程序可能有不一樣的提示):
https://
,由於咱們使用的是安全域。https://
,後跟Drone服務器的域名,後跟/authorize
。若是咱們的域名是example.com
,這個文件將是。https://example.com/authorize
準備好後,單擊「 註冊應用程序」。
在下一頁中,您將看到新應用程序的詳細信息。咱們須要的兩個項目是客戶端ID和客戶端密鑰:
複製這兩個值。咱們須要這些將Drone鏈接到咱們的GitHub賬戶。
能夠在服務器上安裝和配置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文件。
接下來,咱們須要爲的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代理組件建立一個環境文件。打開新文件以設置代理環境變量:
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
完成後保存並關閉文件。
如今咱們的配置文件就位,咱們能夠定義一個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服務器的請求。首先找處處理騰訊雲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配置是否存在語法錯誤:
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已啓動並運行,咱們能夠登陸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/dev...
搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社區!