著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。

序章

Drone は、Goで記述されたオープンソースのコンテナーネイティブCI/CDプラットフォームです。 YAML、JSON、 JSONNet 、または Starlark で記述された構成ファイルで動作し、複数のステップで構成される複数のビルドパイプラインを定義します。

ドローンは複数のソースコードマネージャーと統合されています。 現在、3つの異なるSCMがサポートされています: GitHub (クラウド/エンタープライズ)、 BitBucket (クラウド/サーバー)、およびGitea。 一般的に、各プロバイダーはすべてのドローン機能をサポートしています。

ドローンは、ジョブを実行するためのさまざまなランナーもサポートしています。 これらのランナーは、構成形式、機能、および実行環境が異なるため、(最も単純なパイプラインを除いて)互換性がありません。 オプションの概要は次のとおりです。

  • まず、2つのコンテナベースのランナーがあります。 Docker Runnerは、最も安定していて最も一般的に使用されるランナーです。 新しいコンテナで各ビルドステップを実行します。 Kubernetesランナーは、新しい(ただしまだ実験的な)オプションです。 Dockerランナーと同様の構文を持ち、DigitalOceanKubernetesと統合できます。
  • 次に、ビルドまたはリポジトリを分離せずにコマンドを直接実行する2つのランナーがあります。 Execランナーは、ホスト上で直接コマンドを実行します。 このランナーはビルド間の分離を提供しないため、Docker内での実行に適していない信頼できるリポジトリーでのみ使用する必要があります(このオプションを使用する前に、特権Dockerコンテナーの使用を検討することをお勧めします)。 SSHランナーはExecに似ていますが、ランナーを実行しているホストとは別のホストでSSHを介してコマンドを実行します。
  • 第三に、クラウドベースの仮想マシンでビルドステップを実行する2つのランナーがあります。 これらは、ホスト上で直接実行する必要があるが、それでも互いに分離されているワークロードに適しています。 DigitalOceanランナーは、ビルドごとに新しいドロップレットを作成し、その中でコマンドを実行します。 スケーリング機能のみが必要な場合でも、Dockerランナーを使用できますが、自動スケーラーが有効になっています(これについては後で詳しく説明します)。 MacStadiumランナーを使用すると、クラウド内のmacOSマシンでビルドを実行できます。 このオプションは、特殊なワークロードにのみ役立ちます。

このチュートリアルでは、GitHubでソースコード用のDroneCI/ CDサーバーをセットアップし、Dockerランナーを追加し、 Let’s Encrypt を使用してインスタンスを保護してから、YAMLを作成しますパイプライン。 また、ドローンオートスケーラーを使用してランナーをスケーリングしたり、DigitalOceanSpacesなどのS3互換サーバーにログを保存したりするオプションもあります。

前提条件

このチュートリアルを開始する前に、次のものが必要です。

:このチュートリアルでは、必要に応じてドロップレットの数を自動的にスケーリングするDigitalOceanでオートスケーラー機能を使用するようにドローンをオプションで構成します。 このルートを選択する場合は、アカウントが制限内にとどまるようにしてください。 DigitalOceanでは、ほとんどのユーザーのデフォルトの制限は5ドロップレットですが、サポートに連絡して増加をリクエストできます。 これを行うには、アカウントのクラウドダッシュボードにアクセスし、左側のメニューでACCOUNTを見つけます。 サブメニューが表示されます。 設定をクリックします。 アカウントのユーザー名とMember sinceの日付を表示するページが開きます。 この日付の下に、Droplet Limit:5 Increaseのような行が表示されます。 増加をクリックして、ドロップレットの追加リクエストを送信します。

さらに、このチュートリアルで説明するオートスケーラーパスには、DigitalOceanのパーソナルアクセストークンが必要です。 Autoscalerをインストールすることを選択した場合は、このチュートリアルに従って、DigitalOceanコントロールパネルからトークンを取得できます。 ページを離れる前に、このキーをコピーしてください。 ページを離れるか更新すると消えます。ステップ6で入力する必要があります。

