Pi Zero W + Git + Docker で簡単なデプロイ環境を作る
約1年前にRaspberry Pi Zero Wを買ったが,
ラズパイの環境構築は小さい分, 汚れ易い.
そこで, ローカルで開発しgit push
だけでデプロイできる
herokuのような環境を構築した.
私は潔癖症である.
目次
作ったもの
pihub という管理ツールをNimで作った.
GitHub - xiupos/pihub
イメージは, heroku
コマンドのようなもの.
ただし, 実行は全てdocker-compose up
で行うため,
機能はGitLab CI/CDの方が近い.
(Zero以外のラズパイだったら
GitLabを載せるのもアリだと思う.)
もっとも,
pihub
はインフラ系の運用だけでなく
GPIOを弄るようなハードウェア制御も想定している.
構成イメージ
+----------Raspberry Pi Zero W-----------+
| +--Remote--+ +-----Production-----+ |
| | |pull| +-Container-+ | |
| | (2) |===>| (3) | (4) | | |
| | | | +===========+ | |
| +====/\====+ +====================+ |
+======||================================+
|| push
+--Local---+ $ pihub create repo
| (1) | で, この構成が作られる.
+==========+
(1) ローカルリポジトリ, ここで開発
(2) リモートリポジトリ, ここにpush
(3) 本番環境, (2)へのpush後に自動的にpull
(4) デプロイ環境(コンテナ), (3)のpull後に走る
使い方
pihub
はラズパイ上のツールであり,
ローカルからはSSH経由で操作する.
ただし, alias
で登録をするとローカルでも
同様に操作ができる.
以下, ホスト名はraspberrypi.local
とする.
リポジトリの作成
repo_name
はリポジトリの名前.
末尾に.git
を含めてはいけない.
pihub create repo_name
これで[email protected]:repo_name.git
にリポジトリが,
/home/git/prod/repo_name
に本番環境ができる.
リポジトリ一覧の表示
pihub list
# repo_name.git
# repo_another.git
# ...
デプロイ
git remote add pi [email protected]:repo_name.git
git push pi master
リモートに登録し, git push
をすれば
docker-compose up -d
が走る.
リポジトリの削除
create
と同様に,
末尾に.git
を含めてはいけない.
pihub delete repo_name
これで[email protected]:repo_name.git
と
/home/git/prod/repo_name
が削除される
(同時にdocker-compose down --rmi all
も実行される).
無い機能
git push
以外でdocker-compose up
をするdocker-compose stop
など停止系, 削除系- デプロイなしで, テストできたら楽しそう
インストール
必要なもの
- Raspbian on Raspberry Pi Zero W Zero W以外では試していない (というか持っていない).
- git
- docker
- docker-compose
また, git
ユーザーを作成する.
Raspberry Pi OSのインストール
日本語情報は既に大量にあるので, ここでは簡単に.
公式サイトより Raspberry Pi OSのイメージをダウンロードして解凍. Zeroなのでlite版で十分.
# SDカードへの書き込み
sudo dd bs=4M if=path/to/image.img of=/dev/sdb conv=fsync
(/dev/sdb
の部分は環境に合うよう書き直す.)
SDカードに書き込んだらSDカードのboot
パーティションをマウントし,
boot
内で以下を実行,
USB経由でSSH接続できるように設定する.
touch ssh # SSH有効化
echo "dtoverlay=dwc2" >> config.txt
vim cmdline.txt
# modules-load=dwc2,g_ether を rootwait の直後に追加
# See also http://blog.gbaman.info/?p=791
SDカードをアンマウントしてZero Wに挿入すれば Raspbianが起動する.
ssh [email protected]
# Pass: raspberry
でSSH接続できるはずだが, 自分の環境では ネット設定の有線接続1の IPv4 の Method を Link-Local Only に変更する必要があった.
SSH接続したら, 初期設定やら更新やらをする.
# Password, Host, Wi-Fi などの設定
sudo raspi-config
# Packages と OS のアップグレード
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get dist-upgrade -y
# Farmware のアップグレード
sudo rpi-update
sudo reboot # 再起動
適宜, SSH接続の設定などもする.
Dockerのインストール
# Docker のインストール
curl -sSL https://get.docker.com/ | sh
Docker Composeのインストール
Armでは公式サイトの方法は使えないので,
pip
でインストールをする.
# pip のインストール
sudo apt-get install -y build-essential python3-distutils
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && sudo python3 get-pip.py
# Docker Compose のインストール
sudo pip install docker-compose
python3-distutils
はpip
のインストールに必要らしいのでいれておく.
Gitのインストール
sudo apt install -y git
gitユーザーの作成
pihub
を扱うユーザーを作る.
要するにいわゆるGitサーバー用のユーザー.
sudo adduser git
# "docker" グループにユーザーを追加
sudo usermod -aG docker git
docker
コマンドを扱うために,
docker
グループにユーザーを登録する.
pihubのインストール
GitHub - xiupos/pihub
git clone https://github.com/xiupos/pihub.git ~/.pihub
cd ~/.pihub
docker-compose up # Dockerでビルド
# PATHを通す
echo "export PATH=$PATH:$HOME/.pihub/bin" >> ~/.bashrc
source ~/.bashrc
インストールはnimble install
でできるが,
Nim環境の需要はそんなにないと思うので
Dockerでビルドさせている.
(balenalib/rpi-raspbian
イメージを使っている.)
ちなみにこれもpihub
で開発した.
SSH経由で操作するためのalias
# Local PC (Debian など)
echo "alias pihub='ssh [email protected] /home/git/.pihub/bin/pihub'" >> ~/.bashrc
source ~/.bashrc
Windowsで登録する方法は知らない.
Hello, World!
お約束. コンソールではつまらないのでnginx
を使う.
GitHub - xiupos/pidocker-server
# Local PC
git clone https://github.com/xiupos/pidocker-server.git
cd pidocker-server
pihub create hello # リポジトリの作成
git remote add pi [email protected]:hello.git
git push pi master # デプロイ 初回は時間がかかる
http://rasberrypi.local:8080/にアクセスすると Hello, world! が表示される.
Lチカ
GPIOを弄らなきゃラズパイじゃない !
GitHub - xiupos/pidocker-blink
git clone https://github.com/xiupos/pidocker-blink.git
cd pidocker-blink
pihub create blink # リポジトリの作成
git remote add pi [email protected]:blink.git
git push pi master # デプロイ
接続はこんな感じ.
画像の引用元: Get Started with Docker 1.12 on Raspberry Pi
ずっとチカチカしてるとコンテナが開きっぱになるので, 10回で停止するようにしている.
参考
Raspbian初期設定とか
-
Raspberry Pi ZeroをUSBケーブル1本で遊ぶ | Japanese Raspberry Pi Users Group
-
Raspberry Pi Zero – Programming over USB! (Part 2) | Andrew’s blog