1.         Gitosis를 이용하여 Git 서버 운용하기

Git은 분산 버전 관리 시스템이기도 하지만, 파일시스템을 기반으로 사용하고 있으면서, 내용을 버전으로 관리하면, 효과적인 애플리케이션을 구축하기 위한 플랫폼이기도 하다.

Gitosis는 원격 Git 서버와 서버의 저장소를 관리하기 위한 도구이며,
저장소에 Gitosis의 구성을 저장하여 이런 관리 작업을 처리한다
.
서버의 구성을 변경하려고 한다면, 새로운 구성을 Gitosis 저장소에 푸싱하기만 하면 된다.

 

Gitosis .git/hooks/ 디렉터리에 있는 후킹(hooking) 스크립트를 이용해서 이런 작업들을 처리한다.
후킹 스크립트는 커밋 전(pre-commit 스크립트)이나 커밋 후(post-commit 스크립트)와 같은 이벤트에 따라 실행된다.

또한, Gitosis는 후킹 스크립트를 통해 생성한 저장소에 대한 구성 파일도 갱신하는데,
빈 저장소를 만들고, 사용자에게 저장소 읽기, 쓰기 권한을 설정하는 등의 작업을 할 수 있다.

Gitosis 설치 단계는 다음과 같다.

(1)    의존성을 만족하는지 확인하기

(2)    Gitosis 설치하기

(3)    Gitosis를 위한 서버구성

(4)    관리자 인증서(credential) 생성하기

(5)    Gitosis 초기화하기

(6)    Gitosis 구성하기

 

 

 

1.1.        의존성을 만족하는지 확인하기

Gitosis는 몇 가지 의존성을 가진다.
먼저, Gitosis가 파이선으로 작성되었기 때문에 시스템에 파이선이 설치되있어야 한다.

그 다음은 Python Enterprise Application Kit, PEAK에서 EasyInstall 패키지가 필요하다.
EasyInstall
은 개발자들이 파이선 기반 애플리케이션을 설치하고 관련 의존성을 해결하도록 돕는다. EasyInstall도 잘 알려진 패키지이니 먼저 시스템에 설치되어 있는지 다음 명령어를 실행해서 확인해보자.

$ python c import setuptools

EasyInstall setuptools 모듈이 이용 가능하다면 아무런 출력도 보여주지 않는다.

 

 

 

1.2.        Gitosis 설치하기

Gitosis는 지금도 활발히 개발 중에 있으므로 소스 코드로부터 직접 설치해야 한다.

다음 명령어로 Git 저장소를 복제하여 Gitosis의 소스 코드를 바로 받을 수 있다.

$ git clone git://eagain.net/gitosis

이제 gitosis 디렉토리에 Gitosis의 소스 코드가 있다.
Gitosis
를 설치하려면 다음과 같이 gitosis 디렉터리로 이동해서 setup.py를 실행한다.

$ cd gitosis

$ sudo python setup.py install

 

Gitosis를 설치했으니 Gitosis가 이용할 서버의 사용자 계정을 설정해야 한다.
Gitosis
를 위한 사용자 계정을 설정하려면 사용자에 대한 인증서가 필요하다.

 

 

 

1.3.        관리자 인증서 생성하기

SSH에서 사용자의 연결을 검증할 때 비밀번호 대신 SSH 공개키를 사용하므로, Gitosis 관리자에 대한 SSH 공개키를 반드시 생성해야 한다.

사용하던 공개키가 있다면 새로 생성하는 대신 기존의 키를 이용해도 된다. 가지고 있는 공개키가 없다면 새로 생성하자. 공개키는 커맨드 라인에서 ssh-keygen 명령어를 실행해서 생성한다.

ssh-keygen 명령어는 Gitosis가 동작하는 서버에 접속할 때 사용하는 자신의 컴퓨터에서 실행해야 한다. 커맨드 라인에서 다음 명령어를 실행해서 자신의 키를 생성한다.

$ ssh-keygen t rsa

 

ssh-keygen 프로그램은 사용자의 키를 생성하고, 새로 생성된 키에 대한 정보를 알려준다.
생성 위치와 이름을 기본값으로 그냥 뒀다면 다음 경로에 공개키가 생성된다.

/home/<사용자명>/.ssh/id_rsa.pub

이 파일을 서버에 복사한다. 이 파일은 이어지는 내용에서 Gitosis를 초기화할 때 바로 사용한다.

 

 

 

1.4.        Gitosis를 위한 서버 구성하기

Gitosis가 사용자의 서버에서 동작하려면 서버에 Gitosis 전용 사용자 계정이 있어야 하고, 모든 저장소를 저장할 디렉터리도 필요하다.

시스템에 Gitosis를 위한 새로운 사용자가 있어야 한다.
Gitosis
용 사용자 계정의 홈 디렉터리에 Gitosis 관련 구성값과 저장소를 보관한다
.
대부분의 리눅스 시스템에서는
home /path/to/home 형식을 추가하면 홈 디렉터리를 지정할 수 있다.