最後に、ドローンのオートスケーラー機能をインストールしないことを選択した場合、パイプラインを実行できるようにするには、少なくともさらに2GBのRAMと10GBの空きディスク容量が必要になります。

  • サーバーのIPを指す利用可能なAレコードを持つドメイン(またはサブドメイン)。 DigitalOceanでDNSを管理している場合は、このガイドに従ってIPをドメインに関連付けることができます。 このチュートリアルでは、drone.your_domainを使用します。
  • サーバーにDockerがセットアップされました。 手順については、 Ubuntu20.04にDockerをインストールして使用する方法に関するこのチュートリアルに従うことができます。
  • DigitalOceanSpacesにログを保存するオプションが表示されます。 この手順を実行するには、アカウントにDigitalOceanスペースを追加する必要があります。また、スペースアクセスキーを生成する必要があります。 アクセスキーとシークレットを安全な場所にコピーします。 このページを離れるか更新すると、シークレットは消えます。your_s3_access_keyyour_s3_secret_keyが表示されている場所に両方の値を入力する必要があります。 または、別のS3互換サービスを使用するか、このステップ(ステップ3)を完全にスキップすることもできます。 この手順をスキップすることは、ドローンを試している場合、またはビルドボリュームが非常に少なくなることがわかっている場合にのみお勧めします。
  • GitHubアカウント。

ステップ1—GitHubアプリケーションを作成する

コードにアクセスし、ユーザーを認証し、イベントを受信するためのWebhookを追加するには、DroneにGitHub用のOAuthアプリケーションが必要です。 他のプロバイダーについては、ここでドローンの公式ドキュメントを読むことができます

GitHubのOAuthアプリケーションを設定するには、GitHubアカウントにログインしてから、右上のユーザーメニューをクリックします。 設定をクリックし、左側のメニューで開発者設定カテゴリを見つけて、OAuthアプリケーションをクリックします。 または、Githubの開発者設定ページに直接移動することもできます。

次に、新しいアプリケーションを作成します。 右上隅にある新しいOAuthアプリボタンをクリックすると、空白のフォームが表示されます。

Example Form

アプリケーション名にはDroneを使用してください。 drone.your_domainを独自のドメインに置き換え、アプリの簡単な説明を追加してから、承認コールバックURLにdrone.your_domain/loginを追加します。

アプリケーションの登録をクリックすると、アプリケーションに関する情報を含むダッシュボードが表示されます。 ここに含まれているのは、アプリのクライアントIDクライアントシークレットです。 これらの2つの値を安全な場所にコピーします。 your_github_client_idおよびyour_github_client_secretが表示されている場合は、次の手順でそれらを使用する必要があります。

アプリがGitHubに登録されたら、Droneを構成する準備が整います。

ステップ2—ドローン構成の作成

次に、Docker構成の準備を開始します。これにより、Droneサーバーが構築されます。 まず、メインのドローンインスタンスでランナーを認証するための共有シークレットを生成します。 opensslコマンドを使用して作成します。

  1. openssl rand -hex 16

opensslは、ランダムな16ビットの16進数を生成します。 次のような出力が生成されます。

Output
918...46c74b143a1719594d010ad24

独自の出力をクリップボードにコピーします。 次のコマンドに追加し、your_rpc_secretを置き換えます。

次に、ドローン構成ファイルを作成します。 この構成ファイルを継続的に開いたり閉じたりするのではなく、teeコマンドを利用します。これにより、コマンドの出力がコンソールに分割され、Droneの構成ファイルにも追加されます。 このチュートリアルのすべてのコマンドブロックの後に説明が続きますが、利用可能なすべてのドローンオプションの詳細な説明は、公式ドキュメントにあります。

