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


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

本文由小鐵匠米蘭的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帳戶。點擊右上角的用戶圖標,然后從下拉菜單中選擇設置

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 送你一份技術課程大禮包!

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM