Pi Zero W + Git + Docker で簡単なデプロイ環境を作る

約1年前にRaspberry Pi Zero Wを買ったが, ラズパイの環境構築は小さい分, 汚れ易い. そこで, ローカルで開発しgit pushだけでデプロイできる herokuのような環境を構築した. 私は潔癖症である.

目次

  1. 作ったもの
    1. 構成イメージ
    2. 使い方
  2. インストール
    1. Raspberry Pi OSのインストール
    2. Dockerのインストール
    3. Docker Composeのインストール
    4. Gitのインストール
    5. gitユーザーの作成
    6. pihubのインストール
  3. Hello, World!
  4. Lチカ
  5. 参考

作ったもの

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ユーザーを作成する.

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-distutilspipのインストールに必要らしいのでいれておく.

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 # デプロイ

接続はこんな感じ.

img “https://blog.alexellis.io/content/images/2016/08/Screen-Shot-2016-08-20-at-09-40-46-1.png” ""

画像の引用元: Get Started with Docker 1.12 on Raspberry Pi

ずっとチカチカしてるとコンテナが開きっぱになるので, 10回で停止するようにしている.

参考

Raspbian初期設定とか

Docker on Raspberry Pi

Docker Compose on Raspberry Pi

Gitサーバー

Nginx構築

Lチカ