Ubuntu16.04にドローンをインストールして構成する方法
警告:このバージョンのドローンは非推奨です。 最新バージョンのドローンのインストールについては、 Ubuntu20.04Droneインストールチュートリアルをご覧ください。
序章
Drone は、Goに組み込まれている人気の継続的インテグレーションおよびデリバリープラットフォームです。 GitHub、GitLab、Bitbucketなどの多くの一般的なバージョン管理リポジトリサービスと統合して、コードの変更を監視し、コミット時に変更を自動的にビルドしてテストします。
このガイドでは、インフラストラクチャに完全なドローン継続的インテグレーション環境をセットアップする方法を示します。 Droneをインストールし、ソースコードリポジトリと統合するように構成します。 その過程で、Let’sEncryptによって保護されているNginxをDroneのフロントエンドとして構成します。 これにより、ドローンのWebインターフェイスへの要求が暗号化され、CIサーバーがソースコードサーバーと安全に統合できるようになります。
前提条件
開始するには、非ルートで構成されたUbuntu16.04サーバーが必要です。 sudo
管理タスクのユーザー。 サーバーには、着信接続をフィルタリングするためのファイアウォールも必要です。 これらのアイテムを構成する方法については、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を保護します。
上記のガイドを終了すると、ドローンサーバーは次のようになります。
- A
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」としてマークします。 その後、上記の両方のサービスのサービスを定義します。
The drone-server
サービスは、ポート8000でリッスンしているメインのドローンサーバーコンテナを開始します。 ホストをマウントします /var/lib/drone
ドローンがデータを永続化できるように、コンテナ内のディレクトリ。 自動的に再起動するようにサービスを構成し、作成するファイルで定義された環境変数の形式でより詳細な構成手順を読みます。 /etc/drone/server.env
.
The 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_HOST
と DRONE_SECRET
値。 設定 DRONE_SECRET
コマンドラインで生成したキーに。 The DRONE_HOST
設定は、ドローンに公的にアクセス可能なアドレスを通知します。 これは、Let’sEncryptで保護されたドメインである必要があります。 https://
スキーマ指定子:
# Service settings
DRONE_SECRET=secret_generated_on_command_line
DRONE_HOST=https://example.com
次に、VCSプロバイダー(この場合はGitHub)との統合を構成します。 プロジェクトに適した設定は、ニーズやGitHubアセットの編成方法によって異なる場合があります。
ドローンのインストールをロックダウンし、設定してオープン登録を無効にします DRONE_OPEN
に false
. これは、で指定されたGitHubアカウント名のみを意味します DRONE_ADMIN
ログインできるようになります。
注:GitHub組織として共同編集者と協力する場合は、設定することをお勧めします DRONE_OPEN
に true
交換してください DRONE_ADMIN
と DRONE_ORGS
. The DRONE_ORGS
設定により、メンバーの登録を許可する必要がある1つ以上のGitHub組織を指定できます。 ドローンは、それらのグループに属するユーザーに登録を制限します。
それを確認してください DRONE_ADMIN
GitHubアカウント名が含まれています。
その後、設定してGitHub統合プラグインをアクティブ化します DRONE_GITHUB
に true
. 次に、 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つの値を定義するだけで済みます。 The DRONE_SECRET
の構成と一致します sever.env
ファイル。
The DRONE_SERVER
設定により、エージェントがドローンサーバーコンポーネントに接続する方法が構成されます。 それはで始まります wss://
接続が暗号化されたWebソケットを使用し、その後にDroneサーバーのドメイン名が続くことを示すプロトコルプレフィックス /ws/broker
最後に追加されたURI:
DRONE_SECRET=secret_generated_on_command_line
DRONE_SERVER=wss://example.com/ws/broker
終了したら、ファイルを保存して閉じます。
ドローンSystemdユニットファイルを構成する
構成ファイルが配置されたので、Droneサービスを管理するためのsystemdユニットファイルを定義できます。
新しいを開く .service
のファイル /etc/systemd/system
サービスを構成するディレクトリ:
- 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
内部では、既存の外部に2つのセクションを追加することから始めます server
ブロック:
upstream drone {
server 127.0.0.1:8000;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
. . .
最初のブロックは、と呼ばれるアップストリームの場所を構成します drone
リクエストをプロキシできる場所。 The server
ディレクティブは、ポート8000で実行されるドローンサービスに接続する方法を定義します。
2番目のブロックは、と呼ばれるユーザー定義変数を設定します $connection_upgrade
の値に基づいて $http_upgrade
変数。「アップグレード」HTTPヘッダーを受信したときにNginxが設定します。 アップグレードヘッダーを受信すると、Nginxは $connection_upgrade
に可変 upgrade
. そうでない場合は、 close
. これらの変数を使用すると、WebSocketリクエストをプロキシするときに正しいヘッダーを設定できます。
次に、 server
でブロックする listen 443
内部のディレクティブ。 の内容を置き換えます 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;
}
. . .
}
The proxy_pass
行は、このブロックから配信されるすべてのトラフィックをに渡すようにNginxに指示します upstream
前に定義しました。 次に、からのプロキシヘッダー定義をいくつか含めます。 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アカウントを使用することを承認できます。
ドローンのウェブインターフェースを表示するには、ウェブブラウザでサーバーのドメイン名にアクセスしてください。
https://example.com
初めてアクセスすると、ログインするように求められます。
ログインをクリックして、OAuthを使用してGitHubアカウントでドローンに認証します。 現在GitHubにログインしていない場合は、最初にGitHubにログインするように指示されます。
その後、DroneがGitHubアカウントにアクセスすることを許可するように求められます。
要求された権限を確認して調整を行った後、ユーザー名の承認ボタンをクリックしてドローンを承認します。
ドローンサーバーにリダイレクトされます。
ここから、コードを自動的にテストするようにリポジトリをアクティブ化および構成できます。
結論
このガイドでは、GitHubプロジェクトの継続的インテグレーションおよびデリバリーサーバーとしてDroneをセットアップしました。 ドローンサーバーを中央ハブとして構成し、作業を委任し、認証を処理し、リポジトリからの変更をリッスンしました。 また、テストを実行してコンテナを管理できるドローンエージェントを構成しました。 これらすべての前に、安全なリバースプロキシとして機能するようにNginxを構成しました。
リポジトリに対してテストを自動的に実行するようにドローンを設定する準備ができたら、ドローンのドキュメントをチェックして、 .drone.yml
テスト手順を提出します。