OpenProject ↔ Slack ブリッジ
チケットの変更をスレッド形式の Slack 通知に。GitOps 設定ダッシュボード付き
概要
OpenProject のチケット変更を、スレッド形式の Slack 通知と個人向け DM に変換する社内ツール。Python のプロトタイプを Go のエンジンと Next.js のダッシュボードに書き直し、マルチテナント化し、デプロイ環境も構築した。Claude Code、Codex、Cursor を使って開発。
アーキテクチャ
OpenProject の webhook → Go エンジン(スナップショット差分 → Slack Block Kit メッセージ、スレッド、DM。メディアは S3。インスタンスごとの cron ジョブ)。管理サービス(Go)↔ GitLab API でバージョン管理された YAML 設定を扱い、push webhook → SSH 経由でサービス単位の再ビルドまたは再起動。Next.js ダッシュボードのドロップダウンは OpenProject と Slack のライブデータから取得。エンジンは GitLab CI でビルドされる scratch ベースのイメージとして配布。
主な技術ポイント
保存済みスナップショットとの比較によるフィールド単位の変更検出。チャンネルのスレッドメッセージとロール別の DM
非公開の添付ファイルを S3 に再ホストして Slack で表示できるようにし、スレッドのリンクをチケットに書き戻し
1つのデプロイで3つの OpenProject インスタンス(別々のチーム)に対応し、インスタンスごとに設定とデータを分離
バグ統計、チケット健全性、日次レポートの定期ジョブ。メッセージはバッチ送信
GitOps 設定ダッシュボード:すべての編集は GitLab API を通じた Git コミットになる(約340件の変更)。push webhook で影響を受けたサービスのみを再ビルドまたは再起動
技術的意思決定
| 技術的意思決定 | 選択 | 代替案 | 理由 |
|---|---|---|---|
| 設定の保存先 | Git 上の YAML を、GitLab API 経由でコミットするダッシュボードから編集 | データベースのテーブル | すべての変更に履歴・レビュー・リバートが追加コストなしで付き、設定のみの変更ならイメージを再ビルドせずにサービスを再起動できる。 |