在Ubuntu上安裝Drone持續整合環境

weixin_34377065發表於2018-08-20

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~

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

介紹

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

在本教程中,我們將演示如何為您的設定完整的Drone持續整合環境。我們將配置受騰訊雲SSL保護的Nginx作為Drone的前端。加密對Drone Web介面的請求,並允許CI伺服器與原始碼伺服器安全地整合。

準備

要完成本教程,您需要一臺已經設定好可以使用sudo命令的非root賬號的CentOS伺服器,並且已開啟防火牆。沒有伺服器的同學可以在這裡購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後在購買伺服器

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

同時,您還需要提前安裝好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帳戶。點選右上角的使用者圖示,然後從下拉選單中選擇設定

接下來,在螢幕左側的“ 開發人員設定”部分中找到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_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
複製程式碼

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

單擊登入使用您的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》

問答

Angular2如何處理http響應?

相關閱讀

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

如何備份你的MySQL資料庫

MySQL 8.0 版本功能變更介紹

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

此文已由作者授權騰訊雲+社群釋出,原文連結:cloud.tencent.com/developer/a…

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

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

相關文章