Repo mirroring

한국과 미국 처럼 거리상으로 멀리 떨어져 있는 경우, 한쪽에서 source를 sync하기 위해서는 시간이 너무 많이 걸린다. Mirror를 설정하고 주기적으로 source를 sync 해 오도록 하면 시간과 load를 줄일 수 있다. 다음은 Ubuntu 10.04 LTS 기준으로한 repo mirror server 설정방법에 대해 설명한다.

1. Git daemon 설정
: xinetd를 설치하고 git-daemon을 설정한다.

$> sudo apt-get install xinetd
$>sudo vi /etc/xinetd.d/git-daemon

service git
{
        disable = no
        type            = UNLISTED
        port            = 9418
        socket_type     = stream
        wait            = no
        user            = nobody
        server          = /usr/bin/git
        server_args     = daemon --inetd --export-all --base-path=/public/gitmirrors/
        log_on_failure  += USERID
}
$> sudo /etc/init.d/xinetd restart
혹은
$> sudo service xinetd restart

 

2. Mirror repository 만들기
: 외부에서 접근할 공간을 생성하고 mirror를 만든다.

$>sudo mkdir -p /public/gitmirrors/
$>chmod 777 /public/gitmirrors/
$>mkdir /public/gitmirrors/PROJECT_TOP_DIR
$>cd  /public/gitmirrors/PROJECT_TOP_DIR
$>repo init -u ssh://USER_ID@SERVER_ADDRESS_AND_PORT/platform/manifest.git -b <BRANCH_NAME> --mirror
$>repo sync

 

3. Fetching address 변경
: manifest.git을 변경시켜서 새로운 branch로 server에 push 한다.

먼저 manifest.git을 cloning 해오자

$> mkdir ~/temp/manifest
$> cd ~/temp/manifest
$> git clone /public/gitmirrors/PROJECT_TOP_DIR/platform/manifest.git

default.xml의 fetch address를 변경해서 mirror에서 받아오도록 수정한다.

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote name=REMOTE_NAME fetch="git://MIRROR_SERVER_ADDR/PROJECT_TOP_DIR" review=REVIEW_SITE_ADDR />

...

수정된 default.xml을 새로운 branch에 push 한다.

$>git checkout -b  MIRROR_BRANCH_NAME
$>git add .
$>git commit -m "Updated fetch URL to mirror"
$>git push origin MIRROR_BRANCH_NAME

 

4. Client에서 mirror로 부터 source sync 하기

repo init할때 mirror branch를 명시한다.

$> repo init -u git://MIRROR_SERVER_ADDR/PROJECT_TOP_DIR/platform/manifest.git -b MIRROR_BRANCH_NAME
$> repo sync

 

5. 주기적인 sync를 위한 crontab과 sync script 작성

$> crontab -e
# m h  dom mon dow   command

# 매시 00분 마다 repo sync를 수행
0 * * * * ~/bin/cron_repo_sync.sh

repo sync script
: 호출될 때마다 mirror directory에 있는 내용들을 본국에서 송환해 온다.

#!/bin/bash
# cron repo sync script.
# Syncs all mirrors under the PUBLIC_REPO_DIRS_ROOT. - skywriter

PUBLIC_REPO_DIRS_ROOT="/public/gitmirrors/"
REPO_PATH="/usr/local/bin/repo"

sync_cmd="$REPO_PATH sync -j20"
repodirs=`ls ${PUBLIC_REPO_DIRS_ROOT}`

echo "start syncing"
for repodir in $repodirs
do
  echo "syncing [$repodir] at `date`"
  cd ${PUBLIC_REPO_DIRS_ROOT}$repodir/
  $sync_cmd 2>&1
done
echo "done at `date`"