IRC
GitLab

GitLabとIRCの連携 ( GitLab Integrations )

はじめに

GitLabとIRC Gateway(irker)を連携させることで、リポジトリへのpushをトリガにcommit内容をIRCチャットに投稿できます。

SlackやMattermostなど今風チャットとの連携の影に隠れてあまり(全く)紹介されていないのと、
irkerの起動方法のドキュメントがない(&若干注意が必要な)ので本記事で紹介します。

動作確認バージョン
GitLab Community Edition 10.6.4
irker (SHA-1) dc0f65a7846a3922338e72d8c6140053fe914b54

参考ドキュメント
https://docs.gitlab.com/ee/user/project/integrations/irker.html

IRC Gateway(irker)の起動

irkerはGitLabからのcommit&push通知を待ち受け、受信した通知をIRCサーバに送信するツールです。Pythonで実装されています。

# Ubuntu 17.10 にて動作確認
# 入手
git clone https://gitlab.com/esr/irker.git
cd ./irker/

# 起動
nohup ./irkerd -H 0.0.0.0 -n GitLab &

設定の注意点

-Hオプション

GitLabとirkerdを同一ホストで動かす場合、-Hオプションは不要です。
(その場合irkerdはlocalhostから接続のみ受け付けます。)

GitLabとirkerdを別ホスト(dockerも含む)で動かす場合、-Hオプションが必要です(このへん早めに気づかないとハマるかも。。)。

-nオプション

-nはチャットに書き込む際のusernameです。
他のユーザとusernameがとかぶるとチャット投稿に失敗しますので注意が必要です。

チャットの文字コード

irkerdは文字コードutf-8でチャットを送信します。
そのため、お使いのクライアントソフトの文字コード設定と相違があると文字化けして表示されてしまいます。
例えばLimeChatのデフォルトの文字コードはiso-2022-jpですのでそのままですと文字化けします。
クライアントソフト側の文字コードをutf-8にするか(チーム全体で統一が必要です)、以下のようにirkerdの送信処理の実装を書き換えて文字コードをクライアントソフトに合わせましょう。

    def ship(self, string):
        "Ship a command to the server, appending CR/LF"
        try:
            #self.socket.send(string.encode('utf-8') + b'\r\n')
            self.socket.send(string.encode('iso-2022-jp') + b'\r\n')
            LOG.debug("TO: %s" % string)
        except socket.error:
            self.disconnect("Connection reset by peer.")
うまく動かないときは

-d オプションにdebugを指定すると詳細な動作ログを標準出力に出力しますのでヒントになるかもしれません。

Integrationsの設定

GitLabのプロジェクト→Settings→Integrations→Irker (IRC gateway)を開きます。

以下は設定例です。
irc.png

投稿されたチャット内容

pushすると以下のようにチャットされました、しっかりと連携できてます。

20:55 (GitLab) [test] loftkun pushed 1 new commit to master: http://mygithub.com/loftkun/test/compare/8d5a364e...76df7004
20:55 (GitLab) test/master 76df7004 loftkun (1 file): test commit

push内容に続けてcommitの内容が投稿されていました( testはプロジェクト名です)。