前書き

Droneは、Goで構築された人気のある継続的な統合および配信プラットフォームです。 GitHub、GitLab、Bitbucketなどの多くの一般的なバージョン管理リポジトリサービスと統合して、コードの変更を監視し、コミットされた変更を自動的にビルドおよびテストします。

このガイドでは、インフラストラクチャに完全なドローン継続的統合環境をセットアップする方法を示します。 Droneをインストールし、ソースコードリポジトリと統合するように構成します。 途中で、Let’s Encryptで保護されたNginxをDroneのフロントエンドとして設定します。 これにより、ドローンのウェブインターフェースへのリクエストが暗号化され、CIサーバーがソースコードサーバーと安全に統合できるようになります。

前提条件

開始するには、管理タスク用に非ルートの `+ sudo +`ユーザーで設定されたUbuntu 16.04サーバーが必要です。 サーバーには、着信接続をフィルタリングするためのファイアウォールも必要です。 Ubuntu 16.04初期サーバーセットアップガイドを参照して、これらのアイテムを構成する方法を学ぶことができます。

セットアップのその他の要件を満たすには、いくつかの追加手順を完了する必要があります。 Droneは主にDockerイメージとして配布されるため、Docker Composeを使用してCIサーバーコンテナーを管理します。 セキュリティとパフォーマンスのために、Let’s Encryptで保護されたNginxインスタンスを介してリクエストをDroneにプロキシします。 これを適切に設定するには、CIサーバーにドメイン名を添付する必要があります。

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

上記のガイドを完了したら、Droneサーバーには次のものが必要です。

  • 管理タスク用に設定された `+ sudo +`ユーザー

  • UFWファイアウォールが有効になっています。 それぞれポート22、80、および443のSSH、HTTP、およびHTTPSリクエストを除くすべての接続をブロックする必要があります。

  • DockerおよびDocker Composeがインストールされています。

  • Let’s Encryptが提供するSSL証明書で構成されたNginxサーバー

開始する準備ができたら、以下に進みます。

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

コードの変更を監視してビルドおよびテスト段階をトリガーするには、Droneがソースコードリポジトリにアクセスする必要があります。 Droneは、http://docs.drone.io/install-for-github/ [GitHub]、http://docs.drone.io/install-for-gitlab/ [GitLab]、http:// docsと統合できます。 drone.io/install-for-gogs/[Gogs]、http://docs.drone.io/install-for-bitbucket-cloud/[Bitbucket Cloud]、およびhttp://docs.drone.io/install- for-bitbucket-server / [Bitbucket Server]。

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

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

画像:https://assets.digitalocean.com/articles/drone_install_1604/github_settings.png [ドローンGitHub設定]

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

image:https://assets.digitalocean.com/articles/drone_install_1604/oauth_apps.png [ドローンOAuthアプリケーション]

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

image:https://assets.digitalocean.com/articles/drone_install_1604/new_app.png [ドローンの新しいアプリ]

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

image:https://assets.digitalocean.com/articles/drone_install_1604/define_new_app.png [ドローンは新しいアプリを登録します]

次のフィールドに入力する必要があります(これらのフィールドはGitHubにあります。 他のリポジトリプロバイダーには異なるプロンプトが表示される場合があります):

  • アプリケーション名:統合を識別するために選択した名前。 「ドローン」は、特別なニーズがない場合に適しています。

  • *ホームページのURL *:ドローンサーバーのドメイン名。 保護されたドメインを使用しているため、ここで「+ https:// +」を使用します。

  • アプリケーションの説明:ドローンの簡単な説明とその目的。

  • *認証コールバックURL *:これは、 `+ https:// `スキーマ指定子であり、その後にドローンサーバーのドメイン名、その後に ` / authorize `が続く必要があります。 ドメイン名が「+」の場合、このファイルは「+ https:/// authorize」になります。

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

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

image:https://assets.digitalocean.com/articles/drone_install_1604/client_info.png [ドローンクライアント情報]

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

ドローンDockerイメージを引き出して構成の準備をする

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

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

docker pull drone/drone:0.7

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

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

sudo mkdir /etc/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ファイルを使用して、これら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

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

ドローンサーバーの環境変数ファイルを構成する

次に、上記のDocker Composeファイルで参照した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’s Encrypt保護ドメインである必要があります。

/etc/drone/server.env

# Service settings
DRONE_SECRET=
DRONE_HOST=https://

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

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

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

その後、 `+ DRONE_GITHUB `を ` true `に設定してGitHub統合プラグインを有効にします。 次に、Droneアプリケーションを登録したときにGitHub OAuthアプリケーションページからコピーしたキーに、「 DRONE_GITHUB_CLIENT 」と「 DRONE_GITHUB_SECRET +」を設定します。