사용자 홈 경로는 시스템의 어디를 지정해도 상관없지만, Gitosis의 규약은 /srv/example.com/git로 설정하는 것이다. 여기서 example.com을 자신의 도메인으로 바꾸기만 하면 된다.

 

사용자명을 git으로 설정한 예.

$ sudo adduser --shell /bin/sh \

               --group \

               -- disabled-password \

               --home /srv/example.com/git

               git

 

 

 

1.5.        Gitosis 초기화하기

Gitosis에는 초기화 과정을 수행하는 gitosis-init이라는 프로그램이 있다.

gitosis-init을 실행할 때 지정해야 할 옵션은 없지만, 이전 절에서 생성한 사용자 계정으로 실행해야 한다.

$ sudo H u git gitosis-init < /path/to_id_ras.pub

 

프로그램이 실행되면 Gitosis와 저장소가 초기화된다.
오래된 setuptools를 이용하고 있다면, 실행 권한이 빠질 수 있다고 한다. 그런 경우 다음 명령어를 실행해서 실행 권한을 추가하도록 권고하고 있다.

$ sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

 

$PATH 변수에 존재하지 않는 위치에 Git을 설치했다면, OSError 오류를 겪게 된다. OSError 오류는 gitosis-init 명령어에서 Git을 찾을 수 없을 때 발생한다.

이 문제를 해결하려면 git 사용자가 Git의 명령어들을 이용할 수 있도록 해야 한다.
Gitosis
가 동작하는 사용자의 $PATH 변수를 수정하거나, Gitosis의 사용자 $PATH 변수에 포함된 아무 경로에서나 git 바이너리의 심볼릭 링크를 추가하면 된다.

 

 

 

1.6.        Gitosis 구성하기

Gitosis의 구성 저장소를 복제해야 한다.

구성 저장소는 새로운 저장소를 관리하는 데 필요한 모든 구성값을 가지고 있다. 구성 저장소는 SSH 공개키를 생성한 컴퓨터에서 복제해야 한다.

$ git clone git@example.com:gitosis-admin.git

 

새로 복제한 디렉터리에는 gitosis.conf 파일과 keydir/ 디렉터리가 있다.
gitosis.conf
는 단순한 INI 형식의 파일이다
.
대괄호로 각 영역을 나타내며 각 항목은
이름=의 형식이다
.
파일을 열어보면 다음과 유사한 기본 구성을 볼 수 있다.

[gitosis]

 

[group gitosis-admin]

writable = gitosis-admin

members = travis

 

[group gitosis-admin]이후
첫째 줄에서 이 그룹이 gitosis-admin 저장소에 쓰기 권한을 가진다고 지정한다.

둘째 줄에서는 열거한 사용자들이 이 그룹에 포함된다고 지정한다. 여기서는 travis 한 명만 포함시켰다.

members 필드의 값은 공백으로 구분한다.
이때, members 필드에 기록된 각 사용자의 이름은 keydir/ 디렉터리에 있는 동명의 .pub 확장자를 가진 파일을 참조한다. 예를 들면, 필자의 키는 keydir/travis.pub에 있다.

 

새로운 사용자를 추가하려면, 추가하려는 사용자의 공개 SSH키가 필요하다.
저장소에 접근하려는 모든 개발자는 자신의 컴퓨터에서 SSH 공개키를 생성해야 한다
.
공개키의 생성은 앞에서 이용한 명령어를 그대로 이용하면 되지만, 반드시 접근하려는 개발자의 컴퓨터에서 생성해야 한다. 생성된 공개키는 특정 컴퓨터에 종속적이기 때문이다.

각 개발자의 공개키 복사본을 전달 받으면 공개키에 사용자명을 붙여서 keydir/ 디렉터리에 복사하고, 접근을 허용할 저장소에 파일명에서 이용한 사용자명을 추가한다. 방금 변경한 내용은 지역 저장소에 커밋한 후 git push 명령어를 이용해서 Gitosis 서버에 푸싱해야 한다.

 

 

 

1.7.        새로운 저장소 추가하기

Gitosis가 생성하는 초기 구성에는 하나의 구성 저장소가 있다. 하지만 원하는 만큼의 저장소를 관리할 수 있다. 필요하다면 새로운 writable 영역에 gitosis-admin 그룹에 추가할 수 있다. 하지만 이렇게 하면 저장소에 접근 가능한 모든 사람이 Gitosis 구성을 변경할 수 있다. 보다 안전하게 관리하려면 관리를 위한 그룹과 개발자를 위한 그룹으로 2개의 그룹을 만든다.

[gitosis]

 

[group gitosis-admin]

writable = gitosis-admin

members = travis

[group team]

writable = mysite

members = travis Susannah

 

첫 번째 [group]은 앞에서 작성했던 부분이다.
기존 그룹은 그대로 두고 team이라는 그룹을 새로 추가했다. 추가한 그룹에 포함된 구성원에게는 mysite 저장소에 대한 쓰기 권한을 부여했다. 이렇게 하면 travis susannah가 쓰기 권한을 얻는다.

