2017年6月11日日曜日

Raspberyy Pi を Subversion のリポジトリサーバにして,systemd で自動起動するように設定する.

仕事ではソースファイルの管理をちゃんとしているのに,趣味で作ったプログラムはほとんど何もしていなかったので,Raspberry Pi で svnserve を起動して管理することにした.

まずは,ラズパイ上で Subversion のパッケージをインストールする.
# apt install subversion

次に,Subversion 管理者ユーザを新たに作成する.(-m オプションを付けると,/home/svn を自動作成してくれる)
# useradd svn -m
# su - svn

そして,レポジトリを保存するディレクトリを作成する.
$ mkdir -p /home/svn/repos/sample

svnadmin コマンドでリポジトリを作成する.
$ svnadmin create /home/svn/repos/sample

作成したリポジトリをチェックアウトして,trunk,branches,tags ディレクトリを作成しコミットする.
$ mkdir test
$ svn checkout file:///home/svn/repos/sample test
リビジョン 0 をチェックアウトしました。
$ cd test
$ svn mkdir trunk branches tags
A         trunk
A         branches
A         tags
$ svn commit

最後の svn commit コマンドを実行すると,vi (規定のエディタ)でコメントの編集ができるので,
「-- この行以下は無視されます --」よりも上にコメントを記入して保存する.
Create trunk, branches, tags ← 追記
-- この行以下は無視されます --

A    branches
A    tags
A    trunk

保存が完了すると,コンソール画面に戻りコミットされる.
$ svn commit
追加しています              branches
追加しています              tags
追加しています              trunk

Committed revision 1.

念の為,コミットした結果をリスト表示で確認する.
$ svn list file:///home/svn/repos/sample
branches/  ← 追加されている
tags/      ← 追加されている
trunk/     ← 追加されている

今度は,コミットした結果をログ出力で確認する.
$ svn log file:///home/svn/repos/sample
------------------------------------------------------------------------
r1 | mirasuni | 2017-06-11 10:58:50 +0900 (2017年06月11日 (日)) | 2 lines

Create trunk, branches, tags

------------------------------------------------------------------------

正常に動作していることが確認できたら,test ディレクトリは不要なので削除する.
$ cd ../
$ rm -r test





ローカルで管理するだけならば,上記の方法で問題ないが,リモートでアクセスできる方がなにかと便利なので,
次に svnserve を起動してリモートからアクセスできるようにする.

まず,リモートでアクセスするための認証設定をラズパイ上で行う.
$ vi /home/svn/repos/sample/conf/svnserve.conf
[general]
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz

$ vi /home/svn/repos/sample/conf/passwd
[users]
hoge = hogepass

$ vi /home/svn/repos/sample/conf/authz
[/]
hoge = rw
* = r

それぞれの設定の意味はなんとなく想像つくと思うので,省略する.

認証設定が完了したら,いよいよ svnserve を起動する.
最初は,listen-once (一度だけ応答する)モードがおすすめだ.(-X オプション)
$ svnserve -X

次に,LAN内の別の端末からラズパイのIPアドレス(192.168.100.3)を指定してアクセスし,svnserve の動作を確認する.
$ svn list svn://192.168.100.3/home/svn/repos/sample
branches/
tags/
trunk/

このとき毎回,「 /home/svn/repos/sample 」等と長々と入力するのは面倒なので,
次は,root ディレクトリを指定して svnserve を起動する.(-r オプション)
$ svnserve -r /home/svn/repos -X

同様に別の端末から動作を確認する.
$ svn list svn://192.168.100.3/sample ← IPアドレス以降,sample だけでアクセス可能
branches/
tags/
trunk/

動作確認が完了したら,listen-once モードではなく,デーモンモードで起動する.(-d オプション)
$ svnserve -r /home/svn/repos -d

そして,現行のソースファイルを開発機から Subversion にコミットする.
$ svn import ~/SampleProject svn://192.168.100.3/sample/trunk --username hoge
Import Sample Project
-- この行以下は無視されます --

A    /home/mirasuni/SampleProject
認証領域:  ce81eb8d-27e3-4001-8c0b-d8de94796118
'hoge' のパスワード: ******** ← 設定したパスワード(hogepass)を入力

追加しています              SampleProject/Makefile
追加しています              SampleProject/main.c
追加しています              SampleProject/main.h
Committing transaction...
リビジョン 2 をコミットしました。

念の為,コミットした結果をリスト表示してみる.
$ svn list svn://192.168.100.3/sample/trunk
Makefile  ← 追加されている
main.c    ← 追加されている
main.h    ← 追加されている

これで svnserve の設定はほぼ完了.あとは,好きなところにソースファイルをチェックアウトして,編集するなり,コミットするなりすれば良い.





最後に,ラズパイ起動時に svnserve が自動的にデーモンモードで起動するよう設定する.

残念ながら systemctl enable するだけのお手軽設定にはなっていないので,自分で設定してやる必要がある.
(参考)systemct enable → No such file or directory
# systemctl enable svnserve
Failed to execute operation: No such file or directory

(参考)systemct status → No such file or directory
# systemctl status svnserve
● svnserve.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)


こんなときは初めに作成した svnユーザで crontab @reboot を使えばとても簡単に自動起動できるようになるが,せっかくなので systemd で管理できるようにしてみる.

まず,設定ファイルを作成する.(内容は /lib/systemd/system/ssh.service からパクってきて,一部書き換えた)
$ vi svnserve.service
[Unit]
Description=Subversion Server
After=network.target

[Service]
ExecStart=/usr/bin/svnserve -r /home/svn/repos -d
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

これを systemd の管理ディレクトリ(?)に置く.
# mv svnserve.service /etc/systemd/system

再び,systemctl status してみると,今度は認識される.
# systemctl status svnserve
● svnserve.service - Subversion Server
   Loaded: loaded (/etc/systemd/system/svnserve.service; disabled)
   Active: inactive (dead)

認識されるようになったので,enable して自動起動するよう設定する.
# systemctl enable svnserve
Created symlink from /etc/systemd/system/multi-user.target.wants/svnserve.service
 to /etc/systemd/system/svnserve.service.

さらに,systemctl status してみると,今度は enabled に変更されている.
# systemctl status svnserve
● svnserve.service - Subversion Server
   Loaded: loaded (/etc/systemd/system/svnserve.service; enabled)
   Active: inactive (dead)

このまま,ラズパイを再起動すれば svnserve は自動起動されるが,結果をすぐに確認したいので,systemctl start する.
# systemctl start svnserve

もう一度,systemctl status して状況を確認すると,今度は svnserve が起動されている.
# systemctl status svnserve
● svnserve.service - Subversion Server
   Loaded: loaded (/etc/systemd/system/svnserve.service; enabled)
   Active: inactive (dead) since 日 2017-06-11 12:16:11 JST; 48s ago
  Process: 1718 ExecStart=/usr/bin/svnserve -r /home/svn/repos -d (code=exited, status=0/SUCCESS)
 Main PID: 1718 (code=exited, status=0/SUCCESS)

 6月 11 12:16:09 riemann systemd[1]: Started Subversion Server.
 6月 11 12:16:11 riemann svnserve[1718]: DIGEST-MD5 common mech free

最後に,別の端末から svnserve にアクセスできるか確認する.
$ svn list svn://192.168.100.3/sample
branches/
tags/
trunk/


【まとめ】
随分と手順が多くなってしまったが,今回の課題をクリアするために,svnserve の設定から,systemd の設定まで色々と調べたので,この内容が一人でも多くの人の役立ってもらえれば嬉しい限りです.


0 件のコメント:

コメントを投稿