要点 


以前公開したToolの機能追加とCI用にCircleCIなどを導入したお話です。またOSSならばGithubのマーケットプレイスからコードレビューや脆弱性チェック、依存ライブラリのバージョンアップ追随などが無料で利用が出来て、非常に便利だったのでご紹介します。

pr

はじめに 


調査補助ツールの作成と公開で紹介したPyPIに登録したToolをドッグフーディングしていたところ、不便な事があったので追加したい機能が出てきました。そこで何が不便でどのように改善したかをまとめます。

機能追加の際、Toolを公開した事で開発が一段落していた事もあり、更に開発を行うのであればいっそのことCIなどの環境を用意したほうが効率的で面白そうだなと思い至りました。例えばToolのPythonバージョンにおける後方互換性を確認するため、手元のPCでPythonのバージョンを切り替えて確認する事は手間です。

また一人で開発しているためレビューが存在せず、自分のコードの品質の担保がコーディング規約(pep8)に準拠しているか程度でしかありません。折角なので書いたコードをレビューして貰った方が糧になりますが、人に依頼する場合は高コストになりがちです。そこでウェブサービスやGithub AppsなどのSaaSを利用して、検証やコードの静的解析、脆弱性チェック等を低コストで行うのは良い選択肢です。特にOSSであれば無償で利用可能なケースが多く敷居がとても低いです。グレートです。

というわけで、開発を快適にするための仕組みを導入していったので、どのような物を導入したかをまとめます。実際にそれぞれがどのような機能しているかはリポジトリを覗いていただけると良いかと思います。

機能追加 


主な内容としては新しいサーチ方法を追加して2種類のサーチ方法を選べるように、それぞれをsub-commandとして実装しました。新しいサーチ方法は既存のサーチ方法と異なり、OwnerとRepository名の両方の情報を必要としないようにし、Heuristicな結果を出力するようにしました。

実装の背景として、元々はリポジトリの検索時にownerrepoの情報を要求していました。しかしownerの情報が分かっていない場合は多く、2つ情報を入力するのは手間なのでrepoだけの入力に済ませたいと感じました。もちろん、owner情報が欠けている場合、本来欲しかった情報の対象を間違える可能性がはあります。

そこでstrictサーチとheuristicサーチの2種類を用意する事にしました。strictサーチは既存のサーチ方法でownerrepoの両情報を必要とする代わりに、正確に情報を取得することが可能です。その反対にheuristicサーチはrepoの情報だけで済みますが、本来の取得対象を間違える可能性があります。

使用方法はまずheuristicサーチを行い、間違えている結果だけstrictサーチで再度結果を出力すれば良いと考えました。2つの結果を簡単にマージしやすくするために、TableのHeader情報を出力しない便利と考え、Headlessオプションの追加を行いました。

外部サービス 


今回お世話になった外部サービスはCircleCIとhatchfulです。利用した経緯と内容について記述します。

CircleCI 

Docker上でCI・CDを行ってくれるSaaSです。

https://circleci.com/

今回は公開したToolが開発に利用しているPythonよりも古いバージョンでも動くか、後方互換性を確認するためのCI目的で利用しています。というのも開発にはPython3.7を利用していたのですが、以前のPythonバージョンから同梱されているモジュールでPython3.7等で追加拡張された機能を利用する場合、Python3.5などでは動作しない場合があります。 今回の具体的なケースを一つ挙げると、argparse#ArgumentParser#add_subparsersの引数requiredはPython3.7から追加されたため、Python3.6、3.5では動作せずにエラーが発生します。

そういった問題に対し手元でPython自体の仮想環境pyenvを用意し、各Pythonバージョンで動作確認をする事はとても手間になります。

手間は省きたいけれど後方互換性は確認したい…そこでPR毎に自動的にCircleCI上でToolのBuildを行い成果物を生成し、その成果物を各Pythonバージョンで動作確認すればとても楽になるというわけです!というわけでそうしました。

hatchful 

テーマを選択していくことで様々な色調や形のアイコンが自動生成されます。

