CoreOSおよびDockerでDrone.ioを使用して継続的インテグレーションテストを実行する方法
序章
最小限のセットアップの継続的インテグレーションソリューションが必要ですか? 誰がしません! Drone.io はDockerコンテナーを使用してテストを実行し、 GitHub 、 GitLab (セルフホストおよびサービスベース)、および
ドローンはGoを使用して構築され、Dockerを利用します。 設定がほとんどなく、コンテナ自体の内部で実行できます。
継続的インテグレーションは、コードベースに頻繁にコミットし、構築とテストを行う開発手法です。 これは、新しいコードが(うまくいけば)既存のコードベースをすばやく簡単に統合することを意味します。 継続的インテグレーションではコードを頻繁にビルドしてテストする必要があるため、自動的にビルドしてテストできる場合は、開発プロセスがスピードアップします。 ドローンはこれを行います。 構築とテストのプロセスを自動化します。
ドローンは、ホストされているGitリポジトリからコードを自動的にプルし、定義したスクリプトを実行します。 任意のテストスイートを実行して、電子メールで報告したり、READMEのバッジでステータスを示したりすることができます。 DroneとDockerの統合は、PHP、Node、Ruby、Go、Pythonなどの膨大な数の言語をサポートできることを意味します。 各テストは、Dockerパブリックレジストリから指定されたイメージに基づいて新しいコンテナを生成します。 これは、言語と開発スタックのサポートは、より多くのイメージが作成されるときにのみ増加することを意味します。 特定のアプリケーションに合わせて独自に作成することもできます。
このチュートリアルでは、 Drone.io をコンテナ化して、最小限のLinuxディストリビューションCoreOSを使用して実行できるようにする方法を見ていきます。
要件
- アカウントに少なくとも1つのSSHキーが追加されました
- 単一のCoreOSベータドロップレット(512 MBのRAMで正常に動作します)
これまでオペレーティングシステムを使用したことがない場合は、続行する前に、このCoreOSの概要を読むことをお勧めします。
を使用してCoreOSを構成する方法がわからない場合 cloud-config
ファイル、あなたはより多くの情報に加えて、サンプル設定ファイル、ここを見つけることができます! このチュートリアルでは、サンプルの構成ファイルが機能します。
ステップ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>
上記の手順でメモしたトークンを使用します。
以下のコマンドを入力して、行った変更を保存します。 The 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レジストリを確認してください。
本当に凝ったものにしたい場合は、ドローンウォールと呼ばれるものを調べて、すべてのビルドステータスのディスプレイボードを提供できます。
ドローンを指揮して楽しんでください!