Ubuntu16.04にドローンをインストールして構成する方法
警告:このバージョンのドローンは非推奨です。 最新バージョンのドローンのインストールについては、 Ubuntu20.04Droneインストールチュートリアルをご覧ください。
序章
Drone は、Goに組み込まれている人気の継続的インテグレーションおよびデリバリープラットフォームです。 GitHub、GitLab、Bitbucketなどの多くの一般的なバージョン管理リポジトリサービスと統合して、コードの変更を監視し、コミット時に変更を自動的にビルドしてテストします。
このガイドでは、インフラストラクチャに完全なドローン継続的インテグレーション環境をセットアップする方法を示します。 Droneをインストールし、ソースコードリポジトリと統合するように構成します。 その過程で、Let’sEncryptによって保護されているNginxをDroneのフロントエンドとして構成します。 これにより、ドローンのWebインターフェイスへの要求が暗号化され、CIサーバーがソースコードサーバーと安全に統合できるようになります。
前提条件
開始するには、管理タスク用に非ルートsudo
ユーザーで構成されたUbuntu16.04サーバーが必要です。 サーバーには、着信接続をフィルタリングするためのファイアウォールも必要です。 これらのアイテムを構成する方法については、Ubuntu16.04初期サーバーセットアップガイドを参照してください。
セットアップの他の要件を満たすには、いくつかの追加手順を完了する必要があります。 ドローンは主にDockerイメージとして配布されるため、DockerComposeを使用してCIサーバーコンテナーを管理します。 セキュリティとパフォーマンスの目的で、Let’sEncryptによって保護されているNginxインスタンスを介してドローンへのリクエストをプロキシします。 これを適切に設定するには、CIサーバーにドメイン名を付ける必要があります。
始める前に、次の記事を使用してこれらの追加要件を設定してください。
- Ubuntu16.04にDockerをインストールして使用する方法
- Ubuntu16.04にDockerComposeをインストールする方法:このガイドの前提条件と最初の手順に従って、DockerとDockerComposeをインストールします。
- Ubuntu 16.04にNginxをインストールする方法:サーバーにNginxをインストールします。
- Ubuntu 16.04でLet’sEncryptを使用してNginxを保護する方法:信頼できるSSL証明書を使用してNginxを保護します。
上記のガイドを終了すると、ドローンサーバーは次のようになります。
- 管理タスク用に構成された
sudo
ユーザー - UFWファイアウォールが有効になっています。 ポート22、80、および443でそれぞれSSH、HTTP、およびHTTPS要求を除くすべての接続をブロックする必要があります。
- DockerとDockerComposeがインストールされています。
- Let’sEncryptが提供するSSL証明書で構成されたNginxサーバー
始める準備ができたら、以下を続けてください。
ソースコードリポジトリにアプリケーションを追加する
コードの変更を監視してビルドとテストの段階をトリガーするには、Droneがソースコードリポジトリにアクセスする必要があります。 ドローンは、 GitHub 、 GitLab 、 Gogs 、 Bitbucket Cloud 、および BitbucketServerと統合できます。
このガイドでは、GitHubリポジトリとの統合に焦点を当てますが、プロセスは他のシステムでも同様である必要があります。 別のソースコードリポジトリを使用している場合は、上記の適切なリンクをたどって、必要なソフトウェア固有の構成について学習してください。
GitHubアカウントにアクセスすることから始めます。 右上隅にあるユーザーアイコンをクリックし、ドロップダウンメニューから設定を選択します。
次に、画面左側の開発者設定セクションでOAuthアプリケーション項目を見つけます。
次のページで、新しいアプリケーションの登録をクリックします。
次に、OAuthアプリケーション登録フォームが表示されます。
次のフィールドに入力する必要があります(これらのフィールドはGitHubにあります。 他のリポジトリプロバイダーは異なるプロンプトを持っているかもしれません):
- アプリケーション名:統合を識別するために選択した名前。 特別なニーズがない場合は、「ドローン」が適しています。
- ホームページURL:ドローンサーバーのドメイン名。 保護されたドメインを使用しているため、ここでは
https://
を使用します。 - アプリケーションの説明:ドローンとその目的の簡単な説明。
- 承認コールバックURL:これは、
https://
スキーマ指定子、Droneサーバーのドメイン名、/authorize
の順である必要があります。 ドメイン名がexample.com
の場合、このファイルはhttps://example.com/authorize
になります。
準備ができたら、アプリケーションの登録をクリックします。
次のページに、新しいアプリケーションの詳細が表示されます。 必要な2つのアイテムは、クライアントIDとクライアントシークレットです。
後で使用するために、これら2つの値をコピーします。 DroneをGitHubアカウントに接続するには、これらが必要になります。
ドローンDockerイメージをプルして構成の準備をする
これで、Droneサーバーがリポジトリプロバイダーに登録されたので、サーバーにDroneをインストールして構成できます。
ドローンはDockerコンテナとして配布されるため、DockerComposeファイルで使用すると自動的にダウンロードされます。 ただし、プロセスを少しスピードアップするために、事前に画像をプルダウンすることができます。
- docker pull drone/drone:0.7
Drone Dockerイメージは、いくつかの異なる方法で実行できる統合コンテナーです。 リポジトリアクセスを調整し、Web UIをホストし、APIを提供するDroneサーバーとして動作する1つのコンテナーを実行します。 異なる設定で同じイメージを使用して、構成されたリポジトリからソフトウェアを構築およびテストする役割を担うドローンエージェントとして別のコンテナを実行します。
Docker Composeを使用して、これらのコンテナーの両方をDroneホストで実行します。 必要なファイルを保存するための構成ディレクトリを作成することから始めます。
- sudo mkdir /etc/drone
次に、サービスを構成するためにいくつかのファイルを作成します。
ドローン用のDocker作成ファイルを作成する
まず、構成ディレクトリにDockerComposeファイルを作成します。
- sudo nano /etc/drone/docker-compose.yml
内部では、DockerComposeファイル形式をバージョン「3」としてマークします。 その後、上記の両方のサービスのサービスを定義します。
drone-server
サービスは、ポート8000でリッスンしているメインのドローンサーバーコンテナを開始します。 ドローンがデータを保持できるように、ホストの/var/lib/drone
ディレクトリをコンテナ内にマウントします。 自動的に再起動し、/etc/drone/server.env
で作成するファイルで定義された環境変数の形式でより詳細な構成手順を読み取るようにサービスを構成します。
drone-agent
サービスは、agent
コマンドで開始された同じイメージを使用します。 メインのドローンサーバーインスタンスから命令を受け取るため、一般的なネットワークアクセスは必要ありませんが、ドローンサービスの後に開始する必要があります。 また、実際のビルドとテストの手順を実行するためにコンテナーを起動するために、Dockerのソケットファイルにアクセスする必要があります。 drone-server
サービスと同様に、このサービスも自動的に再起動し、/etc/drone/agent.env
の環境ファイルを読み取って追加の構成を行います。
次のDockerComposeファイルを使用して、これら2つのサービスを構成します。 インデントまたはフォーマットの誤りがエラーを引き起こす可能性があるため、ファイルの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
終了したら、DockerComposeファイルを保存して閉じます。
ドローンサーバーの環境変数ファイルを構成する
次に、上記のDockerComposeファイルで参照したDroneサーバーの環境変数ファイルを作成する必要があります。
ファイルを開く前に、エージェントとサーバーのコンポーネントを認証するための強力なキーを生成する必要があります。 私たちのセットアップでは、これらのコンポーネントの両方が同じサーバー上にありますが、テストインフラストラクチャがスケールアウトするにつれて、強力なキーが不可欠です。 コマンドラインで、次のように入力してキーを生成します。
- LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 65 && echo
このコマンドは、シェル内の言語を一時的に限られた範囲の文字に設定します。 次に、/dev/urandom
からランダムなバイトのストリームを取得し、英数字以外の文字をさらに除外します。 最初の65文字をキーとして使用します。
出力は次のようになります(
OutputERmA7xubDvTa8i0wYBlljc9yjT1NJPG7xOlZBwAdMAmBYL4RZE4QngxWcCLowk9KN
生成されたキーをコピーして、サーバー環境ファイルで使用します。
/etc/drone/server.env
で新しいファイルを作成し、テキストエディタで開きます。
- sudo nano /etc/drone/server.env
内部では、Droneが接続してサービスをバインド開始し、リポジトリプロバイダーに接続し、アカウント承認ポリシーを設定するために使用する環境変数を定義します。 値を正しく入力するには、以前にリポジトリプロバイダーからコピーした値が必要になります。
まず、DRONE_HOST
とDRONE_SECRET
の値を設定します。 DRONE_SECRET
をコマンドラインで生成したキーに設定します。 DRONE_HOST
設定は、ドローンに公的にアクセス可能なアドレスを通知します。 これは、https://
スキーマ指定子が前に付いた、Let’sEncryptで保護されたドメインである必要があります。
# Service settings
DRONE_SECRET=secret_generated_on_command_line
DRONE_HOST=https://example.com
次に、VCSプロバイダー(この場合はGitHub)との統合を構成します。 プロジェクトに適した設定は、ニーズやGitHubアセットの編成方法によって異なる場合があります。
DRONE_OPEN
をfalse
に設定して、ドローンのインストールをロックダウンし、オープン登録を無効にします。 これは、DRONE_ADMIN
で指定されたGitHubアカウント名のみがログインできることを意味します。
注:GitHub組織として共同編集者と作業する場合は、DRONE_OPEN
をtrue
に設定し、DRONE_ADMIN
をDRONE_ORGS
に置き換えることをお勧めします。 ]。 DRONE_ORGS
設定では、メンバーの登録を許可する必要がある1つ以上のGitHub組織を指定できます。 ドローンは、それらのグループに属するユーザーに登録を制限します。
DRONE_ADMIN
にGitHubアカウント名が含まれていることを確認してください。
その後、DRONE_GITHUB
をtrue
に設定して、GitHub統合プラグインをアクティブ化します。 次に、DRONE_GITHUB_CLIENT
とDRONE_GITHUB_SECRET
を、Droneアプリケーションの登録時にGitHubOAuthアプリケーションページからコピーしたキーに設定します。
# 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
の値をコピーしてください。 エージェントを構成するときに、次のセクションでこれと同じキーを設定する必要があります。 終了したら、ファイルを保存して閉じます。
ドローンエージェントの環境変数ファイルを構成する
次に、ドローンエージェントコンポーネントの環境ファイルを作成します。
新しいファイルを開いて、エージェント環境変数を設定します。
- sudo nano /etc/drone/agent.env
内部では、2つの値を定義するだけで済みます。 DRONE_SECRET
は、sever.env
ファイルの構成と一致します。
DRONE_SERVER
設定は、エージェントがドローンサーバーコンポーネントに接続する方法を構成します。 wss://
プロトコルプレフィックスで始まり、接続が暗号化されたWebソケットを使用し、その後に/ws/broker
URIが追加されたDroneサーバーのドメイン名が続くことを示します。
DRONE_SECRET=secret_generated_on_command_line
DRONE_SERVER=wss://example.com/ws/broker
終了したら、ファイルを保存して閉じます。
ドローンSystemdユニットファイルを構成する
構成ファイルが配置されたので、Droneサービスを管理するためのsystemdユニットファイルを定義できます。
/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
最初のセクションは、DockerとNginxが利用可能になった後にこのサービスを開始するようにsystemdに指示します。 2番目のセクションは、障害が発生した場合にサービスを自動的に再起動するようにinitシステムに指示します。 次に、DockerComposeと前に作成した構成ファイルを使用してDroneサービスを開始および停止するコマンドを定義します。 最後に、最後のセクションでは、サービスを起動時に開始できるようにする方法を定義します。
終了したら、ファイルを保存して閉じます。
ドローンサービスを開始する前に、Nginxを構成する必要があります。 DroneエージェントはDroneサーバーに接続できる必要があり、接続はNginxプロキシが配置されていることに依存しています。
リクエストをドローンにプロキシするようにNginxを構成する
次に、リクエストをドローンサーバーにプロキシするようにNginxの構成を変更する必要があります。
Let’sEncryptで保護されたドメインを処理するサーバーブロック構成を見つけることから始めます。 次のように入力して、有効なすべてのサーバーブロックでserver_name
属性を検索します。
- grep -R server_name /etc/nginx/sites-enabled
Output/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
ファイル内で定義されています。 ドメイン名に関連付けられているファイル(最初の列)を編集する必要があります。
次のようなものも表示される可能性があります。
Output/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
ブロックの外部に2つのセクションを追加することから始めます。
upstream drone {
server 127.0.0.1:8000;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
. . .
最初のブロックは、リクエストをプロキシできるdrone
というアップストリームの場所を構成します。 server
ディレクティブは、ポート8000で実行されるドローンサービスに接続する方法を定義します。
2番目のブロックは、$http_upgrade
変数の値に基づいて、$connection_upgrade
というユーザー定義変数を設定します。これは、「アップグレード」HTTPヘッダーを受信したときにNginxが設定します。 Upgradeヘッダーを受信すると、Nginxは$connection_upgrade
変数をupgrade
に設定します。 そうでない場合は、close
に設定されます。 これらの変数を使用すると、WebSocketリクエストをプロキシするときに正しいヘッダーを設定できます。
次に、listen 443
ディレクティブが含まれているserver
ブロックを見つけます。 location /
ブロックの内容を次のディレクティブに置き換えます。 競合を避けるために、必ずコメントアウトするか、そのブロックから既存の構成を削除してください。
. . .
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
行は、このブロックから配信されるすべてのトラフィックを前に定義したupstream
に渡すようにNginxに指示します。 次に、proxy_params
ファイルからいくつかのプロキシヘッダー定義を含め、以前のmap
設定に基づいて追加のヘッダーを追加します。
次に、他のプロキシ固有の設定を調整して、WebSocketプロキシが正しく機能し、コンポーネントが効果的に通信できるようにします。
終了したら、ファイルを保存して閉じます。
Nginxとドローンをテストして再起動します
これで構成は完了です。 構成を実装するには、サービスを開始または再起動する必要があります。
開始するには、構文エラーがないかNginx構成を確認します。
- sudo nginx -t
Outputnginx: 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
Output● 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)
としてマークされていて、ログにエラーがない場合、ドローンは稼働しています。
問題が発生した場合は、次のように入力してNginxログを確認できます。
- sudo less /var/log/nginx/error.log
次のように入力して、ドローンのログを確認できます。
- sudo journalctl -u drone
すべてが正常に実行されている場合は、次のように入力して、起動時にドローンを起動できるようにします。
- sudo systemctl enable drone
ドローンサービスは、DockerおよびNginxサービスが利用可能になった後に起動します。
ドローンにログインして、リポジトリへのアクセスを承認します
Droneが稼働しているので、Webインターフェイスにログインして、アプリケーションがGitHubアカウントを使用することを承認できます。
Webブラウザでサーバーのドメイン名にアクセスして、DroneWebインターフェイスを表示します。
https://example.com
初めてアクセスすると、ログインするように求められます。
ログインをクリックして、OAuthを使用してGitHubアカウントでドローンに認証します。 現在GitHubにログインしていない場合は、最初にGitHubにログインするように指示されます。
その後、DroneがGitHubアカウントにアクセスすることを許可するように求められます。
要求された権限を確認して調整を行った後、ユーザー名の承認ボタンをクリックしてドローンを承認します。
ドローンサーバーにリダイレクトされます。
ここから、コードを自動的にテストするようにリポジトリをアクティブ化および構成できます。
結論
このガイドでは、GitHubプロジェクトの継続的インテグレーションおよびデリバリーサーバーとしてDroneをセットアップしました。 ドローンサーバーを中央ハブとして構成し、作業を委任し、認証を処理し、リポジトリからの変更をリッスンしました。 また、テストを実行してコンテナーを管理できるDroneエージェントを構成しました。 これらすべての前に、安全なリバースプロキシとして機能するようにNginxを構成しました。
リポジトリに対してテストを自動的に実行するようにドローンを設定する準備ができたら、ドローンのドキュメントをチェックして、テスト手順で.drone.yml
ファイルを定義する方法を確認してください。