CoreOSおよびDockerでDrone.ioを使用して継続的インテグレーションテストを実行する方法

前書き

最小セットアップの継続的統合ソリューションが必要ですか? 誰もしません! https://drone.io [Drone.io]はDockerコンテナーを使用してテストを実行し、https://github.com [GitHub]、https://about.gitlab.com [GitLab](セルフホストおよびサービスベース)、およびhttps://bitbucket.org [Bitbucket]。

ドローンはGoを使用して構築され、Dockerを利用します。 コンテナー内で実行でき、構成はほとんどありません。

_継続的インテグレーション_は、コードベースに頻繁にコミットを行い、進行中にビルドおよびテストする開発手法です。 これは、新しいコードが(できれば)既存のコードベースに迅速かつ簡単に統合されることを意味します。 継続的インテグレーションではコードを頻繁にビルドおよびテストする必要があるため、自動的にビルドおよびテストできる場合、開発プロセスがスピードアップします。 ドローンはこれを行います。構築とテストのプロセスを自動化します。

ドローンは、ホストされたGitリポジトリからコードを自動的にプルし、定義したスクリプトを実行します。 任意のテストスイートを実行して、電子メールで報告するか、READMEのバッジでステータスを示すことができます。 DroneのDockerとの統合は、PHP、Node、Ruby、Go、Pythonなどの膨大な数の言語をサポートできることを意味します。 各テストは、Docker Public Registryから指定されたイメージに基づいて新しいコンテナを生成します。 これは、言語と開発スタックのサポートが、より多くのイメージが作成されるにつれて増加することを意味します。 特定のアプリケーションに合わせて独自のものを作成することもできます!

このチュートリアルでは、Drone.ioをコンテナー化して、最小のLinuxディストリビューションCoreOSを使用して実行できるようにする方法を見ていきます。

必要条件

  • アカウントに少なくとも1つのSSHキーが追加されている

  • 単一のCoreOSベータドロップレット(512 MBのRAMで問題なく動作します)

オペレーティングシステムを使用したことがない場合は、続行する前に、https://www.digitalocean.com/community/tutorials/an-introduction-to-coreos-system-components [CoreOSの紹介]を読むことをお勧めします。

`+ cloud-config +`ファイルを使用してCoreOSを構成する方法がわからない場合は、詳細情報に加えて、サンプル構成ファイルhttps://www.digitalocean.com/community/tutorials/how-to-setを見つけることができます。 -up-a-coreos-cluster-on-digitalocean [こちら]! サンプル構成ファイルは、このチュートリアルで使用できます。

ステップ1-GitHubを準備する

始める前に、oAuth経由でGitHubアカウントへのアクセスを有効にする必要があります。 Droneコンテナをセットアップする次のステップで使用するトークンのペアを生成します。

GitHubアカウントからこれらの値を生成する必要があります。 https://github.com/settings/applications [ここをクリック]をクリックすると、*アプリケーション*と呼ばれるGitHubの適切な設定ページに移動します。

右上の[新しいアプリケーションを登録]ボタンをクリックします。 これにより、入力する新しいフォームが表示されます。

image:https://assets.digitalocean.com/articles/drone/register.png [OAuth登録]

*アプリケーション名*を追加します。 *ホームページのURL *は `+ http:// YOUR_DROPLET_IP:8080 / +`でなければなりません。 *アプリケーションの説明*を追加します。

重要:正しく認証するには、*承認コールバックURL *が `+ http:// YOUR_DROPLET_IP:8080 / api / auth / github.com +`に設定されていることを確認してください!

設定したら、[アプリケーションを登録]をクリックして、新しいアプリケーションの情報ページに移動します。

ここからの2ビットの情報、*クライアントID *と*クライアントシークレット*が必要です。 (実際にクライアントの秘密を守ってください! これは誰とも共有すべきものではありません!)

これらのトークンは、* Dashboard *パネルを介してDroneに追加するGitHubリポジトリにwebhookを追加するために、独自のDroneアプリケーションを承認するために使用されます。 WebhookはGitHubにプッシュするすべての新しいコミットでトリガーされ、これによりDroneが新しい変更を複製してビルドを実行します。

次のステップで必要になるため、これらのトークンをメモしてください。

ステップ2-Dockerfileの作成

CoreOS Dropletの準備がすべて整ったら、SSHで接続します。

ssh -A core@YOUR_DROPLET_IP

`+ droneio +`という新しいディレクトリを作成します:

mkdir droneio
cd droneio

CoreOSのルートファイルシステムは読み取り専用であるため、Drone.ioを直接インストールすることはできません。 最初にDockerを使用して_containerize_する必要があります。 Dockerfileをセットアップします。このファイルには、ストックのUbuntuシステムにインストールするのと同じようにDrone.ioをインストールする手順が含まれています。

このセクションでは、端末ベースのテキストエディタ「+ 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

Dockerfilesに慣れていない人のための非常に簡単な概要:

  • + FROM-コンテナに使用する画像

  • + RUN +-ビルドプロセス中にコンテナ内でコマンドを実行します

  • + EXPOSE +-指定されたポートにコンテナの外部からアクセスできるようにします

  • + CMD +-コンテナの起動時に実行されるコマンド

  • + ENV +-コンテナ内の環境変数の値を設定します。ここでドローンの設定に使用します