생성하려는 저장소마다 생성할 저장소 이름을 포함하는 새로운 writable 줄을 추가한다. 다시 한번 변경 사항을 커밋하고 서버에 푸싱한다. 변경사항을 푸싱하고 나면 새로운 원격 저장소에 내용을 추가할 수 있다.

모든 지역 Git 저장소에서는 새로운 원격 저장소로 내용을 보낼 수 있다. 물론 전송하려면 지역 저장소에는 적어도 하나의 커밋이 있어야 한다. 저장소의 작업 트리에서 다음 명령어를 실행하면 원격 저장소를 자신의 구성에 추가할 수 있다.

$ git remove add origin git@example.com:mysite.git

이 명령어는 mysite 원격 저장소를 지역 저장소의 구성에 origin 저장소로 추가한다.

 

자신의 지역 저장소의 내용을 원격 저장소에 푸싱하기

아직 원격 저장소에 존재하지 않는 브랜치이므로 반드시 푸싱 대상 브랜치명을 지정해야 한다.

$ git push origin master

접근 권한을 가진 다른 사용자가 저장소를 복제할 수 있고, 쓰기 권한을 줬다면 변경 사항을 푸싱할 수도 있다.

 

오픈 소스 프로젝트라면 일반 대중이 저장소에 접근할 수 있어야 하며, 지역 가상 사설망(VPN)이라면 자신의 저장소를 회사의 모든 사람에게 열어둬야 한다. 하지만 누가 내용을 읽었는지에 대한 로그를 추적할 필요는 없을지도 모른다.

git daemon을 이용하면 자신의 저장소를 익명의 사용자에게 읽기 전용으로 공개하도록 설정할 수 있다.

 

 

 

1.8.        공개 저장소 설정하기

자신의 저장소를 읽기 전용을 설정하기.

일일이 사용자를 설정하는 게 아니라 자신의 작업을 다른 개발자와 공유하려는 경우에만 읽기 전용으로 설정한다. 읽기 전용 저장소는 누구라도 저장소를 읽을 수 있는 오픈 소스 개발에서 매우 흔한 방식이다.

읽기 전용으로 설정할 때는 2단계를 따른다.
먼저, 자신의 저장소를 Gitosis로 공유할 수 있도록 구성한다
.
다음으로, git daemon을 실행하여 요청에 대해 응답할 수 있도록 한다.

Gitosis를 구성하려면 앞에서 봤던 gitosis.conf를 편집해야 한다.

이번에는 repo라는 영역을 저장소 이름과 함께 추가한다.
예를 들어, 자신의 저장소 이름이 web이라면 다음과 같이 추가하면 된다.

[repo web]

 

이 내용은 새로운 영역을 추가하기 위한 INI 설정이다.
이 부분 이후에 나오는 내용은 모두 이 영역에 포함된 내용임을 표시한다
.
이제 daemon = yes라는 줄을 추가해서 git daemon이 이 저장소를 읽을 수 있다고 표시한다. 지금까지 추가한 내용은 다음과 같다.

[repo web]

daemon = yes

 

이것으로 구성 단계는 모두 마치고, 변경 사항을 커밋하고 서버에 푸싱하자.
이제 git daemon을 설정할 차례다.

 

앞에서 생성한 git 사용자로 git daemon을 실행해야 한다.
명령어 앞에 sudo
u git을 붙여서 실행하는 게 가장 간단한 방식이다.

그 외에 git daemon에 지정해야 하는 매개변수로는 --base-path가 있다.
--base-path
로 저장소의 위치를 지정한다
.
지금까지 사용해온 구성을 따르면 저장소는 /srv/example.com/repositories에 있다.

git daemon을 실행하는 실제 명령어는 다음과 같다.

$ sudo u git git daemon \

       --base-path /srv/example.com/repositories/

 

제대로 동작하는지 확인해보려면 자신의 읽기 전용 저장소 중에 하나를 복제해 본다. web 저장소를 복제할 경우 명령어는 다음과 같다.

$ git clone git://example.com/web.git

 

여기서 실행한 git daemon 명령어는 사용자가 로그인한 동안만 동작한다. 그리고 서버가 부팅할 때마다 실행되지도 않는다. 운영체제에 따라서 이런 문제는 약간씩 다르게 다룰 수 있다.

필자는 서버에서 로그아웃한 후에도 git daemon을 동작하도록 하려고 nohup을 이용한다. 그렇다고 서버를 재부팅한 다음에도 자동으로 실행될 필요는 없었다. 이용한 명령어는 다음과 같다.

$ nohup sudo u git git daemon --base-path /srv/example.com/repositories &

명령어의 마지막 &, 실행되는 명령어를 현재 터미널 세션에서 분리하며,
명령어의 시작에 있는 nohup은 현재 사용자에 종속되지 않도록 한다.

 

출처 : http://youmin3.egloos.com/1990886

+ Recent posts