Strider でプライベート CI 環境を構築する

![strider-ss-2.png](https://qiita-image-store.s3.amazonaws.com/0/1857/7602363a-2903-b472-f89e-09d52c2f7ca0.png "strider-ss-2.png")

> 著者の [Chris Foster](https://twitter.com/chrisfosterelli) さんから許諾を頂き、日本語に翻訳しています。
> 翻訳元: [Creating a private CI with Strider](http://fosterelli.co/creating-a-private-ci-with-strider.html)


継続的インテグレーションサーバや継続的デプロイサーバは、今では開発には欠かせないツールとなっています。特に、ウェブアプリケーションの開発においては、各ブランチがすぐにテストできるようにしたり、自動的にデプロイできるような仕組みを作ることは、非常に大切な要素です。[Strider](http://stridercd.com/) は、[Node.js](http://nodejs.org/) で実装された、新しいオープンソースの継続的デプロイツールです。Strider は最近公開されたばかりでまだ至らない点もありますが、現時点 (2013/08/16) では、WebHook やメール通知機能、[GitHub](http://github.com/) 連携、アカウント管理、[Heroku](http://heroku.com/) へのデプロイ機能、そして、[SauceLabs](http://saucelabs.com/) との連携機能が実装されています。

このブログ記事では、[Digital Ocean](http://digitalocean.com/) (月5ドルから使える SSD 専用 VPS) を使って、Strider を VPS 上に構築する方法を紹介します。

## Digital Ocean のアカウントを作成する

まずは Digital Ocean のアカウントを作成します。もしまだ Digital Ocean のアカウントをお持ちでなかったら、[こちらからアカウントを作成して下さい](http://digitalocean.com/registrations/new)。なお、"Droplets" (Digital Ocean 上の VPS インスタンス) を作成するためには、請求先の情報を登録する必要があるのでご注意下さい。

## Ubuntu 13.04 (64-bit版) の droplet を作成する

次に、Strider を動かす droplet (インスタンス) を作成します。今回は、[Chris Lea が作った最新版の Node.js](https://launchpad.net/~chris-lea/+archive/node.js) を使って Strider を構築するため、64-bit 版の [Ubuntu](http://ubuntu.com/) 13.04 を使います。もちろん他のディストリビューションを選択することも可能ですが、その場合は、適切な Node.js のパッケージを各自で探す必要があります。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/1857/ff4f0e6f-dec7-5e87-06fd-3ed0455f57c6.png "1.png")

## SSH でアクセスできるようにする

無事に droplet を作成できた場合、Digital Ocean から root パスワード付きのメールが届きます (訳注: 登録した公開鍵を使って droplet を作成した場合は、root パスワードが無くても大丈夫なので、メールは届きません) 。root パスワードが届いたら、SSH を使って droplet にアクセスします。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/1857/df79f28f-6d08-40b6-a3f2-54331d05ab1b.png "2.png")

``` bash
chris@laptop:~# ssh root@198.199.102.245
The authenticity of host '198.199.102.245 (198.199.102.245)' can't be established.
ECDSA key fingerprint is ee:e8:b7:55:dc:e0:cb:ee:99:f1:72:53:62:a2:97:de.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '198.199.102.245' (ECDSA) to the list of known hosts.
root@198.199.102.245's password: 

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

Welcome to Ubuntu 13.04 (GNU/Linux 3.8.0-19-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
root@strider-ci:~#
```

なお、root パスワードをそのままにしておくのは危険なので、無事にログインできたら root パスワードを変更しておきましょう。

``` bash
root@strider-ci:~# passwd
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@strider-ci:~#
```

## システムを最新版にする

公式の Ubuntu リポジトリの Droplet は、もしかしたら最新版ではないかもしれないので、念のためシステムを最新版にしておきます。

``` bash
root@strider-ci:~# apt-get update
[ Cut for brevity ]
root@strider-ci:~# apt-get dist-upgrade
[ Cut for brevity ]
root@strider-ci:~#
```

また、必要に応じて再起動して下さい。再起動した場合、droplet との接続が切れますが、もう一度 SSH で接続し直してください。

``` bash
root@strider-ci:~# reboot 
root@strider-ci:~# 
Broadcast message from root@strider-ci
    (/dev/pts/0) at 22:23 ...

The system is going down for reboot NOW!
Connection to 198.199.102.245 closed by remote host.
Shared connection to 198.199.102.245 closed.
chris@laptop:~# ssh root@198.199.102.245
root@198.199.102.245's password: 
Welcome to Ubuntu 13.04 (GNU/Linux 3.8.0-19-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
Last login: Fri Jul 26 22:18:46 2013 from 99.199.116.38
root@strider-ci:~#
```

## Node.js をインストールする

Strider は Node.js で実装されているので (また、今回テストするアプリケーションも Node.js 製なので)、Node.js をインストールしましょう！Ubuntu が提供しているパッケージから Node.js をインストールすることもできますが、Node.js は活発に開発されているため、とても古いバージョンの Node.js であることが多いです。そのため、今回は Chris Lea が作ったリポジトリを使って最新の Node.js をインストールします。

``` bash
root@strider-ci:~# apt-get install software-properties-common 
[ Cut for brevity ]
root@strider-ci:~# add-apt-repository ppa:chris-lea/node.js
You are about to add the following PPA to your system:
 Evented I/O for V8 javascript. Nodejs's goal is to provide an easy way to build scalable network programs
 More info: https://launchpad.net/~chris-lea/+archive/node.js
Press [ENTER] to continue or ctrl-c to cancel adding it
gpg: keyring `/tmp/tmps6w7ka/secring.gpg' created
gpg: keyring `/tmp/tmps6w7ka/pubring.gpg' created
gpg: requesting key C7917B12 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmps6w7ka/trustdb.gpg: trustdb created
gpg: key C7917B12: public key "Launchpad chrislea" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK
root@strider-ci:~#
```
上記のコマンドを使って無事にリポジトリを登録できたら、Node.js をインストールしてみましょう！Node.js をインストールするためには `g++` や `make` も必要なので、これらのツールも一緒にインストールします。なお、先ほどリポジトリの情報を更新したので、インストールする前に `apt-get update` も忘れずに実行しておいてください。

``` bash
root@strider-ci:~# apt-get update
[ Cut for brevity ]
root@strider-ci:~# apt-get install nodejs g++ make
[ Cut for brevity ]
root@strider-ci:~#
```

## Git をインストールする

[npm](http://npmjs.org/) (Nodejs's Package Manager) を使って Strider をインストールしたり、Strider と GitHub を連携させるために、[Git](http://gitscm.com/) が必要になるので、Git もインストールします。

``` bash
root@strider-ci:~# apt-get install git
[ Cut for brevity]
root@strider-ci:~#
```

## Strider をインストールする

これで Strider をインストールする準備が整いました。早速 npm を使って Strider をインストールしてみましょう。

``` bash
root@strider-ci:~# npm install -g strider
[ Cut for brevity ]
/usr/bin/strider -> /usr/lib/node_modules/strider/bin/strider
strider@1.3.1 /usr/lib/node_modules/strider
├── pw@0.0.4
├── cookie@0.0.5
├── ansiparse@0.0.5-1
├── strider-env@0.1.0
├── consolidate@0.8.0
├── step@0.0.5
├── everypaas@0.0.7
├── async@0.2.9
├── underscore@1.5.1
├── swig@0.13.6
├── validator@1.3.0
├── strider-python@0.0.2
├── passport-local@0.1.6 (pkginfo@0.2.3)
├── passport@0.1.16 (pkginfo@0.2.3)
├── bcrypt@0.7.6 (bindings@1.0.0)
├── mailer@0.6.7 (colors@0.6.1, nodemailer@0.1.20)
├── stylus@0.34.1 (debug@0.7.2, mkdirp@0.3.5, cssom@0.2.5)
├── winston@0.5.11 (stack-trace@0.0.7, eyes@0.1.8, colors@0.6.1, pkginfo@0.2.3, async@0.1.22)
├── nomnom@1.6.1 (colors@0.5.1, underscore@1.4.4)
├── passport-github@0.1.4 (pkginfo@0.2.3, passport-oauth@0.1.15)
├── loggly@0.3.11 (timespan@2.2.0, request@2.9.203)
├── connect@2.7.11 (fresh@0.1.0, cookie-signature@1.0.1, pause@0.0.1, qs@0.6.5, bytes@0.2.0, buffer-crc32@0.2.1, debug@0.7.2, formidable@1.0.14, send@0.1.1)
├── moment@2.1.0
├── request@2.25.0 (forever-agent@0.5.0, aws-sign@0.3.0, json-stringify-safe@5.0.0, qs@0.6.5, tunnel-agent@0.3.0, oauth-sign@0.3.0, cookie-jar@0.3.0, node-uuid@1.4.0, mime@1.2.10, form-data@0.1.0, hawk@1.0.0, http-signature@0.10.0)
├── strider-extension-loader@0.2.3 (connect@2.4.6)
├── express@3.1.2 (methods@0.0.1, fresh@0.1.0, range-parser@0.0.4, cookie-signature@1.0.0, buffer-crc32@0.2.1, debug@0.7.2, commander@0.6.1, mkdirp@0.3.5, send@0.1.0, connect@2.7.5)
├── jade@0.34.1 (character-parser@1.0.2, mkdirp@0.3.5, commander@1.3.2, transformers@2.1.0, with@1.1.0, constantinople@1.0.1, monocle@0.1.50)
├── nodemailer@0.5.2 (simplesmtp@0.3.5, mailcomposer@0.2.1)
├── mongoose@3.6.15 (regexp-clone@0.0.1, sliced@0.0.3, muri@0.3.1, hooks@0.2.1, mpath@0.1.1, ms@0.1.0, mpromise@0.2.1, mongodb@1.3.11)
├── connect-mongo@0.3.3 (mongodb@1.2.14)
├── strider-custom@0.2.1 (gitane@0.2.11, libyaml@0.2.2)
├── apres@0.0.2 (request@2.9.203, express@2.5.11)
├── strider-sauce@0.3.1 (request@2.11.4, httpcheck@0.0.1, wd@0.0.32)
├── socket.io@0.9.16 (base64id@0.1.0, policyfile@0.0.4, redis@0.7.3, socket.io-client@0.9.16)
└── strider-simple-worker@0.8.0 (gitane@0.0.7, async@0.1.22, lodash@1.3.1, pty.js@0.2.2, gumshoe@0.2.1, npm@1.2.32)
root@strider-ci:~#
```

## MongoDB のデータベースを作成する

Strider は、メタ情報を [MongoDB](http://mongodb.com/) に保存します。例えば、ユーザや招待コード、リポジトリの情報などです。MongoDB は使うのはそこまで難しくないので、必要であれば、同一のサーバ内に MongoDB をインストールして使っても特に問題ありません。今回は、無料で使えて、かつ、セットアップも簡単な [MongoHQ](http://mongohq.com/) を使います。無料版では 512MB までしか使えませんが、Strider を動かすためには十分な容量です。

[こちらの Sign up ページ](http://mongohq.com/signup)からアカウントを作成して、Strider 用のデータベースを作成してください。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/1857/cb4781c7-fff8-2784-8ee3-1cfca25e571f.png "3.png")

無事にデータベースが作成できたら、データベースのコンソール画面にリダイレクトされるはずです（まだ Strider の情報が保存されていないので、今は何も情報が入っていません）。MongoDB への URI が表示されると思うので、コチラをメモしておいてください。この URI は、Strider を設定するときに使います。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/1857/69132554-36b3-7a37-8385-e83d82d44168.png "4.png")

## GitHub アプリケーションを作成する

GitHub と Strider を連携させるため、GitHub アカウントを使って GitHub アプリケーションを作成する必要があります。GitHub アプリケーションを作成すると、[OAuth](http://oauth.net/) のトークンを取得できるようになります。このトークンを使って Strider と GitHub を連携させるため、表示されたトークンをメモしておいてください。

GitHub アカウントを持っていれば、[GitHub アプリケーションを作成するページ](https://github.com/settings/applications/new)から、簡単にアプリケーションを作ることができます。今回は、4000 番のポート番号を使って Strider を動かすため、作成した Droplet の IP アドレスの末尾に `:4000` を追加してください。もちろん、他のポート番号を使っても大丈夫です。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/1857/ee7d873c-3c1b-8ba4-0b99-8f0f7100a7ba.png "5.png")

GitHub アプリケーションを作成できたら、コントロールページからトークンを取得してください。コントロールページでは、作成したアプリケーションの ID と Secret が表示されます。これらの ID と Secret は Strider と GitHub を連携させるために必要なので、メモしておきましょう。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/1857/c8dd6ae9-3b96-5ce7-9e23-b105aa377e49.png "6.png")


## SMTP を設定する

Strider のメール通知機能を使うためには、SMTP サーバにアクセスする必要があります。先ほどの MongoDB と同様に、同一のサーバ内に SMTP を設定しても構いませんが、今回は、セットアップが簡単な外部サービスの [Mandrill](http://mandrill.com/) を使います。このサービスも無料版を提供していて、一般的な Strider では、無料版の制限を超えることはないでしょう。[こちらの signup ページ](http://mandrill.com/signup/)から Mandrill というサービスに登録することができます。無事に Mandrill のアカウントが作成できたら、[SMTP & API Credentials](https://mandrillapp.com/settings/index) というページに飛んでください。そのページに表示されている SMTP の情報を使って、Strider のメール通知機能を使えるようにします。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/1857/2e55780b-2a75-853b-3b17-dd4d3dc9c9b8.png "7.png")

## 管理ユーザアカウントを作成する

Strider を立ち上げる前に、Strider にログインするための管理ユーザアカウントを作成する必要があります。というのも、ユーザアカウントを作成しなくても Strider を立ち上げることはできますが、Strider にログインすることができないからです。また、管理ユーザアカウントを１つ作っておけば、ウェブ上から、他のユーザアカウントを作成したり、招待したりすることができるようになります。したがって、まずは１つの管理ユーザアカウントを作成します。アカウントを作成するとき、管理権限を持たせるようにしておきましょう。なお、作成したアカウントは MongoDB に保存されるため、先ほどメモした MongoDB の URI を `DB_URI` に代入して、`strider addUser` を実行するようにしましょう。

``` bash
root@strider-ci:~# DB_URI="メモした MongoDB の URI をココに貼付け" strider addUser
email []: chris.james.foster@gmail.com
Is admin? (y/n) [n]y
Enter password []: ***********

Email:      chris.james.foster@gmail.com
Password:   ****
isAdmin:    y
OK? (y/n) [y]y
27 Jul 00:37:16 - info: Connecting to MongoDB URL: [Your MongoDB URI]
27 Jul 00:37:17 - info: User added successfully! Enjoy.
root@strider-ci:~#
```

## Strider を起動する job を作成する

次に、Strider を簡単に 起動できるようにするため、Strider を起動する job を作成します。最新の Ubuntu には [Upstart](http://upstart.ubuntu.com/) という機能が備えられているので、今回は、Upstart を使って Strider を起動できるようにします。Upstart を使うと、Strider を簡単にバックグラウンドで走らせることができます。また、起動／停止や、現在の稼働状況を調べるのも簡単になります

今まで準備してきたメモは、Upstart の設定で使います。ポート番号や IP アドレスは打ち間違えないようにしてください。また、**`SERVER_NAME` の末尾に `/` を加えないように**注意してください。

`vi` や `emacs` などのエディタを使って、`/etc/init/strider.conf` を作成し、次のように書いてください 。また、角カッコ `[` `]` で囲われたところには、先ほどメモした情報を適宜書き込んでください）。

``` bash
#!upstart
description "Strider upstart job"

start on startup
stop on shutdown

script
    export PORT=4000
    export DB_URI="[Your MongoDB URI]"
    export GITHUB_APP_ID="[Your Github Client ID]"
    export GITHUB_APP_SECRET="[Your Github Client Secret]"
    export SMTP_HOST="[Your SMTP Host]"
    export SMTP_PORT="[Your SMTP Port]"
    export SMTP_USER="[Your SMTP User]"
    export SMTP_PASS="[Your SMTP Pass]"
    export SERVER_NAME="http://198.199.107.142:4000"
    export STRIDER_CLONE_DEST="/home/strider/builds/"
    echo $$ > /var/run/strider.pid
    exec sudo -u strider \
     DB_URI=$DB_URI SERVER_NAME=$SERVER_NAME GITHUB_APP_ID=$GITHUB_APP_ID \
     GITHUB_APP_SECRET=$GITHUB_APP_SECRET SMTP_HOST=$SMTP_HOST SMTP_PORT=$SMTP_PORT \
     SMTP_USER=$SMTP_USER SMTP_PASS=$SMTP_PASS PORT=$PORT STRIDER_CLONE_DEST=$STRIDER_CLONE_DEST \
     strider >> /var/log/strider.log 2>&1
end script

pre-start script
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/strider.log
end script

pre-stop script
    rm /var/run/strider.pid
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/strider.log
end script
```

## システムに `strider` ユーザを追加する

上記の設定ファイルを書き込んでいる途中で気づいたかもしれませんが、今回は `root` ユーザではなく，`strider` ユーザとして Strider を実行します。これは、万が一 Strider にセキュリティ上の問題が発生した場合でも、クラッカーにルート権限を与えないようにするためです。早速、`strider` ユーザをシステムに追加してみましょう。

``` bash
root@strider-ci:~# adduser strider
Adding user `strider' ...
Adding new group `strider' (1000) ...
Adding new user `strider' (1000) with group `strider' ...
Creating home directory `/home/strider' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for strider
Enter the new value, or press ENTER for the default
    Full Name []: 
    Room Number []: 
    Work Phone []: 
    Home Phone []: 
    Other []: 
Is the information correct? [Y/n] 
root@strider-ci:~#
```

`strider` ユーザを追加したら、パスワードを使ったログインを禁止しましょう。ログインする時は、`sudo -u strider` と実行することで `strider` ユーザにログインできるので大丈夫です。また、パスワードを使った外部からのクラッキングの防止にも繋がります。

``` bash
root@strider-ci:~# passwd -l strider
passwd: password expiry information changed.
root@strider-ci:~#
```

## Strider を起動する

ここまでうまくいったら、Strider を起動してみましょう。

``` bash
root@strider-ci:~# start strider
strider start/running, process 1229
root@strider-ci:~#
```

Strider を停止させたいときは、`stop` コマンドを実行することで停止させることができます。また、Strider が稼働しているかどうかを確かめたい時は `status` コマンドを使って調べることができます。なお、Strider のログは `/var/log/strider.log` に書き込まれるので、もしうまく動かない場合は、このログをチェックしてみてください。

## Strider にログインする

ここまでうまくいったら、手元のウェブブラウザから `http://[IP アドレス]:[ポート番号]` にアクセスしてみましょう！

管理ユーザアカウントを作成するときに使ったメールアドレスとパスワードを入力すると、ログインできるはずです。無事にログインできると、次のようなダッシュボード画面が表示されます。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/1857/da696e95-b7aa-4762-38e2-35ecae42169e.png "8.png")


## Strider にリポジトリを追加する

まだリポジトリを何も追加していないので、ダッシュボード画面は閑散としています。そこで、先ほど設定した GitHub アプリケーションを使って、GitHub アカウントのリポジトリを追加してみましょう。`/etc/init/strider.conf` に `GITHUB_APP_ID` と `GITHUB_APP_SECRET` が正しく設定されていれば、次のようなページに飛べるはずです。`/etc/init/strider.conf` が正しく設定されていないとエラーが出てしまうので、注意してください。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/1857/9d8bc203-4e65-20dc-a955-629b1d33483e.png "9.png")

正しく設定が行われていれば、次のように、自分の GitHub アカウントがアクセスできるリポジトリの一覧が表示されます。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/1857/9946ccd0-a5d1-4678-2c54-79c944ebb264.png "10.png")

どれか１つのリポジトリを選び、右側の `ON/OFF` のトグルボタンをクリックして追加してみてください。クリックすると、設定画面に飛ぶので、その後はチュートリアルに従って設定してください。無事に設定が終わると、最初のテストが実行され、テスト結果がダッシュボードに表示されます。また、SMTP の設定がうまくできていれば、登録したメールアドレスにもテスト結果が通知されるはずです。

![11.png](https://qiita-image-store.s3.amazonaws.com/0/1857/db41c71f-fe1f-d720-b78a-791e3210f2a9.png "11.png")


例えば、Node.js を使ったアプリケーションのリポジトリを登録していれば (訳注: 正確には、アプリケーションのルートディレクトリに `package.json` があるリポジトリを登録すれば) Strider はそれを検知して、`npm test` を自動的に実行します。なお、実行するコマンドを変更したい場合は、登録したリポジトリの設定画面から変更することができます。


## まとめ

Digital Ocean 上で Strider を動かしている場合、Droplet の Snapshot を作成することができるので、まずはこの時点で Snapshot を取っておくとよいかもしれません。というのも、Strider が今後もしうまく動かなくなった場合でも、現時点の状態までロールバックしたり、必要に応じて (たとえば、メモリ不足などで) Digital Ocean 上のより大きなリソースを持ったサーバに移行することができるからです。

あとは、Strider の機能を使って自由に遊んでみてください。例えば、管理権限を持ったユーザであれば、他のユーザをメールで招待することもできます。また、Heroku の Deploy keys を登録すれば、「テストが通ったら自動的にデプロイする (Deploy on Green)」といった機能も使うことができます。

ただし、Strider は現在開発中のツールであるため、今後も新しい機能やバグ修正が頻繁にリリースされるはずです。Strider に最新版に更新したいときは、`root` ユーザで `npm update -g strider`コマンドを実行することで、いつでも更新することができます。

これで Strider の構築は終了です！Strider は将来性のある、刺激的な継続的インテグレーション / 継続的デプロイツールです。もし Strider のセットアップについて何か問題や質問があれば、`chris.james.foster@gmail.com` まで連絡下さい (訳注: といっても、日本語は分からないと思うので、もし日本語で何か聞きたいことがあれば、[@yasulab](http://twitter.com) まで連絡してください) 。

## 訳者あとがき

Strider 使ってみたら結構面白かったので、Strider の導入部分を抑えた記事を訳してみました。 **開発中のため不具合はそこそこ多いですが** 、Node.js で書かれているので、何か困ったことがあったり必要な機能があれば、直接内部のコードを弄って付けたり外したりできます。

もし反響があれば、同僚の [@hanachin_](http://twitter.com/hanachin_) と一緒に Strider に追加 / 修正してみた機能の一例などを紹介しようかなーと思います。

それでは、良い週末を！