GitLab 설치 및 SVN 환경을 Gitlab으로 전환
GitLab 선택 이유
GitLab은 GPL 기반 오픈소스로, MIT 라이선스 하에서 배포되는 완전 자유 오픈소스 소프트웨어이다.
Gitlab을 선택한 가장 큰 이유는 설치형으로 사용할 경우 Private project를 무료로 사용할 수 있다.
정확히는 CE 버전이 무료이며, Core 기능을 모두 제공하고 있어 타 솔루션 / EE 버전에 비해 기능이 부족할 일이 없다고 생각했다.
GitLab 설치
작업 환경이 Windows이고 사내는 AD 계정을 사용하기 때문에 Windows에 설치하려고 했으나 Gitlab은 리눅스 서버에만 설치할 수 있다.
물론 docker라는 훌륭한 우회 방법이 있긴 하지만, 간혹 알 수 없는 에러가 발생하기 때문에 공식적으로 권장되지는 않는다.
실제로 설치를 하고 구동했을 때 이미지 실행 과정에서 권한 부여 중 에러가 계속 발생하여 Windows docker 설치를 포기했다.
결국 VM으로 Ubuntu를 구축하고 그 위에 Docker image를 올려서 테스트를 진행했다.
Docker Image로 Gitlab 설치
-
요구사양
- Recommend at least 4GB of free RAM
-
Git/Docker 설치
- 참조 : Docker Install
-
Gitlab-CE Image 다운로드
docker pull gitlab/gitlab-ce
-
이미지 실행
-
참조 : Run gitlab image
-
노출 host port는 80(http), 443(https), 8080(used by Unicorn), 22(ssh)이 있다.
-
http port가 80인 경우 포트 번호를 입력하지 않고 접속이 가능하다.
- ip가 a.b.c.d, port 8080인 경우 a.b.c.d:8080으로 접속해야 하지만 80포트를 쓰면 a.b.c.d로 접속된다.
-
https는 필요하지 않다고 판단하여 443 포트는 제외하였다.
-
docker logs -f {CONTAINER_NAME}
docker run --detach \\ -hostname gitlab.min.com \\ --publish 80:80 --publish 2222:22 --publish 443:443 \\ -name gitlab \\ -restart always \\ -volume /srv/gitlab/config:/etc/gitlab \\ -volume /srv/gitlab/logs:/var/log/gitlab \\ -volume /srv/gitlab/data:/var/opt/gitlab \\ gitlab/gitlab-ce:latest
-
Gitlab Configuration
-
컨테이너로 접속하여 Config 파일을 수정
docker exec -it gitlab /bin/bash
(Shell이 사용자@gitlab으로 변경됨)vi /etc/gitlab/gitlab.rb
external_url = gitlab.min.com
- hostname으로 설정하였던 그대로 입력
gitlab_rails['gitlab_shell_ssh_port'] = 2222
- publish 22와 대응되는 포트 입력
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = {smtp_address}
gitlab_rails['smtp_port'] = 25
(사내 메일 포트 사용)gitlab_rails['smtp_tls'] = false
(사내 TLS 설정 사용)
-
재기동
docker restart gitlab
-
메일 발송 테스트
docker exec -it gitlab gitlab-rails console
- 실행되면 Gitlab 전용 쉘로 변경되며, 명령어 입력기의 모양이 > 로 변한다.
Notify.test_email('{MAIL_ADDRESS}', '{SUBJECT}', '{BODY}').deliver_now
- 명령어를 입력하면 확인 메일이 전송된다.
-
docker-compose 설치
- 옵션을 효율적으로 관리하기 위해 docker-compose을 연동했다.
- docker-compose를 사용하는 경우 1항의 Config 파일을 따로 수정할 필요가 없다. docker-compose.yml 파일로 설정 정보 컨트롤이 가능하기 때문이다.
- 참조 : Docker-compose install Guide
- 설치 후 gitlab container를 정지시키고 삭제한다.
docker stop gitlab
docker rm gitlab
-
docker-compose 설정
-
vi /srv/gitlab/docker-compose.yml
web: image: 'gitlab/gitlab-ce:latest' container_name: gitlab restart: always hostname: 'gitlab.min.com' environment: GITLAB_OMNIBUS_CONFIG: | external_url 'https://gitlab.min.com:9080' gitlab_rails['gitlab_shell_ssh_port'] = 2222 gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = 'mail.test.com' gitlab_rails['smtp_port'] = 25 gitlab_rails['smtp_tls'] = false ports: - '80:80' - '443:443' - '2222:22' volumes: - '/srv/gitlab/config:/etc/gitlab' - '/srv/gitlab/logs:/var/log/gitlab' - '/srv/gitlab/data:/var/opt/gitlab'
-
/srv/gitlab
위치에서docker-compose up -d
로 gitlab 서비스 시작
SVN to Git 이관
-
git-svn 설치
yum install git-svn.x86_64
(CentOS 7)
-
설치할 디렉토리 생성
mkdir /srv/from-svn
cd /srv/from-svn
-
작업자 정보 이관을 위한 매핑 파일 생성
- 매핑 파일을 생성하지 않으면 이관 중 에러가 발생한다.
vi users.txt
{svn_id} = {git_id} <{git_mail_address}>
-
이관 시작
-
git svn clone {SVN_REPOSITORY_URL} {OPTIONS}
-
Options 정보
-T <trunk_subdir> --trunk = <trunk_subdir> -t <tags_subdir> --tags = <tags_subdir> -b <branches_subdir> --branches = <branches_subdir> --stdlayout (svn repository가 trunk, tag, branches를 모두 포함하면 -T, -t, -b 대신 이것을 사용) --no-metadata (git-svn 연동 메타데이터를 생성하지 않음)
-
이관 예시
-
소스를 저장할 디렉토리로 이동
cd /srv/from-svn/server
-
git svn clone {svn_repository} --no-metadata -A /srv/users.txt -T trunk ./abc
-
{svn_repository}의 프로젝트는 trunk만 존재한다.
- T로 trunk의 dir name만 명시하였다.
-
./abc는 설치할 위치 (/srv/from-svn/server/abc)
-
-
gitlab web에 접속하여 프로젝트 생성
-
Migration 받아 온 디렉토리로 이동
cd /srv/from-svn/server/abc
-
gitlab에 생성한 프로젝트로 push
git remote add gitlab {git_repository_url}
git push --set-upstream gitlab master
- 사용자명/비밀번호 입력하면 완료
- 최초 push는 root로
-
Troubleshoting
-
Author: {퇴사자} not defined in /srv/users.txt file
- Author({퇴사자})를 찾을 수 없는 에러
- aaa는 퇴사자였다. users.txt에 퇴사자를 매핑시킨다. 대체자는 누구라도 상관 없지만 Gitlab 계정이 있는 사용자여야 한다.
{퇴사자_id} = {대체자_id} <{대체자_email}>
-
Use of uninitialized value in substitution (s///)
- 해당 프로젝트 아래의 .git을 삭제하고 다시 시도한다.
-
'Infra & Dev tools > Git' 카테고리의 다른 글
git 공부하기 좋은 웹사이트 (0) | 2021.02.05 |
---|