👀
対応漏れを防ぐために:GitHubと連携するツールを開発してみた
プロジェクト管理ツールが会社に欲しいとずっと思っていました。
最近始まったプロジェクトでプロジェクト管理に課題を感じたので簡単なツールを個人開発して解決していこうとしている取り組みについて共有したいと思います。
背景
社内で利用されているプロジェクト管理ツールはあるにはあるのですが、工数を入力して月末に費用があっているのかを確認するツールとして利用されており、プロジェクトを管理できているとは言い難いもので役に立っていませんでした。
最近始まったプロジェクトでは非技術職の方との協業が増えており、コミュニケーションツール(Mattermost)を利用したやり取りで以下のような課題を感じていました。
- 対応漏れの発生: 五月雨式に要望がコミュニケーションツールや会話中に届くため、見落としや対応忘れが起こりやすい
- 進捗の共有が困難: Mattermostでは情報が流れてしまい、プロジェクトの全体像や進捗状況を把握しにくい。
- GitHubとの非連携: GitHub Issueベースの開発スタイルを目指していて、要望とIssueが直接紐づけば管理が簡単だが、現状は管理が煩雑になってしまっている
課題感に対して考えたこと
プロジェクト管理用のSaaSを導入すれば一発で片付きそうな課題だとは感じています。
一方でSaaSの導入には契約のために決済を通す必要があり、今までのやり方がまかり通っている現状を変えていくにはプロジェクト管理ツールによって十分に効率化できることを証明し、開発チームの外にも自分の意見の味方を作る必要があると考えました。
シンプルなUIとデータを扱うための簡単なAPIを用意して、クラウド系のサービスの無料枠で賄えばツールとして導入・運用できそうだと考えました。
開発したもの
公開用に1つのリポジトリにサンプル用にぼかしてまとめました。
ツールを利用したときのワークフロー
ワークフローの概要を図示したものです。
- 【非開発者】UIにアクセスし、対応項目を入力(タイトル,詳細,期限を設定)
- 【GitHub】GitHub ActionsによってIssueが自動生成される
- 【開発者】Issueと作業ブランチを対応させ、対応項目を修正
- 【開発者】作業ブランチをマージ
- 【開発者】対応項目の進捗状況を「対応済み」に更新
- 【非開発者】対応内容を確認しステータスを更新
技術
- フロントエンド
- フレームワーク: Next.js
- ホスティング: Cloudflare Pages
- バックエンド
- 言語: Go (TinyGo)
- 実行環境: Cloudflare Workers
- DB: Cloudflare D1
- その他
- GitHub
- GitHub Actions
備考
- すべて無料枠を活用して運用できる範囲にしつつ、Goは自分が勉強したかったので選定しています。
- Cloudflare WorkersでGo(TinyGo)を利用するリポジトリを最大限参考にさせてもらいました。(ありがとうございます。)
- https://github.com/syumai/workers
- 最終目的はSaaSツールの導入なのでツールの作成はシンプルに最低限の機能だけを実装しています。
機能概要
- UI
- 課題・修正要望の追加・一覧・編集・削除の操作ができる
- 課題・修正要望の追加・一覧・編集・削除の操作ができる
- API
- UI上の操作に対応したCRUD操作
- GitHubへの連携用のメソッド
- GitHub Actions
- APIから未連携の要望を取得し、Issueを自動的に作成する
- APIから未連携の要望を取得し、Issueを自動的に作成する
使用方法の概要
- Next.js製のUIをCloudflare Pagesにデプロイ
- APIをCloudflare workersにデプロイ
- wrangler経由でD1を作成してtomlファイルに設定
- 開発用のリポジトリにGitHub Actionsのyamlファイルを入れて、onの部分にcronの設定と追加
- チームに説明して修正要望などをUIで入力してもらう
今後の展望(まとめ)
最終的なゴールはプロジェクト管理ツールのSaaSの導入です。
これに向けて以下をやっていきたいと思います
- 自作したツールの効果の検証
- 一緒のプロジェクトに関わる技術者のチームと非技術者のチームにヒアリング
- 効率化や正確さの向上につながったか
- コミュニケーションコストを下げられたか ... など
- 一緒のプロジェクトに関わる技術者のチームと非技術者のチームにヒアリング
- プロジェクト管理用SaaS導入の提案を推してくれる味方づくり
Discussion