docker + gitlab !!

docker + gitlab !!

버전 관리 story..

소스 버전관리 시스템은 개발자가 두 명 이상 (사실은 한 명이어도) 있는 회사라면 기본적으로 구축해야만 한다고 생각했다. 당연히 Git이 좋겠지만 서비스가 오래되었다면, 노후되고 오래되고 느려터진 SVN이라도 좋으니까. 하지만 이곳저곳 몇 군데의 회사를 다니면서 .. 기본중의 기본이라고 생각했던 소스 버전관리가 되어있지 않는 경우를 두 번이나 목격했다.

그 두 번의 경우를 포함해, 기억에 남는 몇가지의 경우를 적어보겠다.

A사의 경우

내가 처음으로 개발자로 일을 시작했던 회사다. 개발팀이 나름 규모와 전통이 있었고 개발자들도 많았지만, 신규 개발은 거의 외주로 위임하고 상주하는 개발자들은 운영과 외주 관리에 집중하던 분위기였다. 그래서 오래전부터 쓰던 SVN을 Git으로 교체하지 않고 계속해서 사용하고 있었다. 당연히 쾌적하지 않았지만 어쨌든 돌아가긴 했다. 내 사수 L은 이곳으로 이직한지 얼마 안된.. 새로운 피는 아니고 헌혈된 피 정도 였다. 그는 SVN을 Git으로 바꿔야한다고 주장했다. 신입이었던 나는 사수가 그래야한다니까 그런 줄만 알았다. 그런데 사측에선 SVN → Git 이전을 꺼렸다. Git 하면 Github 인데, 회사규모로 Git을 사용하려면 이용료가 든다는 것이다. 사수는 혼자 어디를 돌아다니더니, 사내 서버에 Gogs라는 설치형 오픈소스 Git 서비스를 마련해왔다.

나는 아무것도 몰랐지만, 사수가 유난이라 생각했었다.

B사의 경우

스타트업이었다. 나를 포함한 개발자가 단 3명 뿐이었다. 한 명은 시니어였는데 나름 그 회사의 R&D; 담당이었다. 약간 천재개발자타입? 혼자서 구석에 자리 잡고 앉아 뚝딱뚝딱하며 늘 코딩에 심취해계셨던 기억이 난다. 하지만 그저 코딩 자체에 빠져계실 분 개발환경의 편의성을 닦아놓는 것에는 별로 관심이 없으신 것 같았고, 다른 주니어 개발자는 당장 하루 하루 일을 쳐내기에 바빠 git을 쓸 생각을 못했던 것 같다. (라면서 이해해보려고 애를 써보는 중이다.)

나라도 git을 쓰면 안되겠냐고 물었지만, 아무도 반기지 않는 느낌이었다. 내가 투입됐던 프로젝트에서 협업을 하는 사람은 단 한 명, 퍼블리셔 뿐이었다. 퍼블리셔 입장에서는 git을 써보지 않았던 데다가, 이게 뭐지하고 검색해봤더니 어려운 이론이나 낯선 cli 명령어들만 나오니 거부감이 들어서 그랬던 것 같다. (라고 이해하려고 애를 써보는 중이다.)

문제는 다른 개발자도 내가 git 얘기를 꺼내니까 달가워하지 않았다는 거다. 둘이서 하는데 그게 필요하냐고, 그냥 서버에 파일 올렸다 내렸다 하면서 맞추라고 했다. ftp를 이용해서 서버에 파일을 올리면서 수동 동기화했다. 물론 그러다가 내가 퍼블리셔의 수정본을 날린 적이 있다. 반대로 내 소스도 날아간 적도 있었다. 그것도 여러번.

어쩔 수 없지, 라면서 지금 다시 이해해보려고 애를 써보지만

우겨서라도 버전관리를 쟁취해내지 못한 나의 나약함만은 이해를 할 수 없다.

그리고 깨달았다. 내 사수였던 그사람이 유난이었던게 아니라는 걸.

미안합니다. 사수 L.

C사의 경우

프리랜서로 전향 후 처음으로 일하게 된 회사다. 주력사업은 개발이 아니지만, 어쨌든 개발관련 사업부가 따로 존재한다. 규모가 작은 것도 아니다. 그런데 이 회사는 B사처럼 작은 것도 아니면서 버전관리 시스템이 마련되어있질 않다. 자세한 이유는 아직 출근한지 일주일 밖에 되지 않아서 파악하지 못했다. 그렇지만 아무튼 없다. SVN도 없다.

