警告:このバージョンのドローンは非推奨です。 最新バージョンのドローンのインストールについては、 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サーバーにドメイン名を付ける必要があります。

始める前に、次の記事を使用してこれらの追加要件を設定してください。

上記のガイドを終了すると、ドローンサーバーは次のようになります。

  • 管理タスク用に構成されたsudoユーザー
  • UFWファイアウォールが有効になっています。 ポート22、80、および443でそれぞれSSH、HTTP、およびHTTPS要求を除くすべての接続をブロックする必要があります。
  • DockerとDockerComposeがインストールされています。
  • Let’sEncryptが提供するSSL証明書で構成されたNginxサーバー

始める準備ができたら、以下を続けてください。

ソースコードリポジトリにアプリケーションを追加する

コードの変更を監視してビルドとテストの段階をトリガーするには、Droneがソースコードリポジトリにアクセスする必要があります。 ドローンは、 GitHub GitLab Gogs Bitbucket Cloud 、および BitbucketServerと統合できます。

このガイドでは、GitHubリポジトリとの統合に焦点を当てますが、プロセスは他のシステムでも同様である必要があります。 別のソースコードリポジトリを使用している場合は、上記の適切なリンクをたどって、必要なソフトウェア固有の構成について学習してください。

GitHubアカウントにアクセスすることから始めます。 右上隅にあるユーザーアイコンをクリックし、ドロップダウンメニューから設定を選択します。

Drone GitHub settings

次に、画面左側の開発者設定セクションでOAuthアプリケーション項目を見つけます。

Drone OAuth applications

次のページで、新しいアプリケーションの登録をクリックします。

Drone new app

次に、OAuthアプリケーション登録フォームが表示されます。

Drone register a new app

次のフィールドに入力する必要があります(これらのフィールドはGitHubにあります。 他のリポジトリプロバイダーは異なるプロンプトを持っているかもしれません):

  • アプリケーション名:統合を識別するために選択した名前。 特別なニーズがない場合は、「ドローン」が適しています。
  • ホームページURL:ドローンサーバーのドメイン名。 保護されたドメインを使用しているため、ここではhttps://を使用します。
  • アプリケーションの説明:ドローンとその目的の簡単な説明。
  • 承認コールバックURL:これは、https://スキーマ指定子、Droneサーバーのドメイン名、/authorizeの順である必要があります。 ドメイン名がexample.comの場合、このファイルはhttps://example.com/authorizeになります。

準備ができたら、アプリケーションの登録をクリックします。

次のページに、新しいアプリケーションの詳細が表示されます。 必要な2つのアイテムは、クライアントIDクライアントシークレットです。

Drone client info

後で使用するために、これら2つの値をコピーします。 DroneをGitHubアカウントに接続するには、これらが必要になります。

ドローンDockerイメージをプルして構成の準備をする

これで、Droneサーバーがリポジトリプロバイダーに登録されたので、サーバーにDroneをインストールして構成できます。

ドローンはDockerコンテナとして配布されるため、DockerComposeファイルで使用すると自動的にダウンロードされます。 ただし、プロセスを少しスピードアップするために、事前に画像をプルダウンすることができます。

  1. docker pull drone/drone:0.7

Drone Dockerイメージは、いくつかの異なる方法で実行できる統合コンテナーです。 リポジトリアクセスを調整し、Web UIをホストし、APIを提供するDroneサーバーとして動作する1つのコンテナーを実行します。 異なる設定で同じイメージを使用して、構成されたリポジトリからソフトウェアを構築およびテストする役割を担うドローンエージェントとして別のコンテナを実行します。

Docker Composeを使用して、これらのコンテナーの両方をDroneホストで実行します。 必要なファイルを保存するための構成ディレクトリを作成することから始めます。

  1. sudo mkdir /etc/drone

次に、サービスを構成するためにいくつかのファイルを作成します。

ドローン用のDocker作成ファイルを作成する

まず、構成ディレクトリにDockerComposeファイルを作成します。

  1. 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フォーマットに細心の注意を払ってください。

/etc/drone/docker-compose.yml
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サーバーの環境変数ファイルを作成する必要があります。

ファイルを開く前に、エージェントとサーバーのコンポーネントを認証するための強力なキーを生成する必要があります。 私たちのセットアップでは、これらのコンポーネントの両方が同じサーバー上にありますが、テストインフラストラクチャがスケールアウトするにつれて、強力なキーが不可欠です。 コマンドラインで、次のように入力してキーを生成します。

  1. LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 65 && echo

このコマンドは、シェル内の言語を一時的に限られた範囲の文字に設定します。 次に、/dev/urandomからランダムなバイトのストリームを取得し、英数字以外の文字をさらに除外します。 最初の65文字をキーとして使用します。

出力は次のようになります( 以下の値をコピーしないでください! 自分で作成してください! ):

Output
ERmA7xubDvTa8i0wYBlljc9yjT1NJPG7xOlZBwAdMAmBYL4RZE4QngxWcCLowk9KN

生成されたキーをコピーして、サーバー環境ファイルで使用します。

/etc/drone/server.envで新しいファイルを作成し、テキストエディタで開きます。

  1. sudo nano /etc/drone/server.env

内部では、Droneが接続してサービスをバインド開始し、リポジトリプロバイダーに接続し、アカウント承認ポリシーを設定するために使用する環境変数を定義します。 値を正しく入力するには、以前にリポジトリプロバイダーからコピーした値が必要になります。

まず、DRONE_HOSTDRONE_SECRETの値を設定します。 DRONE_SECRETをコマンドラインで生成したキーに設定します。 DRONE_HOST設定は、ドローンに公的にアクセス可能なアドレスを通知します。 これは、https://スキーマ指定子が前に付いた、Let’sEncryptで保護されたドメインである必要があります。

