CoreOSおよびDockerでDrone.ioを使用して継続的インテグレーションテストを実行する方法
序章
最小限のセットアップの継続的インテグレーションソリューションが必要ですか? 誰がしません! Drone.io はDockerコンテナーを使用してテストを実行し、 GitHub 、 GitLab (セルフホストおよびサービスベース)、および Bitbucket[ X158X]。
ドローンはGoを使用して構築され、Dockerを利用します。 設定がほとんどなく、コンテナ自体の内部で実行できます。
継続的インテグレーションは、コードベースに頻繁にコミットし、構築とテストを行う開発手法です。 これは、新しいコードが(うまくいけば)既存のコードベースをすばやく簡単に統合することを意味します。 継続的インテグレーションではコードを頻繁にビルドしてテストする必要があるため、自動的にビルドしてテストできる場合は、開発プロセスがスピードアップします。 ドローンはこれを行います。 構築とテストのプロセスを自動化します。
ドローンは、ホストされているGitリポジトリからコードを自動的にプルし、定義したスクリプトを実行します。 任意のテストスイートを実行して、電子メールで報告したり、READMEのバッジでステータスを示したりすることができます。 DroneとDockerの統合は、PHP、Node、Ruby、Go、Pythonなどの膨大な数の言語をサポートできることを意味します。 各テストは、Dockerパブリックレジストリから指定されたイメージに基づいて新しいコンテナを生成します。 これは、言語と開発スタックのサポートは、より多くのイメージが作成されるときにのみ増加することを意味します。 特定のアプリケーションに合わせて独自に作成することもできます。
このチュートリアルでは、 Drone.io をコンテナ化して、最小限のLinuxディストリビューションCoreOSを使用して実行できるようにする方法を見ていきます。
要件
- アカウントに少なくとも1つのSSHキーが追加されました
- 単一のCoreOSベータドロップレット(512 MBのRAMで正常に動作します)
これまでオペレーティングシステムを使用したことがない場合は、続行する前に、このCoreOSの概要を読むことをお勧めします。
cloud-config
ファイルを使用してCoreOSを構成する方法がわからない場合は、詳細情報に加えて、サンプル構成ファイルここを見つけることができます。 このチュートリアルでは、サンプルの構成ファイルが機能します。
ステップ1—GitHubを準備する
始める前に、oAuthを介してGitHubアカウントへのアクセスを有効にする必要があります。 ドローンコンテナを設定する次のステップで使用するトークンのペアを生成します。
GitHubアカウントからこれらの値を生成する必要があります。 ここをクリックして、アプリケーションと呼ばれるGitHubの適切な設定ページに移動します。
右上の新規申請ボタンをクリックしてください。 これにより、入力する新しいフォームが表示されます。
アプリケーション名を追加します。 ホームページのURLはhttp://YOUR_DROPLET_IP:8080/
である必要があります。 アプリケーションの説明を追加します。
重要:正しく認証するには、認証コールバックURLがhttp://YOUR_DROPLET_IP:8080/api/auth/github.com
に設定されていることを確認してください。
それが決まったら、アプリケーションの登録をクリックして、新しいアプリケーションの情報ページに移動します。
ここから、クライアントIDとクライアントシークレットの2ビットの情報が必要になります。 (クライアントシークレットは実際にはシークレットにしてください! これはあなたが誰かと共有すべきものではありません!)
これらのトークンは、Dashboardパネルを介してDroneに追加するGitHubリポジトリにWebhookを追加する独自のDroneアプリケーションを承認するために使用されます。 Webhookは、GitHubにプッシュするすべての新しいコミットでトリガーされます。これにより、Droneは新しい変更のクローンを作成し、ビルドを実行します。
次のステップで必要になるため、これらのトークンをメモしておきます。
ステップ2—Dockerfileを作成します
CoreOSドロップレットの準備ができたら、SSH経由で接続します。
ssh -A core@YOUR_DROPLET_IP
droneio
という名前の新しいディレクトリを作成します。
mkdir droneio cd droneio
CoreOSのルートファイルシステムは読み取り専用であるため、Drone.ioを直接インストールすることはできません。 最初にDockerを使用してコンテナ化する必要があります。 標準のUbuntuシステムの場合と同じように、Drone.ioのインストール手順を含むDockerfileをセットアップします。
このセクションでは、端末ベースのテキストエディタvim
を使用します。 これはCoreOSのデフォルトのテキストエディタであるため、よく理解しておくことが重要です。 これを使用してファイルを開いて編集する方法を段階的に説明します。
次に、vimを使用してDockerfileを作成します。 次のコマンドを実行します。
vim Dockerfile
これによりvimが開き、現在のディレクトリにDockerfile
という新しいファイルが作成されます。
次に、挿入モードに入ります。 これを行うには、i
キーを押します。 ターミナルの左下隅に-- INSERT --
と表示されます。 これで、Dockerfileの内容を入力または貼り付けることができます。
これがDockerfile全体です。 コメントは各セクションにインラインで含まれています。 このファイルを正確にコピーできます。
# Pull from base Ubuntu image FROM ubuntu # Do system updates and install dependencies RUN apt-get update RUN apt-get -y upgrade RUN sudo apt-get -y install git wget RUN apt-get clean # Download Drone.io RUN wget http://downloads.drone.io/master/drone.deb RUN dpkg -i drone.deb # Expose the Drone.io port EXPOSE 8080 ENV DRONE_SERVER_PORT 0.0.0.0:8080 ENV DRONE_DATABASE_DATASOURCE /var/lib/drone/drone.sqlite # Define our GitHub oAuth keys below ENV DRONE_GITHUB_CLIENT <CLIENT_TOKEN_HERE> ENV DRONE_GITHUB_SECRET <CLIENT_SECRET_HERE> # The command we'll be running when the container starts CMD /usr/local/bin/droned
<CLIENT_TOKEN_HERE>
および<CLIENT_SECRET_HERE>
を、上記の手順でメモしたトークンに置き換えます。
以下のコマンドを入力して、行った変更を保存します。 w
はvimにテキストをファイルに書き込むように指示し、q
はvimを終了させます。
:wq
Dockerfileに精通していない人のための非常に簡単な概要:
FROM
-コンテナに使用する画像RUN
-ビルドプロセス中にコンテナ内でコマンドを実行しますEXPOSE
-指定されたポートにコンテナの外部からアクセスできるようにしますCMD
-コンテナの起動時に実行されるコマンドENV
-コンテナ内の環境変数の値を設定します。ここではドローンの構成に使用されます
Dockerfileで作成できるステートメントの種類の詳細については、公式のDockerドキュメントを参照してください。
この時点で、次のコマンドを使用してイメージを作成できます。
docker build -t my_drone .
これが完了するまでに数分かかります。 正常にビルドされたら、新しいイメージを使用してコンテナを起動できます。
ステップ2—ドローンコンテナを起動します
Drone.io には情報を保存する場所が必要なので、SQLiteデータベースファイルを使用します。 最初に空のファイルを作成します。
touch drone.sqlite
コンテナが起動して実行されると、このファイルにはドローンによってデータが入力されます。
Droneの起動はかなり簡単ですが、DroneがホストのDockerサーバーにアクセスできるようにするために、いくつかの追加手順を実行する必要があります。 これを行う最も簡単な方法は、ボリュームを使用して、ホストソケットファイルをコンテナのソケットファイルがある場所にバインドすることです。 コンテナを正しく起動するためのコマンドは次のとおりです。
docker run -d --name="drone-ci" \ -p 8080:8080 \ -v /var/lib/drone/ \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /home/core/droneio/drone.sqlite:/var/lib/drone/drone.sqlite \ my_drone
行ごとに、正確に何が起こっているのかを分解してみましょう。
docker run -d --name="drone-ci"
-コマンドのこの部分では、Dockerにこのコンテナーをバックグラウンドで実行するように指示しているため、SSHセッションから切断した場合にコンテナーが停止することを心配する必要はありません。 また、わかりやすい名前 drone-ci を付けているので、docker
コマンドを使用して管理できます。-p 8080:8080
-ここでは、ホストからのポート8080をコンテナー内の同じポートにバインドします。 これにより、実行中のコンテナのネットワークの外部でドローンのインターフェースにアクセスできます。-v /var/lib/drone
-これにより、コンテナー内に保管するためのボリュームがセットアップされます。-v /var/run/docker.sock:/var/run/docker.sock
-これは、Drone.ioコンテナーがホストのDockerシステムを制御できるようにするトリックです。 DockerUNIXソケットが存在するコンテナの場所を実際のホストのDockerUNIXソケットにバインドしています。 つまり、Droneが実行されているコンテナー内ではなく、ホストCoreOSでDockerインストールを使用するようにDroneに指示しています。 これは、ホストにDockerがインストールされていて、コンテナーにはインストールされていないためです(つまり、DockerコンテナーはDockerのネストされたインストールを実行していません)。-v /home/core/droneio/drone.sqlite:/var/lib/drone/drone.sqlite \
-空のストレージファイルをコンテナ内のデータベースにバインドして、格納するデータを保持します。 このファイルは、データを回復する必要がある場合や、何らかの理由でデータベースを外部から変更する必要がある場合に備えて、コンテナーの外部にあります。my_drone
-このコンテナーを実行するために、以前に作成したイメージを使用しています。
そのコマンドを実行した後、エラーが発生した場合は、空のデータベースファイルを作成したこと、およびすべてのパスが正しく入力されていることを再確認してください。
コンテナが実行されていることを確認するには、簡単なステータスチェックを実行します。
docker ps
出力は次のようになります。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6eddddd09900 my_drone:latest "/bin/sh -c '/usr/lo 1 seconds ago Up 1 seconds 0.0.0.0:8080->8080/tcp drone-ci
コンテナが起動しませんでした。
docker ps
を実行しても結果が得られない場合は、上から長いdocker run
コマンドを再確認し、正確に入力したことを確認してください。 改行なしで実行してみることができます。 また、空のdrone.sqlite
ファイルを正しいディレクトリに作成したことを確認してください。
コンテナを再構築して再試行するには、壊れたコンテナをDockerから削除する必要があります。 そうしないと、名前付きコンテナが重複していると文句を言います。
docker rm drone-ci
を使用して古いコンテナーを削除します(上記のコマンドでコンテナーに付けた名前を使用していることに注意してください)。 次に、前のセクションの長いdocker run
コマンドをもう一度実行してみてください。
コンテナが起動したのにインストールページにアクセスできない場合は、再起動してみてください。 docker stop drone-ci
を使用してコンテナを停止します。 または、より積極的に停止するには、docker kill drone-ci
を使用します。 次に、docker start drone-ci
で再起動してみてください。
コンテナログを掘り下げたい場合は、Dockerのlogコマンドdocker logs drone-ci
を使用できます。
ステップ3—ドローンをセットアップする
これで、初期アカウントでドローンをセットアップする準備が整いました。 Webブラウザーを開き、http://YOUR_DROPLET_IP:8080/login
に移動します。 次のようなログイン画面が表示されます。
Dockerfileで設定した唯一のサービスであるため、GitHubのみが表示されます。
次に、 GitHub ボタンをクリックしてから、アプリケーションの承認ボタンをクリックして、ログインと同期のプロセスを開始します。
これはドローンのメインダッシュボードです。GitHubアカウントの最新の3つのリポジトリを確認し、[すべて参照]をクリックしてリストを展開できます。 すべてのリポジトリが表示されない場合は、右上隅にある[SYNC]をクリックしてください。
ダッシュボードを自由に探索してください。
次に、さまざまなGitリポジトリソースへのアクセスを許可する必要があります。
ステップ5—GitHubからビルドを実行する
ドローンCIに追加するリポジトリの名前を見つけて選択します。 これにより、ドローンがアクティブになり、リポジトリにWebhookが追加されます。
アクティベーション後、空白のリポジトリステータスページが表示されます。
右上隅のボタンを使用して、リポジトリのより高度な設定のいくつかを調べることができます。
.drone.ymlファイル
.drone.yml
という名前の新しいファイルをリポジトリに作成する必要があります。 これにより、Droneにコマンドが送信され、GitHubリポジトリでコードをビルドしてテストする方法が示されます。 これは、ドローンが適切に設定されているかどうかをテストするために使用する非常に単純なファイルです。
image: dockerfile/nginx script: - echo hello world
image
は、プル元のベースイメージを定義します(イメージは、パブリックDockerレジストリ、プライベートレジストリ、またはローカルで構築されたものにすることができます)。 この場合、Nginxイメージを使用しています。script
は、ドローンが実行するコマンドとその順序を定義するだけです。 新しい行で、別の- <command here>
を使用して複数のスクリプトコマンドを定義できます。 (タブが並んでいることを確認してください!)
このスクリプトは、「hello world」をエコーして、ドローンが機能していることを証明します。 実際にはコードについて何もテストしません。
実際のビルドとテストのシナリオでは、Droneに本番環境に一致するDockerイメージを使用させ、スクリプトでリポジトリ内のコードをテストする必要があります。
次に、.drone.yml
ファイルをリポジトリにコミットします。 このコミット、および将来(.drone.yml
ファイルだけでなく、任意のファイルに対して)行うその他のコミットにより、リポジトリに配置されたWebhookドローンがトリガーされます。 これで、ドローンはベースイメージをプルし、ビルドスクリプトを実行するのに一生懸命になるはずです。
ドローンは新しいコミットを検出し、コードに加えられた変更を複製し、.drone.yml
ファイルで定義された指示に従います。 ページの下部にビルドが実行中であることを通知する通知が表示されます。クリックすると、ビルドステータスページが表示されます。
DroneはDockerパブリックレジストリからイメージをプルする必要があるため、ビルドには数分かかります。
ビルドに合格したら、コミットをクリックして詳細を表示できます。 次のような出力が表示されます。
$ git clone --depth=50 --recursive --branch=master git://github.com/captainshar/dronetest.git /var/cache/drone/src/github.com/captainshar/dronetest $ git checkout -qf 9908588ae4e4abcba8afb5029baad5c49a835ba4 $ echo hello world hello world $ exit 0
Perlに関連するいくつかの警告も表示される場合があります。 それはいいです。
これらのすべての手順を完了し、ビルドに合格すると、ほぼすべての言語ベースのプロジェクトをビルドおよびテストする準備ができた、個人のDrone.ioワーカーができあがります。
DroneはBitbucketとGitLabもサポートしており、OAuthを使用したセットアッププロセスはGithubと比較的同じです。 Dockerfileを編集し、正しい環境変数を使用してコンテナーを再構築する必要がある場合があります。
DRONE_BITBUCKET_CLIENT DRONE_BITBUCKET_SECRET DRONE_GITLAB_URL ...
次のステップ
ドローンでビルドを実行する準備ができたので、.drone.yml
を変更してより高度なテストを行うことができます。
たとえば、KarmaやMochaなどのテストフレームワークを使用してNodeアプリケーションをテストする場合は、image
セクションを公式のnode
イメージに変更し、スクリプトセクションを変更して実行できます。 npm
そしてテストを実行してください! アプリケーションに適している可能性のあるイメージについては、Dockerレジストリを確認してください。
本当に凝ったものにしたい場合は、ドローンウォールと呼ばれるものを調べて、すべてのビルドステータスのディスプレイボードを提供できます。
ドローンを指揮して楽しんでください!