次に、ドローンサーバーの構成の構築を開始します。 次のコマンドを端末にコピーします。 必ずdrone.your_domainをドメインに置き換えてください。 また、your_github_client_idyour_github_client_secretをGitHubOAuthクレデンシャルに置き換えてから、your_rpc_secretopensslコマンドからの出力に置き換えます。 最後に、sammy_the_sharkをGitHubユーザー名に置き換えます。 これにより、管理者権限が付与されます。

  1. cat <<
  2. 'EOF' | sudo tee /etc/drone DRONE_SERVER_HOST=
  3. drone.your_domain
  4. DRONE_SERVER_PROTO=https
  5. DRONE_GITHUB_CLIENT_ID=
  6. your_github_client_id DRONE_GITHUB_CLIENT_SECRET=
  7. your_github_client_secret DRONE_RPC_SECRET=
  8. your_rpc_secret DRONE_USER_CREATE=username:
  9. sammy_the_shark,admin:true EOF

このコマンドは、ヒアドキュメントを利用します。 ヒアドキュメントでは、<<リダイレクト演算子の後に任意の単語を使用します。ここで、EOFは、通常、ファイルの終わりを表すために使用されます。 これにより、ユーザーは、EOFまたはユーザーが選択した任意の単語で終わる複数行の入力を書き込むことができます。 ファイルの終わりを囲む引用符は、リテラルを回避する方法と同様に、変数の置換に関してテキストを解析する方法に影響を与えます。 これは非常に便利なツールであり、この場合はファイルを作成してから行を追加するために使用します。 ここでは、最初のドローン構成を追加し、EOFで終了します。 次に、この入力はcatコマンドにリダイレクトされ、catコマンドの出力は|パイプ演算子を介してteeコマンドにパイプされます。 ヒアドキュメントは、テキストをすばやく作成したり、ファイルに追加したりするための優れた方法です。

次に、任意のユーザーがDroneサーバーにログインしてランナーにアクセスできないようにするために、登録を指定されたユーザー名または組織に制限します。 この時点でユーザーを追加する必要がある場合は、次のコマンドを実行して、usersをGitHubユーザー名または組織名のコンマ区切りリストに置き換えます。

  1. echo 'DRONE_USER_FILTER=users' | sudo tee -a /etc/drone

外部ロードバランサーまたはSSLプロキシを使用していない場合は、Let’s EncryptforHTTPSを有効にする必要もあります。

  1. echo 'DRONE_TLS_AUTOCERT=true' | sudo tee -a /etc/drone

teeコマンドに-aスイッチが含まれていることに注意してください。このスイッチは、teeに、この出力をドローン構成ファイルに上書きせずに追加するように指示します。 次に、ログストレージシステムをセットアップしましょう。

ステップ3—ビルドログを外部に保存する(オプション)

頻繁に使用されるインストールの場合、ビルドログの量は数ギガバイトまで急速に増加する可能性があります。 デフォルトでは、これらのログはサーバーのデータベースに保存されますが、パフォーマンス、スケーラビリティ、および安定性のために、ビルドログ用に外部ストレージを設定することを検討してください。 このステップでは、DigitalOceanSpacesを使用してそれを実行します。 これらの手順を変更して、別のS3互換ストレージサービスを使用することを歓迎します。CI/ CDワークフローのプロトタイプを作成している場合、またはビルドボリュームが非常に少ないことがわかっている場合は、まったく使用しないでください。 そのような場合は、今すぐステップ4に進むことができます。

LogをDigitalOceanSpacesに保存するには、必要な前提条件を満たし、Spacesバケットを設定し、一致する SpacesAccessKeyとSecretを生成したことを確認してください。 そのキーをクリップボードにコピーしてから、次のコマンドで構成ファイルを更新します。

  1. cat <<
  2. 'EOF' | sudo tee -a /etc/drone DRONE_S3_ENDPOINT=
  3. your_s3_endpoint DRONE_S3_BUCKET=
  4. your_s3_bucket_name AWS_ACCESS_KEY_ID=
  5. your_s3_access_key AWS_SECRET_ACCESS_KEY=
  6. your_s3_secret_key EOF

