Infra & Dev tools/Git

Gitlab + docker 설치 & SVN to Gitlab Migration

감동이중요해 2019. 11. 25. 15:45

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 설치

참조 : GitLab Install Guide(Docker)

  1. 요구사양

    • Recommend at least 4GB of free RAM
  2. Git/Docker 설치

  3. Gitlab-CE Image 다운로드

    • docker pull gitlab/gitlab-ce
  4. 이미지 실행

    • 참조 : 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

  1. 컨테이너로 접속하여 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 설정 사용)
  2. 재기동

    • docker restart gitlab
  3. 메일 발송 테스트

    • docker exec -it gitlab gitlab-rails console
    • 실행되면 Gitlab 전용 쉘로 변경되며, 명령어 입력기의 모양이 > 로 변한다.
    • Notify.test_email('{MAIL_ADDRESS}', '{SUBJECT}', '{BODY}').deliver_now
      • 명령어를 입력하면 확인 메일이 전송된다.
  4. docker-compose 설치

    • 옵션을 효율적으로 관리하기 위해 docker-compose을 연동했다.
    • docker-compose를 사용하는 경우 1항의 Config 파일을 따로 수정할 필요가 없다. docker-compose.yml 파일로 설정 정보 컨트롤이 가능하기 때문이다.
    • 참조 : Docker-compose install Guide
    • 설치 후 gitlab container를 정지시키고 삭제한다.
      • docker stop gitlab
      • docker rm gitlab
  5. docker-compose 설정

    • 참조 : Docker-compose config

    • 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 이관

  1. git-svn 설치

    • yum install git-svn.x86_64 (CentOS 7)
  2. 설치할 디렉토리 생성

    • mkdir /srv/from-svn
    • cd /srv/from-svn
  3. 작업자 정보 이관을 위한 매핑 파일 생성

    • 매핑 파일을 생성하지 않으면 이관 중 에러가 발생한다.
    • vi users.txt
      • {svn_id} = {git_id} <{git_mail_address}>
  4. 이관 시작

    • 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 연동 메타데이터를 생성하지 않음)

이관 예시

  1. 소스를 저장할 디렉토리로 이동

    • cd /srv/from-svn/server
  2. 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)

  3. gitlab web에 접속하여 프로젝트 생성

  4. Migration 받아 온 디렉토리로 이동

    • cd /srv/from-svn/server/abc
  5. gitlab에 생성한 프로젝트로 push

    1. git remote add gitlab {git_repository_url}
    2. git push --set-upstream gitlab master
    3. 사용자명/비밀번호 입력하면 완료
      • 최초 push는 root로
  6. Troubleshoting

    1. Author: {퇴사자} not defined in /srv/users.txt file

      • Author({퇴사자})를 찾을 수 없는 에러
      • aaa는 퇴사자였다. users.txt에 퇴사자를 매핑시킨다. 대체자는 누구라도 상관 없지만 Gitlab 계정이 있는 사용자여야 한다.
      • {퇴사자_id} = {대체자_id} <{대체자_email}>
    2. Use of uninitialized value in substitution (s///)

      • 해당 프로젝트 아래의 .git을 삭제하고 다시 시도한다.