/etc/drone/server.env

# Service settings
DRONE_SECRET=
DRONE_HOST=https://

# Registration settings
DRONE_OPEN=false
DRONE_ADMIN=

# GitHub Settings
DRONE_GITHUB=true
DRONE_GITHUB_CLIENT=
DRONE_GITHUB_SECRET=

サーバーコンポーネントの構成が完了しました。 離れる前に、ファイルから `+ DRONE_SECRET +`値をコピーします。 次のセクションでエージェントを構成するときに、この同じキーを設定する必要があります。 完了したら、ファイルを保存して閉じます。

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

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

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

sudo nano /etc/drone/agent.env

内部では、2つの値を定義するだけです。 + DRONE SECRET`は + server.env`ファイルの設定と一致します。

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

/etc/drone/agent.env

DRONE_SECRET=
DRONE_SERVER=wss:///ws/broker

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

ドローンシステムユニットファイルの構成

設定ファイルが用意できたので、systemdユニットファイルを定義してDroneサービスを管理できます。

サービスを設定するには、 + / etc / systemd / system`ディレクトリで新しい + .service`ファイルを開きます:

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システムに指示します。 次に、Docker Composeと以前に作成した構成ファイルを使用して、Droneサービスを開始および停止するコマンドを定義します。 最後に、最後のセクションでは、ブート時にサービスを開始できるようにする方法を定義します。

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

Droneサービスを開始する前に、Nginxを構成する必要があります。 DroneエージェントはDroneサーバーに接続できる必要があり、接続はNginxプロキシが存在することに依存しています。

リクエストをドローンにプロキシするためのNginxの構成

次に、Nronexの設定を変更して、Droneサーバーへのリクエストをプロキシする必要があります。

Let’s Encryptで保護されたドメインを処理するサーバーブロック構成を見つけることから始めます。 次のように入力して、有効なすべてのサーバーブロックで「+ server_name +」属性を検索します。

grep -R server_name /etc/nginx/sites-enabled
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;

上記の出力では、ドメイン名(この例では + 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 ; +`行はフォールバックメカニズムとして機能するサーバーブロックを表します。 「」ホスト指定子は無効なホストであるため、単独では一致しません。

設定では、これらは `+ default_server `オプションを設定する ` listen `ディレクティブとペアになり、リクエストされたホストが他の定義されたサーバーブロックと一致しない場合にブロックがデフォルトとして機能するようになります。 ドメイン名に一致する ` server_name +`定義が見つからない場合は、代わりにこれらのフォールバックブロックを定義するファイルを使用する必要があります。

テキストエディターでドメインに最も関連するファイルを開きます。

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

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

/ etc / nginx / sites-enabled / default

server {
   . . .

最初のブロックは、リクエストをプロキシできる「+ drone 」と呼ばれるアップストリームの場所を設定します。 ` server +`ディレクティブは、ポート8000​​で実行されるDroneサービスへの接続方法を定義します。

2番目のブロックは、「+ $ http_upgrade 」変数の値に基づいて「 $ connection_upgrade 」と呼ばれるユーザー定義変数を設定します。これは、Nginxが「Upgrade」HTTPヘッダーを受信したときに設定します。 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 `行は、このブロックから提供されるすべてのトラフィックを先に定義した ` upstream `に渡すようにNginxに指示します。 次に、 ` proxy_params `ファイルからいくつかのプロキシヘッダー定義を含め、以前の ` map +`設定に基づいて追加のヘッダーを追加します。

次に、他のプロキシ固有の設定を調整して、WebSocketプロキシが正しく機能するようにし、コンポーネントが効果的に通信できるようにします。

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

NginxとDroneのテストと再起動

これで設定が完了しました。 構成を実装するには、サービスを開始または再起動するだけです。

開始するには、構文エラーの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:  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

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

sudo journalctl -u drone

すべてが正常に実行されている場合は、次のように入力して、起動時にDroneを有効にします。

sudo systemctl enable drone

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

ドローンにログインしてリポジトリへのアクセスを許可する

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

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

https://

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

image:https://assets.digitalocean.com/articles/drone_install_1604/login_drone.png [ドローン初期訪問]

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

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

image:https://assets.digitalocean.com/articles/drone_install_1604/authorize_app.png [ドローンはGitHubを介したアクセスを許可する]

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

Droneサーバーにリダイレクトされます:

画像:https://assets.digitalocean.com/articles/drone_install_1604/logged_in.png [ログインしているドローン]

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

結論

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

リポジトリに対して自動的にテストを実行するようにDroneをセットアップする準備ができたら、http://docs.drone.io/getting-started/ [Drone documentation]をチェックして、 `+ .drone.yml +を定義する方法を学びます。 `テスト手順を記載したファイル。