エンジニア5周年記念にオープンソースプロジェクトを自分で立ち上げた話
TL;DR
この度オープンソースでプロジェクトを公開したので、そのために準備していったことや公開したアプリについて話します。
はじめに
🎉 この度、オープンソースでアプリケーションを公開しました 🎉
その名も「おたくつーる」と言いまして、私のようなオタクがより豊かなオタクライフを送れるようなアプリにしたいと思い、アジャイル方式で徐々に機能を拡張させていこうと考えています。
いまあるのは、元々個人的に使っていた、"超 A&G の番組情報を通知する機能"のみです。
この次は、これまた別に作っていた"推しアニ!"というアニメレビューアプリの機能を統合を統合したいと考えています。
またみなさんから「こういう機能あったらおもしろいんじゃ?」というアイデアがあれば、ぜひプロジェクトの issue へ書いていってください!
逆に私が実装したい欲しいことも issue に書いていたりするので、「手伝ってやろうかな」と思う方は是非ともコントリビュートをお待ちしております!
公開したアプリ
以前、個人的に超 A&G の番組情報を通知してくれるサービスが欲しいと思い、こんなプログラムを組みました。
- Python で書いたプログラムを Google Cloud Functions にデプロイする。
- 負荷をかけないように月に 1 度だけ超 A&G の HP から最新の番組情報を取得する。
- 取得した番組情報をスプレッドシートに書き出す
- スプレッドシートを編集して、自分が視聴しようと思っている番組(通知対象)を選択する
- 毎朝 5 時にメールが送信され、その日に自分が視聴したいと思ってる番組の一覧と放送時間が送られてくる
これを作ったのは、超 A&G の番組は割と頻繁に変わっていて、毎日 HP へチェックしにいくのがめんどくさいからです。
あとは、基本的に自分が興味のある番組の放送時間だけが知りたいといったのが理由です。
ですが、
- どうせ作るなら他に使いたい人がもしいればその人も使えるようにしてあげたい
- どうせ作るならソースを公開して、みんなで作った方が楽しいし、OSS 開発っぽいことができそうでおもしろそう
このあたりの理由から、今回このような形でシステムを置き換えてみることにしました。
先ほどのスプレッドシート部分を Laravel×MySQL に置き換えて、稼働環境では AppEngine(もしくは Cloud Run)×Cloud SQL で動かそうという魂胆です。
(現状は 1 機能しかなく、利用ユーザーの見込みも経っていないので公開まではしていません)
手元で動かしてみたいという人は、リポジトリをフォーク → クローンしてローカルで動かしてみてください。
Docker で動かせます。
画面イメージはこんな感じです。
元のスプレッドシートはこんな感じで、個人的には Web の UI だとだいぶ見やすくなったんじゃないかと思ってます。
準備したこと
ざっくりこんな感じ。
- 他の OSS リポジトリを参考に issue の立て方や PullRequest の送り方の指針を決める
- GitHub の"Community Standards"を参考に必要な準備を進める
- Branch Protectsion の設定をする
- GitHub Actions で自動テストの準備を進める
1. 他の OSS リポジトリを参考に issue の立て方や PullRequest の送り方の指針を決める
これまでに OSS へコントリビュートした経験を元に、他のリポジトリがどんな準備をしているのか?を参考にしました。
一番参考になったのは Laracom のプロジェクトでした。
やはり多くの Laravel 利用者からのコントリビュートを受けており、自分自身もよくコントリビュートさせていただいているプロジェクトを参考にするのが一番良かったです。
README の書き方や、テストコード、プルリク → マージまでの流れはこのプロジェクトを参考にさせていただいています。
基本的に OSS 開発は知り合いと対面で仕様やコートレビューをするわけではなく、テキストベースかつ非同期でのコミュニケーションが主体になります。
そうすると、必然的に図や画面キャプチャの優位性が高まるため、それらを多用することを促すようにしました。
CONTRIBUTING.md から別ページに飛ばす形で実際に issue やプルリクの例を掲載したコントリビュートの流れを紹介しています。
2. GitHub の"Community Standards"を参考に必要な準備を進める
GitHub で自分のリポジトリの、Insights > Community Standards へ遷移すると、なにやら Checklist が表示されていて、それと一緒に「Here’s how this project compares to recommended community standards.」というメッセージが表示されています。
ここで GitHub が OSS を始めるにあたって必要なことなどを、ずいぶん手厚く教えてくれます。
で、GitHub の手解きに従ってなにを準備したかは ↓ の感じです。
- README
- 環境構築の手順や、そのアプリがどういうものなのか?を記載します。
- Code of conduct
- Code と書いてあるのでコーディング規約的なものかと思ったのですが、そうではなく「行動規範」のようです。
- Connpass でよく書かれてあるような、コミュニティガイドライン的な内容を記載します。
- Contributing
- コントリビュートにあたっての流れなんかを記載するようです。
- 今回はこれまで自分が経験した OSS コントリビューションの流れをそのまま記載しました。
- License
- そのままのとおりライセンスです。
- 雛形を用意してくれるので、代表者の名前だけ変えて利用しました。
- Security Policy
- 今回は簡単に、セキュリティに関する指針だけ記載しました。
- 正直何を書けばいいかわからなかったので、Laracom さんの内容をほとんど拝借しています。
3. Branch Protection の設定
GitHub で自分のリポジトリの、Insights > Settings へ遷移して Branches を選択します。
ここで、誰もが勝手にマージすることを許可する設定になっているとリポジトリがめちゃくちゃになってしまうため、マージの際にはプルリクエストを必須にしたり、プルリクエストからマージを行うためには最低でも「approval」が一つは必要な設定を施します。
4. GitHub Actions で自動テストの準備を進める
OSS に限らず大人数での開発になるともはや最近では必須なのが自動テストですよね。
特にこと OSS に関しては不特定多数の人間がコードに触れることができるので、既存のコードが破壊されていないことを担保する自動テストは欠かせません。
今回は Laravel(PHP)と Python の 2 種類分のテストコードと、実行ワークフローを用意しました。
実際にオープンソースで公開してみて、開発者として有意義に思えたこと
やっぱり一番は外部のエンジニアと交流を持つことができることです。
実際この issueのような、普段一緒に仕事をするメンバー以外から有益なフィードバックを受けることができたりして、自分の至らない部分に気づき、改善を図る機会を得られるのはとても有意義だと思います。
ましてや、仕事の場だけでなく、それ以外の自己研鑽の場で他人からのフィードバックを受けられるのは貴重だと感じました。
また開発の進め方や、大人数での開発のために必要な準備をする経験ができるのも良い経験になるかと思います。
(仕事だと、新規でプロジェクトが立ち上がる機会がないので)
その際に必要な知識を外部のエンジニアから得つつ、開発環境を整備していけるのもオープンソースプロジェクトを一から立ち上げる魅力かと。
一方で、プロジェクトの難易度自体は高いものではないので、誰でも気軽にプルリクエストを送ることができると考えています。
そこで、自分が責任を持ってレビューするという経験を自分のレベルに合った範囲で経験することができるのもまた有意義だと思いました。
おわりに
意外とここまでを準備するのに時間がかかった印象です。
ただ 2 回目以降は今回のプロジェクトをベースに準備すればよさそうなので、今回ほど準備に時間は掛からなさそうな気はします。
あとはこのプロジェクトがどう育っていくのか…
自分自身、技術力が高いわけではないのでレビューと言われても逆に質問することが多そうですが、それはそれで自分に還元されているのでいいのかなと思います。
ただ、つよつよエンジニアが来てくれればいいですが…来なければ…
なので、この記事を見られた方のコントリビュート、是非お待ちしています!(笑)
メンバー募集中!
サーバーサイド Kotlin コミュニティを作りました!
Kotlin ユーザーはぜひご参加ください!!
また関西在住のソフトウェア開発者を中心に、関西エンジニアコミュニティを一緒に盛り上げてくださる方を募集しています。
よろしければ Conpass からメンバー登録よろしくお願いいたします。
Discussion
What is the drawing tool?
Thank you for your comment.
Are you referring to the system configuration diagram drawing tool?
We use a tool called draw.io for this.
Thank. Yes, that's what I want.
You're welcome. Glad I could be of service!