your_s3_endpointをスペースのURLに、your_s3_bucket_nameを作成したスペースの名前に、your_s3_access_keyをアクセスキーに、your_s3_secret_keyをに置き換えることを忘れないでください。あなたの秘密。 コントロールパネルの最初の2つの値は、管理メニューボタンをクリックし、スペースをクリックして、新しいスペースを選択することで確認できます。 アカウントメニューボタンをクリックし、 API ボタンをクリックして、スペースセクションが見つかるまで下にスクロールすると、スペースアクセスキーを取得できます。 秘密鍵を置き忘れた場合は、新しいアクセス鍵と秘密のペアを生成する必要があります。

これで、ドローン構成ファイルが完成しました。 catコマンドを実行して表示します。

  1. cat /etc/drone

選択したオプションに応じて、構成ファイルは次のようになります。

Output
DRONE_SERVER_HOST=drone.your_domain DRONE_SERVER_PROTO=https DRONE_GITHUB_CLIENT_ID=your_github_client_id DRONE_GITHUB_CLIENT_SECRET=your_github_client_secret DRONE_RPC_SECRET=your_rpc_secret DRONE_USER_CREATE=username:sammy_the_shark,admin:true DRONE_USER_FILTER=the_shark_org DRONE_TLS_AUTOCERT=true DRONE_S3_ENDPOINT=your_s3_endpoint DRONE_S3_BUCKET=your_s3_bucket AWS_ACCESS_KEY_ID=your_s3_access_key AWS_SECRET_ACCESS_KEY=your_s3_secret_key

構成ファイルが完成したことを確認したら、ドローンサーバーを起動できます。

ステップ4—ドローンのインストールと開始

適切な構成が整ったら、次のステップはドローンをインストールして起動することです。

まず、DroneServerDockerイメージをプルします。

  1. docker pull drone/drone:1

次に、SQLiteデータベースを保存するボリュームを作成します。

  1. docker volume create drone-data

最後に、サーバーを起動し、起動時に再起動するように設定し、ポート80443をサーバーに転送します。

  1. docker run --name=drone --detach --restart=always --env-file=/etc/drone --volume=drone-data --publish=80:80 --publish=443:443 drone/drone:1

DigitalOcean初期サーバーセットアップガイドに従っている場合は、ufwが有効になっており、ファイアウォールを通過できるのはOpenSSHのみです。 ここで、ポート80と443を開く必要があります。

  1. sudo ufw allow 80
  2. sudo ufw allow 443

次に、ufwをリロードし、ルールが更新されたことを確認します。

  1. sudo ufw reload
  2. sudo ufw status

次のような出力が表示されます。

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80 ALLOW Anywhere 443 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80 (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6)

この時点で、サーバーにアクセスし、ログインして、リポジトリを管理できるようになります。 https://drone.your_domainに移動し、GitHubクレデンシャルを入力し、プロンプトが表示されたら新しいアプリケーションを承認します。

Screenshot

これでドローンサーバーが稼働し、ほぼ使用できるようになりました。 ドローンランナーやDigitalOceanオートスケーラーの構成だけが残ります。

ステップ5—オプション1:DockerRunnerのインストール

サーバーがジョブを実行する前に、ランナーを設定する必要があります。

DigitalOceanドロップレットを使用してランナーを自動的にスケーリングする場合は、オプション2:DigitalOcean用ドローンオートスケーラーのインストールまでスキップしてください。 別のランナーを使用する場合は、代わりにそれを設定して、ステップ7にスキップできます。 それ以外の場合は、オプション1 に従って、Dockerランナーをインストールします。

オプション1:DockerRunnerのインストール

