Ubuntu20.04にドローンをインストールして構成する方法
著者は、 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互換サーバーにログを保存したりするオプションもあります。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
- 少なくとも1GBのRAM、2GBの空きディスク容量、および
sudo
権限を持つ非rootユーザーを備えた1台のUbuntu20.04サーバー。 サーバーの初期設定に従って、マシンを構成できます。
注:このチュートリアルでは、必要に応じてドロップレットの数を自動的にスケーリングする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_key
とyour_s3_secret_key
が表示されている場所に両方の値を入力する必要があります。 または、別のS3互換サービスを使用するか、このステップ(ステップ3)を完全にスキップすることもできます。 この手順をスキップすることは、ドローンを試している場合、またはビルドボリュームが非常に少なくなることがわかっている場合にのみお勧めします。 - GitHubアカウント。
ステップ1—GitHubアプリケーションを作成する
コードにアクセスし、ユーザーを認証し、イベントを受信するためのWebhookを追加するには、DroneにGitHub用のOAuthアプリケーションが必要です。 他のプロバイダーについては、ここでドローンの公式ドキュメントを読むことができます。
GitHubのOAuthアプリケーションを設定するには、GitHubアカウントにログインしてから、右上のユーザーメニューをクリックします。 設定をクリックし、左側のメニューで開発者設定カテゴリを見つけて、OAuthアプリケーションをクリックします。 または、Githubの開発者設定ページに直接移動することもできます。
次に、新しいアプリケーションを作成します。 右上隅にある新しいOAuthアプリボタンをクリックすると、空白のフォームが表示されます。
アプリケーション名には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
コマンドを使用して作成します。
- openssl rand -hex 16
openssl
は、ランダムな16ビットの16進数を生成します。 次のような出力が生成されます。
Output918...46c74b143a1719594d010ad24
独自の出力をクリップボードにコピーします。 次のコマンドに追加し、your_rpc_secret
を置き換えます。
次に、ドローン構成ファイルを作成します。 この構成ファイルを継続的に開いたり閉じたりするのではなく、tee
コマンドを利用します。これにより、コマンドの出力がコンソールに分割され、Droneの構成ファイルにも追加されます。 このチュートリアルのすべてのコマンドブロックの後に説明が続きますが、利用可能なすべてのドローンオプションの詳細な説明は、公式ドキュメントにあります。
次に、ドローンサーバーの構成の構築を開始します。 次のコマンドを端末にコピーします。 必ずdrone.your_domain
をドメインに置き換えてください。 また、your_github_client_id
とyour_github_client_secret
をGitHubOAuthクレデンシャルに置き換えてから、your_rpc_secret
をopenssl
コマンドからの出力に置き換えます。 最後に、sammy_the_shark
をGitHubユーザー名に置き換えます。 これにより、管理者権限が付与されます。
- cat <<
- 'EOF' | sudo tee /etc/drone
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
EOF
このコマンドは、ヒアドキュメントを利用します。 ヒアドキュメントでは、<<
リダイレクト演算子の後に任意の単語を使用します。ここで、EOF
は、通常、ファイルの終わりを表すために使用されます。 これにより、ユーザーは、EOF
またはユーザーが選択した任意の単語で終わる複数行の入力を書き込むことができます。 ファイルの終わりを囲む引用符は、リテラルを回避する方法と同様に、変数の置換に関してテキストを解析する方法に影響を与えます。 これは非常に便利なツールであり、この場合はファイルを作成してから行を追加するために使用します。 ここでは、最初のドローン構成を追加し、EOF
で終了します。 次に、この入力はcat
コマンドにリダイレクトされ、cat
コマンドの出力は|
パイプ演算子を介してtee
コマンドにパイプされます。 ヒアドキュメントは、テキストをすばやく作成したり、ファイルに追加したりするための優れた方法です。
次に、任意のユーザーがDroneサーバーにログインしてランナーにアクセスできないようにするために、登録を指定されたユーザー名または組織に制限します。 この時点でユーザーを追加する必要がある場合は、次のコマンドを実行して、users
をGitHubユーザー名または組織名のコンマ区切りリストに置き換えます。
- echo 'DRONE_USER_FILTER=users' | sudo tee -a /etc/drone
外部ロードバランサーまたはSSLプロキシを使用していない場合は、Let’s EncryptforHTTPSを有効にする必要もあります。
- echo 'DRONE_TLS_AUTOCERT=true' | sudo tee -a /etc/drone
tee
コマンドに-a
スイッチが含まれていることに注意してください。このスイッチは、tee
に、この出力をドローン構成ファイルに上書きせずに追加するように指示します。 次に、ログストレージシステムをセットアップしましょう。
ステップ3—ビルドログを外部に保存する(オプション)
頻繁に使用されるインストールの場合、ビルドログの量は数ギガバイトまで急速に増加する可能性があります。 デフォルトでは、これらのログはサーバーのデータベースに保存されますが、パフォーマンス、スケーラビリティ、および安定性のために、ビルドログ用に外部ストレージを設定することを検討してください。 このステップでは、DigitalOceanSpacesを使用してそれを実行します。 これらの手順を変更して、別のS3互換ストレージサービスを使用することを歓迎します。CI/ CDワークフローのプロトタイプを作成している場合、またはビルドボリュームが非常に少ないことがわかっている場合は、まったく使用しないでください。 そのような場合は、今すぐステップ4に進むことができます。
LogをDigitalOceanSpacesに保存するには、必要な前提条件を満たし、Spacesバケットを設定し、一致する SpacesAccessKeyとSecretを生成したことを確認してください。 そのキーをクリップボードにコピーしてから、次のコマンドで構成ファイルを更新します。
- cat <<
- 'EOF' | sudo tee -a /etc/drone
DRONE_S3_ENDPOINT=
- your_s3_endpoint
DRONE_S3_BUCKET=
- your_s3_bucket_name
AWS_ACCESS_KEY_ID=
- your_s3_access_key
AWS_SECRET_ACCESS_KEY=
- your_s3_secret_key
EOF
your_s3_endpoint
をスペースのURLに、your_s3_bucket_name
を作成したスペースの名前に、your_s3_access_key
をアクセスキーに、your_s3_secret_key
をに置き換えることを忘れないでください。あなたの秘密。 コントロールパネルの最初の2つの値は、管理メニューボタンをクリックし、スペースをクリックして、新しいスペースを選択することで確認できます。 アカウントメニューボタンをクリックし、 API ボタンをクリックして、スペースセクションが見つかるまで下にスクロールすると、スペースアクセスキーを取得できます。 秘密鍵を置き忘れた場合は、新しいアクセス鍵と秘密のペアを生成する必要があります。
これで、ドローン構成ファイルが完成しました。 cat
コマンドを実行して表示します。
- cat /etc/drone
選択したオプションに応じて、構成ファイルは次のようになります。
OutputDRONE_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イメージをプルします。
- docker pull drone/drone:1
次に、SQLiteデータベースを保存するボリュームを作成します。
- docker volume create drone-data
最後に、サーバーを起動し、起動時に再起動するように設定し、ポート80
と443
をサーバーに転送します。
- 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を開く必要があります。
- sudo ufw allow 80
- sudo ufw allow 443
次に、ufw
をリロードし、ルールが更新されたことを確認します。
- sudo ufw reload
- sudo ufw status
次のような出力が表示されます。
OutputStatus: 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クレデンシャルを入力し、プロンプトが表示されたら新しいアプリケーションを承認します。
これでドローンサーバーが稼働し、ほぼ使用できるようになりました。 ドローンランナーやDigitalOceanオートスケーラーの構成だけが残ります。
ステップ5—オプション1:DockerRunnerのインストール
サーバーがジョブを実行する前に、ランナーを設定する必要があります。
DigitalOceanドロップレットを使用してランナーを自動的にスケーリングする場合は、オプション2:DigitalOcean用ドローンオートスケーラーのインストールまでスキップしてください。 別のランナーを使用する場合は、代わりにそれを設定して、ステップ7にスキップできます。 それ以外の場合は、オプション1 に従って、Dockerランナーをインストールします。
オプション1:DockerRunnerのインストール
まず、ランナーのDockerイメージをプルします。
- docker pull drone/drone-runner-docker:1
次に、ランナーを開始します。 drone.your_domain
とyour_rpc_secret
を個人の値に置き換えます。 DRONE_RUNNER_CAPACITY
を変更して、一度に実行されるパイプラインの数を増やすことができますが、使用可能なシステムリソースに注意してください。
- 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
最後に、ランナーが正常に起動したことを確認します。
- docker logs drone-runner
次のような出力が表示されます。
Outputtime="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
です。
次に、次のコマンドを使用して新しい文字列を生成します。
- openssl rand -hex 16
Outpute5cd27400...92b684526c622
手順2で行ったように出力をコピーします。 この新しい出力はdrone_user_token
です。
次に、次の新しい資格情報を持つ新しいマシンユーザーを追加します。
- 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
と呼びます。 前提条件のセクションでこの手順を完了しなかった場合は、このガイドを使用して今すぐ作成できます。 このトークンは非常に安全に保管してください。 アカウントのすべてのリソースへのフルアクセスを許可します。
最後に、ドローンオートスケーラーを起動できます。 強調表示されたすべての変数を、一致する独自のクレデンシャルに置き換えてください。
- docker volume create drone-autoscaler-data
- 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時間実行されたままになり、非アクティブになると自動的に破棄されることに注意してください。
その後、オートスケーラーが次のコマンドで正しく起動したことを確認します。
- docker logs drone-autoscaler
オートスケーラーを使用しないことにした場合は、docker rm drone-autoscaler
を使用してコンテナーを削除し、アカウントから残りのドロップレット(存在する場合)を削除して、DigitalOceanAPIトークンを取り消します。 これで、新しいCI/CDワークフローをテストする準備が整いました。
ステップ6—YAMLパイプラインを作成する
新しいドローンのインストールをテストするために、YAMLパイプラインを作成しましょう。
まず、GitHubに新しいリポジトリを作成します。 GitHubプロファイルページからリポジトリメニューをクリックし、右上にある緑色の新規ボタンをクリックします。 次のページでリポジトリに名前を付けてから、緑色のリポジトリの作成ボタンをクリックします。 次に、ドローンサーバーに移動し、 SYNC を押してページを更新すると、新しく作成されたリポジトリが表示されます。 横にあるACTIVATEボタンを押します。
その後、.drone.yml
という名前の新しいファイルをリポジトリに作成します。 これは、GitHubのUIを使用するか、コマンドラインからgit
を使用して実行できます。 GitHub UIから、リポジトリメニューをクリックし、新しいリポジトリをクリックして、ファイルの追加ドロップダウンメニューをクリックします。 新しいファイルの作成を選択し、ファイルに.drone.yaml
という名前を付けて、次の内容を追加します。
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
を使用して、詳細についてドローンのログを表示できます。
これで、CI/CDワークフローを処理するためのドローンサーバーがセットアップおよびインストールされました。
結論
このチュートリアルでは、GitHubプロジェクトで使用するためにDrone CI / CDサーバーをセットアップし、オプションでビルドログ用の外部ストレージをセットアップします。 また、DigitalOcean Dropletsを使用して自動的にスケーリングするように、ローカルランナーまたはサービスを設定します。
ステップ2で概説したプロセスを使用して、チームメイトやその他の許可されたユーザーをドローンに追加し続けることができます。 新規ユーザーがサインアップできないようにしたい場合は、次のコマンドを実行します。
- echo 'DRONE_REGISTRATION_CLOSED=true' | sudo tee -a /etc/drone
- docker restart drone
ドローンは非常に有能なツールです。 ここから、パイプライン構文とドローンの他の機能について詳細を学ぶか、Dockerの基本を確認することを検討してください。