入門系列之在Ubuntu上安裝Drone持續集成環境

歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~前端

本文由小鐵匠米蘭的v 發表於雲+社區專欄nginx

介紹

Drone是一個流行的持續集成和交付平臺。它集成了許多流行的版本控制存儲庫服務,如GitHub,GitLab和Bitbucket,以監視代碼更改並在提交時自動構建和測試更改。git

在本教程中,咱們將演示如何爲您的設置完整的Drone持續集成環境。咱們將配置受騰訊雲SSL保護的Nginx做爲Drone的前端。加密對Drone Web界面的請求,並容許CI服務器與源代碼服務器安全地集成。github

準備

要完成本教程,您須要一臺已經設置好可使用sudo命令的非root帳號的CentOS服務器,而且已開啓防火牆。沒有服務器的同窗能夠在這裏購買,不過我我的更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後在購買服務器docker

爲了加密傳輸的內容,您還須要SSL證書,如何設置此證書**取決於你是否擁有可解析該服務器的域名。shell

同時,您還須要提早安裝好Docker、學會使用Docker Compose,並在你的服務器上安裝好Nginx,學會配置SSL證書,具體教程以下:數據庫

完成上述教程後,您的Drone服務器應具備:瀏覽器

  • sudo爲管理任務配置的用戶
  • 啓用了UFW防火牆,阻止除端口22,80和443上的SSH,HTTP和HTTPS請求以外的全部鏈接。
  • 已安裝Docker和Docker Compose。
  • Nginx服務器配置了由騰訊雲提供的SSL證書

接下來咱們繼續安裝教程。安全

將程序添加到源碼存儲庫

爲了監視代碼更改以觸發構建和測試階段,Drone將須要訪問您的源代碼存儲庫。Drone能夠與GitHubGitLabGogsBitbucket CloudBitbucket Server集成。服務器

在本教程中,咱們將重點關注與GitHub存儲庫的集成,其餘系統應該與本教程相似。若是您使用的是其餘源代碼存儲庫,請按照上面的相應連接瞭解您須要的軟件特定配置。

首先訪問您的GitHub賬戶。點擊右上角的用戶圖標,而後從下拉菜單中選擇設置

img

接下來,在屏幕左側的「 開發人員設置」部分中找到OAuth應用程序項:

img

在隨後的頁面上,單擊「 註冊新應用程序」

img

接下來,您將看到OAuth申請註冊表:

img

填寫如下字段(這些字段存在於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_HOSTDRONE_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_ORGSDRONE_ORGS設置容許您指定一個或多個容許其成員。Drone將限制註冊屬於這些組的用戶。

確保DRONE_ADMIN包含您的GitHub賬戶名稱。

而後,經過將DRONE_GITHUB設置爲true來激活GitHub集成插件。當咱們註冊Drone應用程序時,咱們將DRONE_GITHUB_CLIENTDRONE_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

在您第一次訪問時,系統將提示您登陸:

img

單擊登陸使用您的GitHub賬戶向Drone進行身份驗證。若是您當前未登陸GitHub,將首先指示您登陸GitHub。

以後,系統將提示您容許Drone訪問您的GitHub賬戶:

img

查看請求的權限並進行任何調整後,單擊受權用戶名按鈕以受權Drone。

您將被重定向回您的Drone服務器:

img

如今,您能夠激活和配置存儲庫以自動測試代碼。

結論

在本教程中,咱們將Drone設置爲GitHub項目的持續集成和交付服務器。咱們將Drone設爲處理身份驗證並偵聽來自咱們的存儲庫的更改。咱們還配置了一個能夠運行測試和管理容器的Drone代理。咱們還將Nginx配置爲安全的反向代理。若是以爲自建太麻煩,不要着急,騰訊雲CCI持續集成服務即將開放,雲持續集成(Cloud Continuous Integration,CCI)爲開發者提供支持多語言,多終端的持續集成服務,包含定時/手動啓動構建、查看構建結果及日誌、支持快速分發交付、可擴展的自動化測試等功能,爲項目的持續集成體系提供上游基礎服務,提高項目研發效率。 更多Linux教程請前往騰訊雲+社區學習更多知識。


參考文獻:《How To Install and Configure Drone on Ubuntu 16.04》

問答

Angular2如何處理http響應?

相關閱讀

HTTP/2之服務器推送(Server Push)最佳實踐

如何備份你的MySQL數據庫

MySQL 8.0 版本功能變動介紹

雲學院 · 課程推薦 | 騰訊高級工程師,帶你快速入門機器學習

此文已由做者受權騰訊雲+社區發佈,原文連接:https://cloud.tencent.com/developer/article/1180481?fromSource=waitui

搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在雲加社區

相關文章
相關標籤/搜索