まず、ランナーのDockerイメージをプルします。

  1. docker pull drone/drone-runner-docker:1

次に、ランナーを開始します。 drone.your_domainyour_rpc_secretを個人の値に置き換えます。 DRONE_RUNNER_CAPACITYを変更して、一度に実行されるパイプラインの数を増やすことができますが、使用可能なシステムリソースに注意してください。

  1. docker run --name drone-runner --detach --restart=always --volume=/var/run/docker.sock:/var/run/docker.sock -e DRONE_RPC_PROTO=https -e DRONE_RPC_HOST=drone.your_domain -e DRONE_RPC_SECRET=your_rpc_secret -e DRONE_RUNNER_CAPACITY=1 -e DRONE_RUNNER_NAME=${HOSTNAME} drone/drone-runner-docker:1

最後に、ランナーが正常に起動したことを確認します。

  1. docker logs drone-runner

次のような出力が表示されます。

Output
time="2020-06-13T17:58:33-04:00" level=info msg="starting the server" addr=":3000" time="2020-06-13T17:58:33-04:00" level=info msg="successfully pinged the remote server" time="2020-06-13T17:58:33-04:00" level=info msg="polling the remote server" arch=amd64 capacity=1 endpoint="https://drone.your_domain" kind=pipeline os=linux type=docker

ランナー構成またはシークレットを変更する必要がある場合は、docker rm drone-runnerを使用してコンテナーを削除し、この手順を繰り返します。 これで、ステップ7に進み、基本的なパイプラインを作成できます。

オプション2:DigitalOcean用のドローンオートスケーラーのインストール

DigitalOcean用のドローンオートスケーラーは、必要に応じてDockerランナーを使用してドロップレットを自動的に作成および破棄できます。

まず、ドローンサーバーに移動してログインし、ユーザーメニューのユーザー設定をクリックします。 パーソナルトークンを見つけてコピーします。 これはyour_drone_personal_tokenです。

User Settings

次に、次のコマンドを使用して新しい文字列を生成します。

  1. openssl rand -hex 16
Output
e5cd27400...92b684526c622

手順2で行ったように出力をコピーします。 この新しい出力はdrone_user_tokenです。

次に、次の新しい資格情報を持つ新しいマシンユーザーを追加します。

  1. docker run --rm -it -e DRONE_SERVER=https://drone.your_domain -e DRONE_TOKEN=your_drone_personal_token --rm drone/cli:1 user add autoscaler --machine --admin --token=drone_user_token

ここで、まだ作成していない場合は、読み取り/書き込み権限を持つDigitalOceanAPIトークンを作成する必要があります。 これをyour_do_tokenと呼びます。 前提条件のセクションでこの手順を完了しなかった場合は、このガイドを使用して今すぐ作成できます。 このトークンは非常に安全に保管してください。 アカウントのすべてのリソースへのフルアクセスを許可します。

最後に、ドローンオートスケーラーを起動できます。 強調表示されたすべての変数を、一致する独自のクレデンシャルに置き換えてください。

  1. docker volume create drone-autoscaler-data
  2. docker run --name=drone-autoscaler --detach --restart=always --volume=drone-autoscaler-data -e DRONE_SERVER_PROTO=https -e DRONE_SERVER_HOST=drone.your_domain -e DRONE_SERVER_TOKEN=drone_user_token -e DRONE_AGENT_TOKEN=your_rpc_secret -e DRONE_POOL_MIN=0 -e DRONE_POOL_MAX=2 -e DRONE_DIGITALOCEAN_TOKEN=your_do_token -e DRONE_DIGITALOCEAN_REGION=nyc1 -e DRONE_DIGITALOCEAN_SIZE=s-2vcpu-4gb -e DRONE_DIGITALOCEAN_TAGS=drone-autoscaler,drone-agent drone/autoscaler

