SHOYAN BLOG

I am a pragmatic programmer.

PHPの構文チェックを自動で行う方法

私のチームではCIで自動的にLINTをする仕組みを構築しています。
この仕組みにより、レガシーコードでテストコードがない環境でもシンタックスエラーの混入を防ぐことができます。

中身はシンプルで以下のスクリプトを作成して、CIプラットホームで実行するようにします。

php-lint.sh

1
2
3
4
5
6
7
8
#!/bin/sh

RESULT=`find . -type f -name "*.php" -exec php -l {} \; 2>&1 | grep "PHP Parse error"`

if [ "$RESULT" != "" ];then
    echo "$RESULT"
    exit 1
fi

例えば、Droneでチェックする場合は以下のように設定します。

.drone.yml

1
2
script:
  - ./php-lint.sh

GitHubにpushしたらDockerイメージを自動ビルドする

Docker HubとGitHubを使ってDockerイメージの自動ビルドを行う方法を紹介します。

自動ビルドのメリット

自動ビルドのメリットは以下です。

  • 常に最新のイメージがDocker Hubに用意される
  • Dockerfileが公開され使う人が安心できる
  • READMEも常に最新のものがDocker Hubに公開される

Docker Hubを利用するには事前にアカウントの作成が必要です。
Docker Hubのアカウントの作成は以下を参考にしてください。

Docker Hubで自動ビルドの設定をする

すでにDockerfileがGitHubで管理されていることを前提に話しを進めます。

Docker Hubにログインしたら「Profile > Settings > Linked Accounts & Services.」を選択します。

GitHubを使うのでGitHubのパネルを選択し、認証をしてください。
認証が成功すると、以下のような画面になります。

docker-auto-build-01

認証が済んだら、Docker Hubにリポジトリを作成します。

「 Create > Create Automated Build」を選択します。
docker-auto-build-02

すると以下の画面が表示されます。

docker-auto-build-03

GitHubを選択すると 「Users/Organizations」とリポジトリを選択できる画面になるので、自動ビルドを行うリポジトリを選択します。

Createボタンを押すと登録され、Docker Hubに表示されるようになります。

docker-auto-build-04

docker-auto-build-05

リポジトリの「Build Settings」でビルドの設定ができます。

Triggerボタンを押すとビルドが始まります。

docker-auto-build-06

ビルドの状態は「Build Details」で確認できます。

docker-auto-build-07

Queuedはビルド待ちのステータス。
Buildingはビルド中のステータスです。

GitHubにpushすればBuild Settingsで設定したブランチが自動的にビルドされます。

以上、簡単ですがDockerの自動ビルドの設定方法の紹介でした。
英語版ですが、詳しい方法が書いてあるのでこちらも参考にしてください。

Botsインテグレーションを使って手軽にRubotyをSlackで動かす

前回はRubotyのインストールとプラグインチュートリアルでRubotyの導入方法を紹介しました。
今回はRubotyをSlackで動かす方法を紹介します。

RubotyにはSlackアダプターが用意してありますが、新しくユーザーの作成が必要です。
ユーザーの作成が必要のない、Botsインテグレーションとruboty-slack_rtmを使ってRubotyをSlackで動かす方法を紹介します。

ruboty-slack_rtmのインストール

Gemfileに以下を定義します。

1
gem "ruboty-slack_rtm"

bundle install コマンドでインストールします。

SlackのBotsインテグレーションを設定する

Slackの管理画面でBotsインテグレーションを登録します。

bots-integration

登録するとTokenが発行されるので、そのTokenをSLACK_TOKENという名前で環境変数に設定します。
Rubotyは dotenv に対応しているので、.env ファイルを作成し、そこにTOKENを登録しておくと便利です。

.env

1
SLACK_TOKEN=<slack token>

Ruboty を起動します。.env ファイルを読み込むように —dotenv オプションをつけて起動します。

1
bundle exec ruby --dotenv

起動すると SlackのRubotyがログインマークに変わります。

あとは、チャンネルにinviteすればSlackでRubotyが使えます!
ちなみにrubotyではなく、Botsインテグレーションで登録したユーザー名に反応します。