내가 투입된 프로젝트에는 다행히 Git 저장소가 있다고 한다. 설레는 마음으로 Github 저장소 주소를 전달받았다. 그런데 저장소가 존재하지 않는다는 메세지가 뜬다. 전달받은 URL을 직접 브라우저에 입력하여봤지만 그래도 접속할 수 없었다. 알고보니 그건 전임자가 개인적으로 만들어서 혼자 쓰던 저장소였다. 전임자가 프로젝트에서 빠지면서 그 저장소를 날려버린 것이다. 어쩔 수 없이 남아있는 소스가 압축된 zip 파일을 카카오톡으로 전달 받았다.

나는 생각한다

Github 저장소를 만드는 게 어려운 것도 아닌데 왜들 이럴까? 문제는 회사차원에서 Github 저장소를 만들려면 이용료가 발생한다는 것이다. 회사에서 개발하는 프로젝트는 오픈소스가 아닌 경우가 더 많으므로 private 저장소를 만들어야하는데, 협업자가 5명 이상이면 이용료를 지불해야 한다. 그래도 협업자가 5명 미만인 경우에는 무료로 사용할 수 있으니 비공식적으로 프로젝트를 담당자가 만들어놓고 임시 저장소로 사용한다. 그런데 저장소를 만든 사람이 퇴사를 한다면? 계약이 만료된다면? 담당자가 저장소의 존속에 대한 책임감을 갖지 않은 사람이라면? 저장소가 삭제되지 않을 거란 보장이 없는 것이다.

이번 프로젝트를 혼자 주도하게 되면서 Github에 저장소를 만들어놓을까 생각했지만, 약 3초만에 'NO'라고 결론 내렸다. 나조차도 이 프로젝트를 얼마나 오래 하고 있을지 알 수 없다. Git 저장소는 담당자가 얼마나 바뀌든지 계속 유지되어야한다. 회사측에서 공식적으로 저장소를 만들어둬야한다는 것이다. 하지만 앞서 말했다시피, 회사에서는 그놈의 돈 때문에 Github의 사용을 꺼릴 수도 있다. 그렇다면 무료로도 Git 버전관리 시스템을 이용할 수 있는 방법을 찾아야한다.

고로 Gitlab 쓴다

그래서 내가 선택한게 Gitlab이다.

Gitlab은 버전관리계의 워드프레스랄까? 내 나름의 첫인상이다. 워드프레스처럼 설치형으로도, 가입형으로도 이용할 수 있다. 특히 설치형 버전 중 커뮤니티 에디션 (gitlab-ce)은 private 저장소를 몇명이서 나눠 협업하든 무료다. 게다가 이용자 수도 (B사에서 썼던) Gogs 보다 많아 관련 문서를 찾기도 쉬웠다.

그리고 Docker도

설치형이니까 Docker에 깔아보고 싶었다.

이건 별 이유가 없다. 전에 Mac OS에서 Oracle DB를 설치하기 위해 Docker를 사용한 적이 있는데 상당히 편리했던 기억이 있었고, 또.. Docker가 요즘 그렇게 좋다길래 어떤 건지 다시 느껴보고 싶었다.

설치과정

Docker 설치

도커 홈페이지 에서 Download for Windows 버튼을 클릭하여 .exe 파일 다운 및 설치 cmd 창 실행하여 $ docker version 도커 설치 확인 $ docker search unbutu 명령어를 통해 우분투 목록을 확인 $ dock pull ubuntu 명령어를 입력한다. 기본적으로 가장 최신 버신을 다운 받게 되어있다. 다운로드 완료 후, $ docker image 명령어를 입력하면 설치된 이미지들을 볼 수 있다. 방금 설치한 unbuntu 이미지를 확인한다. 해당 이미지 파일을 컨테이너로 변경하는 작업을 해준다.

$ docker create -it --name ubuntu_server ubuntu

$ docker ps -a 명령어를 입력하여 컨테이너의 STATUS가 Created 인지 확인 $ docker start ubuntu_server 해당 컨테이너를 실행 $ docker attach ubuntu_server 해당 컨테이너에 접속 아래 명령어를 입력하여 ubuntu의 기초 세팅을 해준다.

