みなさんどうもこんにちは。CTOの馬場です。

突然ですが、みなさん、会社でリポジトリどうしてます?

インフラエンジニアだとしても管理したいものはたくさんありますよね。 プロダクトの設定ファイル、ドキュメント、 各種運用スクリプト、監視ツールのプラグイン等々...

弊社でもそりゃまぁいろいろありまして、 いままでは使っててSubversionだったんですけれども 2010年代にもなって中央集権はないだろうということで Mercurialを使って社内用のリポジトリを作ったのでその紹介です。

なぜMercurial?

標準ツール(全員が使えるようになるツール)として何を採用するか悩んだのですが、 git/bazaar/Mercurialの中からMercurialに決めました。今のところ。

最大の理由は MercurialがPythonだから です。

弊社ではCentOSなサーバを非常に大量に扱ってますが、 そのほぼ全てがお客さまのサーバなので 管理用に導入できるプロダクトは非常に限られているケースが多く、 インストールの敷居が一番低い(=現行環境に対する影響が一番小さい)のが Python + Mercurialなのです。

従って消去法でMercurialと相成りました。 MercurialいいよMercurial。

会社リポジトリ?

正直に言うと、社内github的なものが欲しかったんですよ。

あんな感じでエンジニアがそれぞれプロジェクトを立てられて、 自由に開発もシェアもできる基盤が欲しかったのです。

  • エンジニアがそれぞれ自由にプロジェクトを立てられる
  • シェアできる
  • 本番サーバからも使える
  • 社内管理できる (うっかりパスワードとか書いたままコミットしちゃっても被害が即甚大にならないように)
  • Mercuriaが使える
  • お高くない

github enterpriseとかgitlabが選択肢になってくるわけですが、 なんせ最後の2つを満たせず不採用と相成りました。

そこでhgweb.cgi

とにかくリポジトリ閲覧ができるようにしよう、ということで、 マルチプロジェクトのhgweb.cgiを利用することにしました。 (本当はtracをカスタマイズしたほうがいいんだろうけど、 ユーザ管理とかいろいろ含めて考えたらめんどくさくなってやめました)

pipで入れたらhgweb.cgiが入っていなかったりといろいろアレだったので、 ここからコピペで貼るといいと思います。

ちなみに参考URLはこちら →http://mercurial.selenic.com/wiki/PublishingRepositories

環境と仕様

  • 環境はCentOS 6 + apache 2.2.15 + python 2.6 + mercurial 1.7.5(pip)
  • 閲覧はHTTP(S)
  • push/pullはSSH(共有アカウント)
  • 公開URLはhttp://example.com/repos/
  • サーバ上のファイルパスは/opt/repo/配下にいろいろ
    • /opt/repo/bin/配下に設定ファイルなど
    • /opt/repo/repo/配下にリポジトリ(群)
    • →ここにディレクトリを作成してhg initすると自動的にweb側にも追加される!

リポジトリ利用上は単にSSHでアクセスするだけです。

clone

hg clone ssh://sharedusername@example.com//opt/repo/repo/<REPOSITORYNAME>

push

hg push

URIを指定してpush

hg push ssh://sharedusername@example.com//opt/repo/repo/<REPOSITORYNAME>

SSH秘密鍵を指定してpush

hg push -e "ssh -i /path/othersidrsa" ssh://sharedusername@example.com//opt/repo/repo/<REPOSITORYNAME>  

ちなみにURI部分はexample.com/〜(/が1つ)とexample.com//〜(/が2つ)で意味が違うのでご注意ください。

必要なファイルを配置

hgweb.cgiとhgweb.configの2ファイルを作成します。

/opt/repo/bin/hgweb.cgi

#!/usr/bin/env python
#
# An example hgweb CGI script, edit as necessary
# See also http://mercurial.selenic.com/wiki/PublishingRepositories
import os
os.environ["HGENCODING"] = "UTF-8"

# Path to repo or hgweb config to serve (see 'hg help hgweb')
config = "/opt/repo/bin/hgweb.config"

# Uncomment and adjust if Mercurial is not installed system-wide
# (consult "installed modules" path from 'hg debuginstall'):
#import sys; sys.path.insert(0, "/path/to/python/lib")

# Uncomment to send python tracebacks to the browser if an error occurs:
#import cgitb; cgitb.enable()

from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
application = hgweb(config)
wsgicgi.launch(application)

/opt/repo/bin/hgweb.config

[paths]
/ = /opt/repo/repo/*

[web]
descend = True
baseurl = /repos

apache設定

普通にcgiの設定をします。

サンプルだしあんまり厳密に設定していないので、適当にいじってくださいね。

ScriptAlias /repos /opt/repo/bin/hgweb.cgi
<Directory /opt/repo>
    Options +ExecCGI
</Directory>
<Location /repos>
    # Taken from http://www.pmwiki.org/wiki/Cookbook/CleanUrls#samedir
    # Used at http://ggap.sf.net/hg/
    RewriteEngine On
    #write base depending on where the base url lives
    RewriteBase /repos
    RewriteRule ^$ hgweb.cgi  [L]
    # Send requests for files that exist to those files.
    RewriteCond %{REQUEST_FILENAME} !-f
    # Send requests for directories that exist to those directories.
    RewriteCond %{REQUEST_FILENAME} !-d
    # Send requests to hgweb.cgi, appending the rest of url.
    RewriteRule (.*) hgweb.cgi/$1  [QSA,L]
</Location>

そしてapacheをrestartすれば完了です。

うまくいかない場合はapacheのエラーログでも見て対処しましょう。

ね?簡単でしょ?

株式会社ハートビーツのインフラエンジニアから、ちょっとした情報をお届けします。