Dockerfilesで作成できるステートメントのタイプの詳細については、https://docs.docker.com/reference/builder/ [Docker公式ドキュメント]を参照してください。

この時点で、次のコマンドを使用してイメージを構築できます。

docker build -t my_drone .

これには数分かかります。 正常にビルドされたら、新しいイメージを使用してコンテナをスピンアップできます。

ステップ2-ドローンコンテナーを起動する

Drone.ioには情報を保存する場所が必要なので、SQLiteデータベースファイルを使用します。 開始する空のファイルを作成します。

touch drone.sqlite

コンテナが起動すると、このファイルにはDroneによってデータが入力されます。

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をコンテナの同じポートにバインドします。 これにより、実行中のコンテナのネットワークの外部でDroneのインターフェイスにアクセスできます。

  • + -v / var / lib / drone +-コンテナ内のストレージ用のボリュームを設定します。

  • + -v /var/run/docker.sock:/ var / run / docker.sock +-これは、Drone.ioコンテナーがホストのDockerシステムを制御できるようにするトリックです。 Docker UNIXソケットが存在するコンテナの場所を実際のホストのDocker UNIXソケットにバインドしています。 つまり、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のログコマンド「+ docker logs drone-ci +」を使用できます。

ステップ3-ドローンのセットアップ

これで、初期アカウントでドローンをセットアップする準備が整いました。 Webブラウザーを開き、「+ http:// YOUR_DROPLET_IP:8080 / login」に移動します。 次のようなログイン画面が表示されます。

画像:https://assets.digitalocean.com/articles/drone/login.png [Drone.ioログイン]

GitHubが表示されるのは、Dockerfileで設定する唯一のサービスだからです。

  • GitHub *ボタンをクリックしてから、*アプリケーションの認証*ボタンをクリックして、ログインと同期プロセスを開始します。

image:https://assets.digitalocean.com/articles/drone/dash.png [レポリスト]

これはDroneのメインダッシュボードです。GitHubアカウントで最新の3つのリポジトリを確認し、「すべて参照」をクリックしてリストを展開できます。 すべてのリポジトリが表示されない場合は、右上隅の「同期」をクリックしてください。

ダッシュボードを自由に探索してください。

次に、さまざまなGitリポジトリソースへのアクセスを許可する必要があります。

ステップ5-GitHubからビルドを実行する

Drone CIに追加するリポジトリの名前を見つけて選択します。 これにより、Droneがアクティブになり、webhookがリポジトリに追加されます。

アクティブ化後、空のリポジトリステータスページが表示されます。

image:https://assets.digitalocean.com/articles/drone/commitStream.png [ストリームのコミット]

右上隅のボタンを使用して、リポジトリのより高度な設定のいくつかを調べることができます。

.drone.ymlファイル

`+ .drone.yml +`というリポジトリに新しいファイルを作成する必要があります。 これにより、Droneにコマンドが送信され、GitHubリポジトリでコードをビルドおよびテストする方法が指示されます。 これは、ドローンが適切にセットアップされているかどうかをテストするために使用する非常に簡単なファイルです。

image: dockerfile/nginx
script:
 - echo hello world
  • `+ image +`は、取得元のベースイメージを定義します(イメージは、パブリックDockerレジストリ、プライベートレジストリ、またはローカルに構築されたものから取得できます)。 この場合、Nginxイメージを使用しています。

  • `+ script `は、ドローンが実行するコマンドを、どのような順序で単に定義するだけです。 新しい行で別の `-<command here> +`を使用して、複数のスクリプトコマンドを定義できます。 (タブが揃っていることを確認してください!)

このスクリプトは、ドローンが機能していることを証明するために「hello world」をエコーするだけです。 実際にはコードについて何もテストしません。

実際のビルドとテストのシナリオでは、実稼働環境に一致するDockerイメージをDroneで使用し、スクリプトでリポジトリ内のコードをテストする必要があります。

ここで、 `+ .drone.yml `ファイルをリポジトリにコミットします。 このコミット、および将来( ` .drone.yml +`ファイルだけでなく、任意のファイルに対して)行う他のコミットは、リポジトリに配置されたwebhook Droneをトリガーします。 これで、ドローンはベースイメージの取得とビルドスクリプトの実行に苦労するはずです。

ドローンは新しいコミットを検出し、コードに加えられた変更をクローンし、 `+ .drone.yml +`ファイルで定義された指示に従います。 ページの下部に通知が表示され、ビルドが実行されていることがわかります。クリックすると、ビルドステータスページが表示されます。

image:https://assets.digitalocean.com/articles/drone/statusPage.png [ドローンワーカー]

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ができたので、 `+ .drone.yml +`を修正して、より高度なテストを行うことができます。

たとえば、KarmaやMochaなどのテストフレームワークを使用してNodeアプリケーションをテストする場合、 `+ image `セクションを公式の ` node `イメージに変更し、スクリプトセクションを変更して ` npm +`を実行できます。そしてテストを実行します! Docker registryでアプリケーションに合った画像を探してください。

本当に空想を得たい場合は、https://github.com/drone/drone-wall [Drone Wall]と呼ばれるものを調べて、すべてのビルドステータスの表示ボードを提供できます。

ドローンを指揮して楽しんでください!

Related