作成するドロップレットの最小数/最大数、およびドロップレットのタイプ/リージョンを構成することもできます。 ビルドの開始時間を短縮するには、最小値を1以上に設定します。 また、デフォルトでは、オートスケーラーが新しいドロップレットを毎分作成または破棄する必要があるかどうかを判断し、ドロップレットは作成後少なくとも1時間実行されたままになり、非アクティブになると自動的に破棄されることに注意してください。

その後、オートスケーラーが次のコマンドで正しく起動したことを確認します。

  1. docker logs drone-autoscaler

オートスケーラーを使用しないことにした場合は、docker rm drone-autoscalerを使用してコンテナーを削除し、アカウントから残りのドロップレット(存在する場合)を削除して、DigitalOceanAPIトークンを取り消します。 これで、新しいCI/CDワークフローをテストする準備が整いました。

ステップ6—YAMLパイプラインを作成する

新しいドローンのインストールをテストするために、YAMLパイプラインを作成しましょう。

まず、GitHubに新しいリポジトリを作成します。 GitHubプロファイルページからリポジトリメニューをクリックし、右上にある緑色の新規ボタンをクリックします。 次のページでリポジトリに名前を付けてから、緑色のリポジトリの作成ボタンをクリックします。 次に、ドローンサーバーに移動し、 SYNC を押してページを更新すると、新しく作成されたリポジトリが表示されます。 横にあるACTIVATEボタンを押します。

Screenshot

その後、.drone.ymlという名前の新しいファイルをリポジトリに作成します。 これは、GitHubのUIを使用するか、コマンドラインからgitを使用して実行できます。 GitHub UIから、リポジトリメニューをクリックし、新しいリポジトリをクリックして、ファイルの追加ドロップダウンメニューをクリックします。 新しいファイルの作成を選択し、ファイルに.drone.yamlという名前を付けて、次の内容を追加します。

.drone.yml
name: drone-test
kind: pipeline
type: docker

steps:
- name: test
  image: alpine
  commands:
  - echo "It worked!"

GitHub UIを使用している場合は、ページの下部にある緑色の新しいファイルをコミットボタンを押します。 コマンドラインを使用している場合は、変更をコミットしてプッシュします。 いずれの場合も、ブラウザでドローンダッシュボードを開いて監視します。

ビルドが保留のままで開始されない場合は、ランナーが正しく設定されていることを確認してください(オートスケーラーを使用している場合はドロップレットが作成されていることを確認してください)。 docker logs drone-runnerを使用してランナーのログを表示し、docker logs drone-autoscalerを使用してオートスケーラーのログを表示できます。

オートスケーラーを使用している場合、最初のビルドが開始されるまでに最大1分かかる場合があります(その間の最後のログメッセージはstarting the serverになります)。

ビルドが完了すると、drone-testパイプラインのtestステージのログにIt worked!というテキストが表示されます。 ログの読み込みに失敗した場合は、S3クレデンシャルとバケット名が正しいことを確認してください。 docker logs droneを使用して、詳細についてドローンのログを表示できます。

Screenshot

これで、CI/CDワークフローを処理するためのドローンサーバーがセットアップおよびインストールされました。

結論

このチュートリアルでは、GitHubプロジェクトで使用するためにDrone CI / CDサーバーをセットアップし、オプションでビルドログ用の外部ストレージをセットアップします。 また、DigitalOcean Dropletsを使用して自動的にスケーリングするように、ローカルランナーまたはサービスを設定します。

ステップ2で概説したプロセスを使用して、チームメイトやその他の許可されたユーザーをドローンに追加し続けることができます。 新規ユーザーがサインアップできないようにしたい場合は、次のコマンドを実行します。

  1. echo 'DRONE_REGISTRATION_CLOSED=true' | sudo tee -a /etc/drone
  2. docker restart drone

ドローンは非常に有能なツールです。 ここから、パイプライン構文とドローンの他の機能について詳細を学ぶか、Dockerの基本を確認することを検討してください。