본문 바로가기

VersionControl

[git] 미러링하기 mirroring with cron, crontab, expect

간혹 프로젝트를 진행하다보면 미러링이 필요할 경우가 있습니다.

 

예를들면 협력사에서 협업을위해 특정 IP에 대해 자신들의 git 서버를 열어주는 경우입니다.

 

물론 울회사에서 한명만 협업을 한다면 상관없겠지만(?) 여러명이 협업을 하는거라면 하나의 IP로만 접근이 되기 때문에 난감합니다.

 

이럴경우 미러링을 통해서 문제를 해결 할 수 있습니다.

 

열어준 하나의 아이피에 미러 서버를 만들어 놓고 여러 직원들은 그 미러 서버에 클론해서 작업을 진행하면 됩니다. 하 하 하

 

미러 서버를 만드는 방법은 매우 간단합니다.

 

구축 명령어 구조

$ git clone --mirror {id}@{ip}:{path}

 

사용예

$ git clone --mirror testid@255.255.255.255:/home/git/testpath.git

 

걍 클론에 --mirror 옵션만 붙여주면 된다.

물론 --bare 옵션도 된다 (그대로 가져와서 단독 서버 운영 할 경우)

 

주의 할 점은 작업 전에 미러서버에서 최신으로 업데이트를 해줘야 합니다. 미러 서버니 실제 서버와 싱크를 계속 해줘야 하는거죠.

미러 서버에서 아래의 명령어로 최신 업데이트가 가능합니다.

 

미러 서버 업데이트

$ git remote update

 

걍 각 클라이언트에서  git pull 하면 자동으로 업데이트 하고 클론되면 좋을텐데...

걍 수동으로 때려주려면(?) 여기까지면 되구요.

자동으로 처리하고 싶은면 더 보셔야 하는데 실력이 허접해서 내용 쓸데없이 좀 많네요... -.-;

 

미러서버의 hook 디렉토리에서 작업을 하면 가능하다던데 아직 안해봤... 할 줄 몰라...

일단은 수동으로 위의 명령어를 때려 주던지... (귀찮...)

스크립트로 주기적으로 돌게... (비효율적)

결론은 훅인디 잘 몰랑...

 

제 계획은 hook을 걸어놔서 미러링 서버에서 당겨 쓰는 workspace에서 git pull 할 때 우선 업데이트를 실행하도록 처리하는 작전(?)이였습니다.

그런데 hook에서 pre-pull을 지원하지 않더군요.

그래서 걍 리눅스에서 지원하는 작업스케쥴러인 crontab을 사용하기로 했습니다. 하 하 하

 

우선 crontab에 등록 할 쉘 스크립트를 작성합니다.

스크립트 위치는 미러에 해놔야 걍 git remote update를 명령어로 쓸 수 있겠죠?

 

git remote update를 실행하는 스크립트를 만들어야 되는데 문제는...

요게 실행 시 암호를 필요로 한다는게...

암호 입력을 처리하기위해 bash 대신 expect 를 사용합니다.

암호가 0000이라면 아래와 같은 형태로 만들면 됩니다.

 

[git_sync.sh] - 생성 후 chmod 755로 실행 가능하게 변경하시구요. 

#!/usr/bin/expect

spawn git remote update #입력 처리 할 프로그램

expect "password:" #입력 타이밍을 확인 할 문구
send "0000\r" #입력내용

interact 

 

위의 스크립트를 그냥 등록하면 경로문제로 작동이 제대로 되지 않습니다.

위의 스크립트에서 경로 처리를 할 수 있다면 하시면 되구요. (제가 expect의 문법을 잘 몰라서 흑흑)

걍 스크립트를 하나 더 맹글어서 사용하겠습니당... ㅠㅜ

 

[git_sync_for_cron.sh] - 생성 후 chmod 755로 실행 가능하게 변경하시구요. 

#!/bin/bash
pushd /home/git/testpath.git/ #미러 위치로 이동
./git_sync.sh #앞에서 만든 스크립트 수행
popd

 

더 좋은 방법이 많은거 같은디... 여튼 진행합니다.

자 이제 crontab에 등록해 버립시당...

$ crontab -e

 

입력하면 편집 화면이 나타납니다.

10분 마다 업데이트 하려면 맨 아래에 아래와 같이 등록하면 됩니다.

# 분 시 일 월 요일 실행명령어 

*/10 * * * * /home/git/testpath.git/git_sync_for_cron.sh

 

저장하면 끝!

 

일반적으로(?) cron은 작동하고 있으나 의심된다면 아래의 명령으러 쳐서 목록에 있는지 확인하자

 

$ service --status-all | grep cron

 

실행 중이 아니라면 아래의 명령어로 실행~

 

$ sudo service cron start

 

헉헉헉 이제 됐습니다. 10분 마다 원본 서버와 동일한 상태로 소스를 업데이트합니다.

생각해보니 push를 하면서 작업을 하는 용도라면 위험할지도(?) 여튼 이런식으로 미러가 실서버와 싱크되게 할 수 있습니다. (좀 난잡합니다...)

참고하세요~