/etc/drone/server.env
# Service settings
DRONE_SECRET=secret_generated_on_command_line
DRONE_HOST=https://example.com

次に、VCSプロバイダー(この場合はGitHub)との統合を構成します。 プロジェクトに適した設定は、ニーズやGitHubアセットの編成方法によって異なる場合があります。

DRONE_OPENfalseに設定して、ドローンのインストールをロックダウンし、オープン登録を無効にします。 これは、DRONE_ADMINで指定されたGitHubアカウント名のみがログインできることを意味します。

:GitHub組織として共同編集者と作業する場合は、DRONE_OPENtrueに設定し、DRONE_ADMINDRONE_ORGSに置き換えることをお勧めします。 ]。 DRONE_ORGS設定では、メンバーの登録を許可する必要がある1つ以上のGitHub組織を指定できます。 ドローンは、それらのグループに属するユーザーに登録を制限します。

DRONE_ADMINにGitHubアカウント名が含まれていることを確認してください。

その後、DRONE_GITHUBtrueに設定して、GitHub統合プラグインをアクティブ化します。 次に、DRONE_GITHUB_CLIENTDRONE_GITHUB_SECRETを、Droneアプリケーションの登録時にGitHubOAuthアプリケーションページからコピーしたキーに設定します。

/etc/drone/server.env
# 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の値をコピーしてください。 エージェントを構成するときに、次のセクションでこれと同じキーを設定する必要があります。 終了したら、ファイルを保存して閉じます。

ドローンエージェントの環境変数ファイルを構成する

次に、ドローンエージェントコンポーネントの環境ファイルを作成します。

新しいファイルを開いて、エージェント環境変数を設定します。

  1. sudo nano /etc/drone/agent.env

内部では、2つの値を定義するだけで済みます。 DRONE_SECRETは、sever.envファイルの構成と一致します。

DRONE_SERVER設定は、エージェントがドローンサーバーコンポーネントに接続する方法を構成します。 wss://プロトコルプレフィックスで始まり、接続が暗号化されたWebソケットを使用し、その後に/ws/brokerURIが追加されたDroneサーバーのドメイン名が続くことを示します。

/etc/drone/agent.env
DRONE_SECRET=secret_generated_on_command_line
DRONE_SERVER=wss://example.com/ws/broker

終了したら、ファイルを保存して閉じます。

ドローンSystemdユニットファイルを構成する

構成ファイルが配置されたので、Droneサービスを管理するためのsystemdユニットファイルを定義できます。

/etc/systemd/systemディレクトリにある新しい.serviceファイルを開いて、サービスを構成します。

  1. sudo nano /etc/systemd/system/drone.service

次の内容を内側に貼り付けます。

/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属性を検索します。

  1. 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定義が見つからない場合は、代わりにこれらのフォールバックブロックを定義するファイルを使用する必要があります。

ドメインに最もよく関連付けられているファイルをテキストエディタで開きます。

  1. sudo nano /etc/nginx/sites-enabled/default

内部では、既存のserverブロックの外部に2つのセクションを追加することから始めます。

/ etc / nginx / sites-enabled / default
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 /ブロックの内容を次のディレクティブに置き換えます。 競合を避けるために、必ずコメントアウトするか、そのブロックから既存の構成を削除してください。

/ etc / nginx / sites-enabled / default
. . .
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構成を確認します。

  1. sudo nginx -t
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

出力に構成の問題があったことが示されている場合は、戻ってNginx構成をもう一度確認してください。

続行する準備ができたら、Nginxを再起動します。

  1. sudo systemctl restart nginx

Nginxがエージェントとサーバー間でリクエストをプロキシできるようになったので、Droneを起動できます。

  1. sudo systemctl start drone

サービスが正常に開始できたことを確認してください。

  1. 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ログを確認できます。

  1. sudo less /var/log/nginx/error.log

次のように入力して、ドローンのログを確認できます。

  1. sudo journalctl -u drone

すべてが正常に実行されている場合は、次のように入力して、起動時にドローンを起動できるようにします。

  1. sudo systemctl enable drone

ドローンサービスは、DockerおよびNginxサービスが利用可能になった後に起動します。

ドローンにログインして、リポジトリへのアクセスを承認します

Droneが稼働しているので、Webインターフェイスにログインして、アプリケーションがGitHubアカウントを使用することを承認できます。

Webブラウザでサーバーのドメイン名にアクセスして、DroneWebインターフェイスを表示します。

https://example.com

初めてアクセスすると、ログインするように求められます。

Drone initial visit

ログインをクリックして、OAuthを使用してGitHubアカウントでドローンに認証します。 現在GitHubにログインしていない場合は、最初にGitHubにログインするように指示されます。

その後、DroneがGitHubアカウントにアクセスすることを許可するように求められます。

Drone allow access through GitHub

要求された権限を確認して調整を行った後、ユーザー名の承認ボタンをクリックしてドローンを承認します。

ドローンサーバーにリダイレクトされます。

Drone logged in

ここから、コードを自動的にテストするようにリポジトリをアクティブ化および構成できます。

結論

このガイドでは、GitHubプロジェクトの継続的インテグレーションおよびデリバリーサーバーとしてDroneをセットアップしました。 ドローンサーバーを中央ハブとして構成し、作業を委任し、認証を処理し、リポジトリからの変更をリッスンしました。 また、テストを実行してコンテナーを管理できるDroneエージェントを構成しました。 これらすべての前に、安全なリバースプロキシとして機能するようにNginxを構成しました。

リポジトリに対してテストを自動的に実行するようにドローンを設定する準備ができたら、ドローンのドキュメントをチェックして、テスト手順で.drone.ymlファイルを定義する方法を確認してください。