$ apt-get upate # update 하기 $ apt-get upgrage # upgrade 하기 $ apt-get install vim # vim 설치하기

참고

Window10 - 도커 설치하기

Docker에 Gitlab 설치

docker pull gitlab/gitlab-ce 명령어를 입력해서 Gitlab(커뮤니티 에디션) 이미지를 받는다. docker 컨테이너 생성을 위해 필요한 디렉토리를 생성해준다.

mkdir -p /data/gitlab/config mkdir -p /data/gitlab/logs mkdir -p /data/gitlab/data

다운받은 docker 이미지를 컨테이너로 변경해준다.

docker run -d -p 443:443 -p 80:80 -p 22:22 --name gitlab -v /data/gitlab/config:/etc/gitlab -v /data/gitlab/logs:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest

또는 아래처럼 포트를 변경해서 생성하는 것도 가능하다.

docker run -d -p 8929:8929 -p 2289:2289 --name gitlab -v /data/gitlab/config:/etc/gitlab -v /data/gitlab/logs:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest

포트를 변경해서 생성한 경우 아래 명령어를 입력해서 내부에서 사용하는 포트를 변경한다..

/etc/gitlab/gitlab.rb 파일 수정으로 포트 설정을 변경할 수 있다.

docker exec -it gitlab nano /etc/gitlab/gitlab.rb

웹서버 포트를 변경하기 위해서 Ctrl + W로 주석 처리된 external_url부분을 찾아서 수정한다.

http://IP주소(URL):8929 로 변경 (ex. http://127.0.0.1:8929 ) 다음으로 SSH 포트를 변경을 위해 gitlab_rails['gitlab_shell_ssh_port'] 부분을 검색한다.

gitlab_rails['gitlab_shell_ssh_port'] = 2289

포트를 수정하고 다음으로 이메일 발송을 위한 SMTP 설정을 한다.

gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.gmail.com" gitlab_rails['smtp_port'] = 587 gitlab_rails['smtp_user_name'] = "[email protected]" gitlab_rails['smtp_password'] = "my-gmail-password" gitlab_rails['smtp_domain'] = "smtp.gmail.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = false gitlab_rails['smtp_openssl_verify_mode'] = 'peer'​

구글 gmail을 사용하려면 위와 같이 입력.

아웃룩 등의 다른 이메일 설정은 아래 링크에서 확인

https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/smtp.md GitHub와 Bitbucket에서 프로젝트를 가져오기 위해서 아래와 같이 설정

gitlab_rails['omniauth_enabled'] = true gitlab_rails['omniauth_allow_single_sign_on'] = false gitlab_rails['omniauth_external_providers'] = ['bitbucket', 'github']​ 메일 설정 완료 후, docker restart gitlab 컨테이너 재시작 마지막으로 SSH 사용을 위해서 컨테이너 내부의 SSH 포트 설정을 변경한다.

docker exec -it gitlab nano /etc/ssh/sshd_config

와!! Docker+Gitlab이다!!

완성!!

후일담

그럼 이제 버전관리 스토리가 해피엔딩으로 끝날 수 있겠지?

설치에 성공하고, 어느 정도 테스트까지 해본 뒤 현 출근지 개발담당자에게 할 수 있는 한 최대한 조심스러운 말투로 Gitlab 이야기를 꺼내보았다. 하지만 이번에도 달가워하지 않았다 . 하긴 프리랜서가 할 수 있는 혁신이란 한계가 명확한 것일까? 근데 이게 혁신인가? 어떻게든 쾌적하게 일하고 싶은 마음이, 혁신이나 되는 거창한 변화도 아니고, 필요한 걸 하겠다는데 말이다. 내가 회사 담당자라면 어차피 사내 git 시스템 구축이 필요한 마당에 옳다구나 하고 어떻게 써먹을지 고민해봤을 것 같은데, 왜 저들은 아닐가. 무엇이 문제인 걸까?

나는 잘 모르겠다

기술은 어렵지만 사람은 모르겠다.

버전관리 스토리는 이렇게 씁쓸한 열린 결말로 엔딩을 맺는다.

from http://lovenotwar.tistory.com/80 by ccl(A) rewrite - 2021-05-21 00:59:04