7. Gitlab

7. Gitlab
  • 공식 사이트 – https://about.gitlab.com/
  • Omnibus Package – https://docs.gitlab.com/omnibus/README.html
  • Docker image – https://docs.gitlab.com/omnibus/docker/

Gitlab은 기본적으로 git server입니다. 거기에 CI/CD를 포함하고 있고, 간단한 Wiki와 issue tracker도 갖추고 있습니다. gitlab.com 이 호스팅 서비스를 하고 있고 무제한 private repository를 제공하기 때문에 매우 좋은 선택이 될 수 있습니다. 그러나 다음과 같은 경우에는 사내에 설치하는 것도 나쁘지 않습니다.

  • 데이터를 사내에 유지하고 싶다
  • 다른 협업시스템과 계정을 공유하고 싶다.
  • gitlab.com이 좀 느린것 같다

저희가 설치할 gitlab은 Omnibus Docker image로서 이미지 안에 nginx, postgres, unicorn, ruby와 같은 gitlab을 수행하는데 필요한 모든 패키지가 이미 설치되어 있어서 매우 편리합니다. 리눅스 서버 상에서 적당한 디렉토리를 만듭니다. 저의 경우는 ~/docker/gitlab 이라고 만들었습니다. 거기서 다음 명령을 수행 합니다.

sudo docker run  --detach \
     --publish 8001:80 \
     --publish 8002:443 \
     --publish 8003:22 \
     --name gitlab \
     --restart always \
     --volume /home/anakin/docker/gitlab/config:/etc/gitlab \
     --volume /home/anakin/docker/gitlab/logs:/var/log/gitlab \
     --volume /home/anakin/docker/gitlab/data:/var/opt/gitlab \
     gitlab/gitlab-ee:latest

gitlab은 CE버전과 EE버전이 있는데 EE버전을 설치해도 CE기능까지만 동작 합니다. 그럼에도 EE버전을 설치한것은 혹시나 회사 사정이 나아져서 라이센스를 구매하면 EE기능을 바로 사용할 수 있기 때문에 작은 희망으로 설치해 봅니다. ^_^ CE는 https://about.gitlab.com/pricing/self-managed/feature-comparison/ 에서 Core 기능 까지만 가능합니다.

실행하고 나면 실제로 웹 페이지가 뜨기 까지 상당시간(수분~)이 소요 됩니다. docker logs -f gitlab 으로 로그를 보면서 이상없이 수행 되는지 확인 합니다. 일단 뜨고 나면 브라우저에서 http://purple.example.io:8001 을 입력하여 정상적으로 표시 되는지 확인하고, admin password를 변경 합니다. Xwiki와 마찬가지로 컨테이너에 접속하여 timezone을 바꿔줍니다.

이제 계정정보를 Synology Directory Server에서 가져와야 하므로 설정을 좀 해야 합니다. 설정파일은 ~/docker/gitlab/config/gitlab.rb 입니다. 이 파일을 열어서 다음 항목을 찾아 수정하거나 없으면 만들어 줍니다.

external_url https://git.example.io
gitlab_rails['time_zone'] = 'Asia/Seoul'
gitlab_rails['ldap_enabled'] = true
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.daum.net"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "<다음 ID>"
gitlab_rails['smtp_password'] = "<다음 Password>"
gitlab_rails['smtp_domain'] = "example.io"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = false
gitlab_rails['smtp_tls'] = true
nginx['listen_port'] = 80
nginx['listen_https'] = false
gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
  main: # 'main' is the GitLab 'provider ID' of this LDAP server
    label: 'LDAP'
    host: '192.168.1.34' # NAS 주소
    port: 389
    uid: 'uid'
    bind_dn: 'uid=root,cn=users,dc=ldap,dc=com'
    password: 'Directory Server 설정시 패스워드'
    encryption: 'plain' # "start_tls" or "simple_tls" or "plain"
    verify_certificates: true
    smartcard_auth: false
    active_directory: false
    allow_username_or_email_login: false
    lowercase_usernames: false
    block_auto_created_users: false
    base: 'dc=example,dc=io'
    user_filter: ''
EOS

이제 gitlab을 재실행하고, DSM 으로 와서 XWiki 때와 마찬가지로 https://git.example.io 로 접속 할 수 있도록 제어판-응용 프로그램 포털-역방향 프록시를 생성해 줍니다.

역방향 프록시 설정

