はじめに
最近のwebアプリケーション開発ではCI(Continuous Integration)やCD(Continuous Delivery)が充実していて、リモートリポジトリにpushすれば自動的に本番環境が更新されるので便利ですよね
でも、本番環境がローカル端末だった場合は、CIツールにCDしてもらうわけにもいかず、リモートの変更を毎回pullしなきゃいけないので面倒くさい
ましてやハッカソンみたいな時間がない中で 本番環境がRaspberryPiの場合、RaspberryPiでの開発はどころかコマンドを打つ手間も減らしたい
ということで、RaspberryPiに仕込んでおけばリモートリポジトリが更新されるたびにpullしてくれるCDツール、CanDyPi を作りました!
これで来年は最優秀賞間違いなし
CanDyPi
CanDyPi is a Continuous Delivery tool for raspberry Pi.
作りは簡単。GitHubのwebhook機能を使って、RaspberryPiからforwardingしたngrokのエンドポイントにwebhookをひっかけます。CanDyPiがリポジトリ更新のメッセージを受け取ったら、pullコマンドを実行して最新のソースに更新します。
CanDyPiはpythonで書かれていて、サーバにflask
・git操作にgitpython
を使っています。
使い方
事前準備
- python 3系
- ngrok
- git
- GitHubのリポジトリ
手順
4ステップで使えます
1. ラズパイで、gitのSSH接続
SSH設定にしないと、pullの度にパスワードを入力しなきゃいけないので、ラズパイ操作から解放されません・・・
この辺りの記事が参考になります。
GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~
2. ラズパイで、CanDyPiのインストール&実行
pipでインストールできます。
㊟python3系でインストール&実行してください
$ pip install candypi
実行も簡単!
CDしたいリポジトリのパスを引数に与えてください。
(デフォルトでは、50000ポートで立ち上がります)
$ candypi /Users/tiwasa/sample_project
3. ラズパイで、ngrokの起動
candypiを起動したポートを指定して、ngrokを起動してください。
$ ngrok http 50000
ngrok by (Ctrl+C to quit)
Session Status online
Account XXXXXXXX (Plan: Free)
Version 2.2.8
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://XXXXXXXX.ngrok.io -> localhost:50000
Forwarding https://XXXXXXXX.ngrok.io -> localhost:50000
4. GitHubで、webHooks設定
CDしたいリポジトリにwebhookを登録します。
GitHubのSettings -> Webhooksで、add webhookのPayload URLに、ngrokの Forwarding https://XXXXXXXX.ngrok.io -> localhost:50000
表示されたhttpsのアドレスを入れてadd webhook してください。
(その他の項目はdefaultのままで大丈夫です。)
5. 完成
CDしたいリポジトリのmasterブランチに更新が発生すると、ラズパイ内のローカルリポジトリでpullコマンドが走って、最新になります。
さいごに
年末年始に作ったので、私自身もまだ実践投入していません。なんか手ごろなハッカソンないかな~?
もし使っていて気が付いたことがあったら、GitHubのissueか、このページのコメント欄に書いていただけると回答します。
ちなみに、ラズパイと同じローカルネットワーク上に開発用PCを配置できるんだったら、vscodeのリモートデベロップのほうが便利だと思います。ま、会場次第で別のLANに配置される可能性もあるから、CanDyPiの存在価値もある
・・・と
・・・思いたい