https://hatchful.shopify.com/

Repositoryの設定を眺めていたらSocial previewの項目がありました。折角だったので取り敢えずアイコンを用意しようと思いましたが、残念ながら私には絵心がないのでアイコンを自動生成してくれるWebサービスを利用することにしました。実際に自動生成されたアイコンが下記の通りです。

pr

ファイル形式 

また下記のように様々なフォーマットをzipに同梱して提供してくれます。(fileコマンドは便利)

  • facebook_cover_photo_1.png: 1640 x 624, 4-bit colormap
  • facebook_cover_photo_2.png: 1640 x 624, 4-bit colormap
  • facebook_profile_image.png: 1200 x 1200, 4-bit colormap
  • favicon.png: 32 x 32, 8-bit colormap
  • instagram_profile_image.png: 1000 x 1000, 4-bit colormap
  • linkedin_banner_image_1.png: 1536 x 768, 4-bit colormap
  • linkedin_banner_image_2.png: 1536 x 768, 4-bit colormap
  • linkedin_profile_image.png: 1000 x 1000, 4-bit colormap
  • logo.png: 1200 x 1200, 4-bit colormap
  • logo_transparent.png: 1200 x 1200, 8-bit colormap
  • pinterest_board_photo.png: 800 x 800, 4-bit colormap
  • pinterest_profile_image.png: 330 x 330, 4-bit colormap
  • twitter_header_photo_1.png: 1500 x 500, 4-bit colormap
  • twitter_header_photo_2.png: 1500 x 500, 4-bit colormap
  • twitter_profile_image.png: 800 x 800, 4-bit colormap
  • youtube_profile_image.png: 800 x 800, 4-bit colormap

GitHub Apps 


GithubのMarketplaceで導入したGitHub Apps一覧です。

下記の画像は実際にそれぞれを運用している際のPR画面です。

pr

Dependabot Preview 

Github公式App。依存しているライブラリのバージョンアップの有無を確認し、バージョンアップが存在する場合は必要な情報を含めたPRを作成してくれます。つい古いバージョンを使い続けてしまい、セキュリティ問題などに気づかない事は多いので重宝。

https://github.com/marketplace/dependabot-preview

Hound 

PR作成時にコードレビューをしてくれます。一人開発時の改善補助やレビューアーの負担が減り重宝。

https://github.com/marketplace/hound

CodeFactor 

PR作成時にコードレビューをしてくれます2号。Houndとの比較用に導入。

導入時に4箇所指摘してくれたので、全期間において未だ0箇所のHoundより優秀なのかと期待してます。指摘内容もロジックレベルだとbash scriptで1点、python scriptで2点でした。

https://github.com/marketplace/hound

ImgBot 

画像を圧縮してくれます。定期的に実行され、圧縮可能なファイルがある場合はPRを作成してくれます。

Readme用に画像ファイルを置いたので、取り敢えず導入しました。

https://github.com/marketplace/imgbot

LGTM.com 

コード解析を行い、脆弱性チェックをしてくれます。初回実行に時間がかなり掛かりましたが、あることに越したことはなし。PR作成時に実行してくれます。

https://github.com/marketplace/lgtm

おわりに 


以前公開したToolの機能追加と修正を行いました。

またそれと同時に外部サービスを利用して開発の効率や品質を高めるようにしました。外部サービスはCircleCIだけでなく、Githubと連携したサービスやToolのアイコン生成用のサイトなども紹介しました。

外部サービスはOSSならば無料で利用可能でしたが、それぞれの外部サービスは無料だから質が低いということは勿論ありません。

あくまでもOSS開発者に無料提供することでサービスのファンを増やし、個人・商用利用時に技術選択して貰い課金して貰うことが目的なので、サービスの質はとても高いです。PrivateなRepositoryの個人利用でも数枠までは無料のサービスもあるので、ぜひ試してみてください。

また面白いサービスがあったら教えていただけると嬉しいです。

余談ですが、ドラクエウォークがとても楽しいです!