이제 https://git.example.io 로 접속하시면 로그인창이 보일것인데 탭이 하나 더 생겨 있습니다. Standard는 gitlab 내부의 사용자 데이터베이스로 인증하는 것이며 LDAP은 Synology Directory Server에서 사용자를 인증하는 것입니다. 어드민으로 로그인 하실때는 Standard를, 일반 사용자로 로그인 하실때는 LDAP 탭을 선택 합니다. 이제 LDAP 탭에서 user 로 로그인 해 봅니다. 로그인이 된다면 성공입니다.

사용자에서 로그아웃 하시고 다시 어드민으로 로그인 하신 다음 상단의 스패너 메뉴(Admin Area)를 클릭 하고 좌측 메뉴에서 맨 하단의 Settings를 선택 합니다. Visibility and access controls 를 expand 합니다. 여기서 default project visibility를 internal 로 바꿉니다. 왜냐하면 public 으로 되어있을 경우 사용자가 프로젝트를 생성했을때 일부러 바꾸지 않은 이상 public이 되고 이것은 로그인 하지 않아도 인터넷에 전부 공개 됩니다. 따라서 실수를 막기 위해 의도적으로 public을 선택 하지 않은 이상 로그인 사용자만 볼 수 있는 internal 로 디폴트를 바꿉니다. 또한 저희는 Restricted visibility levels의 public을 체크하여 아예 public을 생성 할 수 없도록 바꿨습니다. 왜냐하면 public으로 생성 할 거라면, github, gitlab.com 을 사용하면 될것 이기 때문입니다.

Enabled Git Access protocols도 Only HTTP(s)로 바꿔서 SSH 포트를 추가로 열지 않도록 하였습니다. Sign-up restrictions 에서 Sign-up enabled의 체크를 꺼서 임의로 사용자 가입을 받지 않도록 하였습니다. 왜냐하면 모든 사용자는 Directory Server에서 생성 되어야 하기 때문입니다. 나머지 값들에게 대해서도 살펴보시고 입맛에 맞게 수정해 주시면 됩니다.

이제 회사만의 git 서버가 생성 되었습니다. 입맛에 맞게 임의로 그룹과 프로젝트를 생성하면됩니다. group 안에 subgroup이 생성될 수 있기 때문에 얼마든지 계층별 프로젝트를 만들 수 있습니다. 저희는 top level 에 다음과 같은 그룹을 만들었습니다. 하나의 예시 이므로 참고 하셔서 회사만의 독특한 구조를 만드시면 될것 입니다.

  • example.io – 전사 공통. 회사 인프라. 사내 업무관련
  • team – 팀별 그룹. 하위에 sub group으로 각 팀이 있습니다.
  • study – pet project. study project. forked, cloned.
  • project – 회사에서 진행하는 모든 프로덕트 프로젝트가 있으며, 각 프로젝트 별로 sub group이 있습니다.

그리고 각 개인별로 task라는 프로젝트를 반드시 생성 합니다. 그래서 해당 프로젝트의 issue tracker를 통해 개인이 해야 할 일들을 정리합니다. 따라서 이 issue tracker만 보면 누가 무슨 업무를 하고 있는지 알 수 있습니다. 보통의 경우에는 private 프로젝트를 만들어 접근 가능한 사용자를 임의로 추가해 줍니다. 대부분 ‘팀장님’ 이시겠죠 ^^

각 프로젝트에는 좌측 하단에 Settings 메뉴가 있고, 하위 메뉴로 integrations가 있습니다. Project services 에서 External Wiki 를 선택 합니다.

External Wiki

위키의 주소를 입력하고 save 합니다. 에러가 표시되어도 save anyway를 눌러 저장 합니다. 저장하고 나면 프로젝트 좌측 메뉴에 External Wiki 라는 메뉴가 추가 되며, 이를 클릭 하면 우리가 설치한 xwiki로 넘어 갑니다. Directory Server-gitlab-xwiki가 연동 되었습니다!

External Wiki 설정
External Wiki 메뉴

만약 프로젝트에서 external wiki(즉, 우리가 설치한 xwiki)만 사용하고, gitlab 내부 위키를 사용하지 않을 거라면 프로젝트 Settings – Visibility, project features, permissions 에서 wiki 를 꺼줍니다. 그러면 프로젝트 좌측 메뉴에서 wiki 아이템이 사라집니다.

여담

gitlab 의 개인별 profile은 github과 마찬가지로 tiles activity를 보여 줍니다. 얼마나 많이 기여했는지를 한눈에 볼 수 있습니다. 이것을 관리자가 확인 하는 것이 득이 될지 독이 될지는 각자 판단할 문제 인것 같습니다.

이렇게 만들려면 정말 부지런해야…

1 comment

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다