関連記事

5分でできるRubotyのインストールとプラグインチュートリアル

RubotyはhubotクローンでRubyで書けるbotです。
このチュートリアルではRubotyのインストールとプラグインの作成方法を紹介します。
冗長な説明をあえて除きRubotyを動かすために重要な部分のみ解説することでスピーディにRubotyを動作できるようにしています。

Rubotyをローカルで動かす

以下のコマンドでinstallします。

1
$ gem install ruboty

以下のコマンドでひな形を作成します。
ruboty/ ディレクトリとその配下にGemfileが作成されます。

1
$ ruboty --generate

Rubotyを起動してみます。

1
2
3
$ cd ruboty
$ bundle install
$ bundle exec ruboty

すると対話型のプロンプトが起動します。

1
2
3
$ bundle exec ruboty
Type `exit` or `quit` to end the session.
>

ruboty pingコマンドを実行します。

1
2
> ruboty ping
pong

ruby helpコマンドで一覧が見れます。

1
2
3
4
> ruboty help
ruboty /help( me)?(?: (?<filter>.+))?\z/i - Show this help message
ruboty /ping\z/i - Return PONG to PING
ruboty /who am i\?/i - Answer who you are

Rubotyプラグインを作成する

Ruboty はhubotと同様にプラグインで拡張できます。

Helloプラグインを作成してみましょう。
Helloプラグインはhelloと挨拶すると、helloと挨拶を返すだけのプラグインです。

hello.rb

1
2
3
4
5
6
7
8
9
10
11
module Ruboty
  module Handlers
    class Hello < Base
      on(/hello/i, name: hello, description: "こんにちは")

      def hello(message)
        message.reply("Hello!!")
      end
    end
  end
end

Ruby::handlersの名前空間の下にプラグインの名前でクラスを作成し、on メソッドを定義します。
on メソッドの第1引数はコマンドです。正規表現で定義できます。
第2引数は呼び出すメソッド名、コマンドの説明等のオプションを指定します。

実行してみましょう。
-l オプションで読み込むファイルを指定することができます。

1
2
3
4
  bundle exec ruboty -l hello.rb
Type `exit` or `quit` to end the session.
> ruboty hello
Hello!!

また、bot名のprefixなしに実行することもできます。
allオプションを使って実装します。

サンプルとして、ぬるぽプラグインを実装します。
これはぬるぽという言葉に反応するプラグインです。

nullpo.rb

1
2
3
4
5
6
7
8
9
10
11
module Ruboty
  module Handlers
    class NullPoHandler < Base
      on(/.*(ぬるぽ|ヌルポ).*/, name: 'nullpo', description:'ぬるぽに反応します', all: true)

      def nullpo(message)
        message.reply("ガッ!!!!")
      end
    end
  end
end

実行してみましょう。
-l オプションで読み込むファイルを指定することができます。

1
2
3
4
$ bundle exec ruboty -l nullpo.rb
Type `exit` or `quit` to end the session.
> ほげ ぬるぽ ほげ
ガッ!!!!

bot名のprefixがなくても反応していることが確認できます。

次回はSlackと連携させる方法を紹介します。

GitHubのリポジトリを監視するGitMonitor

GitHubのリポジトリを監視するGitMonitorというサービスを紹介します。
このサービスはGithubのリポジトリを監視して、そのリポジトリに行った操作をダッシュボードで確認することができます。
また、Flowdock、Slack、Emailに通知することも可能のようです。

以下は、masterに直接pushしたときのログです。

git-monitor-image

GitMonitorは様々なルールが設定でき、そのルールに該当したものがダッシュボードに表示されます。
例えば、LGTMがないPull Requestがマージされたときや、リストに定義していない人がマージしたときに通知することもできるようです。

操作の制限ができるわけではなく、ルールに該当したときにダッシュボードに通知されるだけのようです。

30日間は無料で使えて、それ以降は有料プランとなります。
有料プランは3つあって、Small($10 / mon)、Medium($20 / mon)、Large($35 / mon) が選べます。
監視するリポジトリの数がプランによって違います。