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

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

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

  • 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ファイルで使用すると自動的にダウンロードされます。 ただし、プロセスを少しスピードアップするために、事前に画像をプルダウンすることができます。

  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」としてマークします。 その後、上記の両方のサービスのサービスを定義します。

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

/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_HOSTDRONE_SECRET 値。 設定 DRONE_SECRET コマンドラインで生成したキーに。 The DRONE_HOST 設定は、ドローンに公的にアクセス可能なアドレスを通知します。 これは、Let’sEncryptで保護されたドメインである必要があります。 https:// スキーマ指定子:

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

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

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

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

それを確認してください DRONE_ADMIN GitHubアカウント名が含まれています。

その後、設定してGitHub統合プラグインをアクティブ化します DRONE_GITHUBtrue. 次に、 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つの値を定義するだけで済みます。 The DRONE_SECRET の構成と一致します sever.env ファイル。

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

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

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

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

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

新しいを開く .service のファイル /etc/systemd/system サービスを構成するディレクトリ:

  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

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

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

/ 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;
    }
    . . .
}

The proxy_pass 行は、このブロックから配信されるすべてのトラフィックをに渡すようにNginxに指示します upstream 前に定義しました。 次に、からのプロキシヘッダー定義をいくつか含めます。 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アカウントを使用することを承認できます。

ドローンのウェブインターフェースを表示するには、ウェブブラウザでサーバーのドメイン名にアクセスしてください。

https://example.com

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

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

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

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

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

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

結論

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

リポジトリに対してテストを自動的に実行するようにドローンを設定する準備ができたら、ドローンのドキュメントをチェックして、 .drone.yml テスト手順を提出します。