Ubuntu 22.04 에서 GitLab CE (Community Edition) 설치 및 사용하기

리눅스/PaaS|2024. 1. 19. 11:21
반응형

GitLab은 Git 저장소 관리, CI/CD, 이슈 트래킹, 웹 IDE 등의 기능을 제공하는 자체 호스팅 가능한 플랫폼입니다. 이를 사용하여 소스 코드를 관리하고 프로젝트를 효율적으로 개발할 수 있습니다.

 

여기에서는 Ubuntu 22.04 서버에서 GitLab 을 설치하는 가이드를 제공합니다. 이 가이드는 기본적인 설치 방법을 제공하며, 실제 프로덕션 환경에서는 보안 및 성능을 위한 추가 구성이 필요할 수 있습니다.

 

- 공식 사이트 : https://about.gitlab.com/

 

 

1. GitLab 설치

 

환경을 최신으로 유지합니다.

# apt -y update

# apt -y upgrade

 

GitLab 에 필요한 패키지를 우선 설치합니다.

# apt -y install curl openssh-server ca-certificates tzdata perl

 

GitLab 패키지 리포지토리를 추가합니다.

여기에서 추가하는 버전은 CE (Community Edition) 입니다.

그리고 우분투 환경에서 테스트 하기때문에 파일명에 deb 문자가 포함된 스크립트로 추가합니다.
# curl -L "https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh" | sudo bash

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6865  100  6865    0     0  18730      0 --:--:-- --:--:-- --:--:-- 18756
Detected operating system as Ubuntu/jammy.
Checking for curl...
Detected curl...
Checking for gpg...
Detected gpg...
Running apt-get update... done.
Installing apt-transport-https... done.
Installing /etc/apt/sources.list.d/gitlab_gitlab-ce.list...done.
Importing packagecloud gpg key... done.
Running apt-get update... done.

The repository is setup! You can now install packages.

 

GitLab CE (Community Edition) 를 설치합니다.

아래와 같이 사용할 도메인을 입력하여 명령을 실행합니다.

도메인은 DNS 에서 GitLab 서버 IP 로 연결해 놓아야 합니다.

# EXTERNAL_URL="http://git.sysdocu.kr" apt -y install gitlab-ce

 

웹 인터페이스에 접속하기 위해 패스워드를 확인합니다.

아래 패스워드는 24시간 유효합니다.

# cat /etc/gitlab/initial_root_password |grep Password:
Password: q2RIma952BAKFM0xJQKvBTD6009m8cwuiHyxtcjYAUE=

 

* 참고

패스워드 파일이 없거나 분실하여 재설정이 필요할때는 아래 명령을 사용합니다.

# gitlab-rake "gitlab:password:reset[root]"
Enter password: (신규 패스워드)
Confirm password: (신규 패스워드)
Password successfully updated for user with username root.

 

웹브라우저를 이용해 GitLab 웹 인터페이스에 접속합니다.

- http://git.sysdocu.kr
- ID : root

- PW : 위에 출력된 Password

 

* 웹페이지 접근이 되지 않을때

로컬에서 이미 포트를 사용하고 있어서 포트를 변경해야 하거나, 도메인이 아닌 IP 로 접근해야 할 수도 있습니다.

설정 파일에서 접속 URL 에 사용하지 않는 포트를 추가하여 재설정하고 접속하면 됩니다.

# vi /etc/gitlab/gitlab.rb

external_url 'http://git.sysdocu.kr:8090'    // 이렇게 사용하지 않는 포트 추가 후 아래 명령으로 재설정

# gitlab-ctl reconfigure

 

이제 웹페이지 접근이 될 것입니다.

처음 로그인시 상단에 아래와 같은 경고메세지가 출력됩니다.

"가입 제한을 확인합니다. 당신의 GitLab 인스턴스는 누구나 계정을 등록할 수 있도록 하는데, 이것은 공개적으로 직면한 GitLab 인스턴스의 보안 위험입니다. 공용 사용자가 계정에 등록하지 않을 것으로 예상되는 경우 신규 가입을 비활성화해야 합니다."

[ Deactivate ]  [ Acknowledge ]

여기에서 허용한 사용자만 이용할 수 있게 할 예정이므로, 'Deactivate' 버튼을 눌러줍니다.

그러면 화면이 'Sign-up restrictions' 항목으로 이동되는데 그 중에서 아래 내용만 변경하고 [Save changes] 버튼을 눌러 저장합니다.

- Sign-up enabled : 체크 해제

 

기본 설정된 패스워드가 길어 불편하므로 아래 메뉴를 찾아 root 패스워드를 변경하도록 합니다.

- 좌측 상단 '동그란 프로필 이미지' 클릭 > Preferences 클릭 > 좌측 메뉴에서 Password 클릭

 

변경 후에는 자동으로 로그아웃이 되며, 다시 로그인 하였을 경우 관리자 초기 페이지가 출력됩니다.

 

* 참고

1) 설정 파일 : /etc/gitlab/gitlab.rb

    수정 후 반영 : # gitlab-ctl reconfigure

2) GitLab 서비스 재시작 명령 : # gitlab-ctl restart

 

 

2. 프로젝트 생성

 

root 사용자로 로그인 한 경우 다음과 같은 메뉴를 이용할 수 있습니다.

- Create a project

- Create a group

- Add people

- Configure GitLab

 

이제 Repository 를 만들면 웹 상에서 소스 파일을 만들거나 업로드 할 수 있습니다.

본 매뉴얼에서는 공개 Repository 를 생성하고, CLI 를 통해 소스파일을 업로드, 증분 데이터 업로드 하는 순서로 진행해 보겠습니다.

 

'Create a project > Create blank project' 메뉴를 순서대로 선택하고 아래 필수 항목만 입력하여 프로젝트를 생성합니다.

나머지는 기본값으로 둡니다.

- Project name : sample

- Project URL & Project slug : http://git.sysdocu.kr/root/sample

- Visibility Level : Private

 

 

3. 파일 업로드

 

1) PC 에서 파일 업로드

로컬 PC 에서 git 명령어를 사용하여 Repository 에 파일을 추가 합니다.

git 명령이 없을 경우 Git 패키지를 설치해야 합니다.

(실습 PC : Ubuntu 22.04)

# apt -y install git

 

파일을 업로드 하기 위해 소스 파일이 있는 곳으로 이동합니다.

필자는 해당 디렉토리에 업로드 할 샘플 파일을 미리 만들어 두었습니다.

# cd php-sample

# ls -al
합계 1024032
drwxr-xr-x  2 root root      4096  1월 19 16:45 .
drwx------ 25 root root      4096  1월 19 16:45 ..
-rw-r--r--  1 root root 104857600  1월 19 16:44 file01.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file02.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file03.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file04.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file05.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file06.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file07.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file08.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file09.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file10.bin
-rw-r--r--  1 root root        44  1월 19 16:45 index.php

 

로컬 main 저장소를 초기화 합니다.

# git init -b main

/root/php-sample/.git/ 안의 빈 깃 저장소를 다시 초기화했습니다

 

원격 저장소를 origin 이라는 이름으로 로컬 저장소에 추가 합니다.

# git remote add origin http://git.sysdocu.kr/root/sample.git

 

[참고] --------------------

다른 저장소로 연결하기 위해 현재 원격 저장소를 확인하고 해제하는 명령어 입니다.

- 연결 상태 확인 명령어 : git remote 또는 git remote -v

- 연결 해제 명령어 : git remote remove {해제하려는 원격 저장소 이름}

-----------------------------

 

현재 작업 디렉토리의 모든 변경 사항을 로컬 저장소의 스테이징 영역 (Staging Area) 에 추가합니다.

변경된 파일들을 Git 이 추적하도록 표시하고, 이후에 이 변경 사항들을 커밋에 포함시킬 수 있습니다.

아직 Git 서버로 전송된 것은 아니며, 커밋 이후에 git push 명령을 사용하여 원격 서버로 변경 사항을 전송할 수 있습니다.
. 은 현재 디렉토리의 모든 파일을 의미합니다.

# git add .

 

스테이징 영역에 추가된 변경 사항들을 실제로 저장소에 기록 (commit) 합니다.
-m 옵션을 이용하여 커밋에 대한 간략한 설명을 입력합니다.
커밋 메시지는 커밋의 의도를 알 수 있도록 명확하게 작성하는 것이 좋습니다.

# git commit -m "First commit"

[main (최상위-커밋) b3e50c2] First commit

 11 files changed, 4 insertions(+)
 create mode 100644 file01.bin
 create mode 100644 file02.bin
 create mode 100644 file03.bin
 create mode 100644 file04.bin
 create mode 100644 file05.bin
 create mode 100644 file06.bin
 create mode 100644 file07.bin
 create mode 100644 file08.bin
 create mode 100644 file09.bin
 create mode 100644 file10.bin
 create mode 100644 index.php

 

git push 명령어로 로컬 저장소의 변경 사항을 원격 저장소로 전송합니다.
-u 는 원격 저장소의 브랜치 (분기) 에 로컬 브랜치를 연결하는 옵션입니다. 옵션 사용 이후에는 간단히 git push 만 사용하여 변경 사항을 전송할 수 있습니다.
아래는 로컬 main 브랜치의 변경 내용을 origin 이라는 원격 저장소에 업로드하는 명령입니다.

# git push -u origin main

Username for 'http://git.sysdocu.kr': root
Password for 'http://root@git.sysdocu.kr': (계정 비밀번호 입력)
오브젝트 나열하는 중: 5, 완료.
오브젝트 개수 세는 중: 100% (5/5), 완료.
Delta compression using up to 8 threads
오브젝트 압축하는 중: 100% (3/3), 완료.
오브젝트 쓰는 중: 100% (4/4), 99.93 KiB | 157.00 KiB/s, 완료.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To http://git.sysdocu.kr/root/sample.git
   91ee794..4c5d008  main -> main
'main' 브랜치가 리모트의 'main' 브랜치를 ('origin'에서) 따라가도록 설정되었습니다.

 

[에러 발생시] --------------------

error: 레퍼런스를 'http://git.sysdocu.kr/root/sample.git'에 푸시하는데 실패했습니다

이런 메세지가 출력된 경우는 원격지에는 있는 파일이, 로컬에는 없기 때문에 업데이트가 거부된 것입니다. 이 상황은 보통 처음 push 하거나 또 다른 저장소에서 같은 저장소로 push 할 때 발생합니다.

때문에 git pull 명령으로 원격지의 파일을 가져와서 로컬의 파일과 합치고, 다시 git push 하면 해결이 됩니다.

(pull 은 원격지 파일을 다운로드 하여 현재 디렉토리에 저장하므로 주의할 것)

명령어를 실행할 때 기본적으로 리베이스 (rebase) 전략을 사용하도록 설정합니다.

# git config pull.rebase true

그리고 다시 다운로드, 업로드 명령을 수행합니다.

# git pull origin main

# git push -u origin main

-------------------------------------

 

2) PC에서 증분 파일 업로드

파일을 한개 추가하고 업로드 할때, 모든 파일을 다시 업로드 하는것이 아니고 한개의 추가된 파일만 업로드 되는지 확인해 봅니다.

# cp -arp file10.bin file11.bin

 

현재 작업 디렉토리의 모든 변경 사항을 로컬 저장소의 스테이징 영역 (Staging Area) 에 추가합니다.

# git add .

 

최근 커밋을 수정하고 새로운 커밋을 생성합니다.

# git commit -m "Second commit"

[main 1cf3b17] Second commit
 1 file changed, 1 insertion(+)
 create mode 100644 file11.bin

 

다시 push 를 하게되면, 추가된 file11.bin 파일만 업로드 됩니다.

이 명령은 변경된 소스 또는 새로운 소스 파일만 업로드 하며, 로컬 디스크에 삭제된 파일이 있을 경우 원격지에서도 삭제하는 동기화 명령입니다.

-u 옵션은 위에서 한번 실행했으므로, 이번에는 생략해 보겠습니다.

# git push origin main
Username for 'http://git.sysdocu.kr': root
Password for 'http://root@git.sysdocu.kr': (계정 비밀번호 입력)
오브젝트 나열하는 중: 3, 완료.
오브젝트 개수 세는 중: 100% (3/3), 완료.
Delta compression using up to 8 threads
오브젝트 압축하는 중: 100% (2/2), 완료.
오브젝트 쓰는 중: 100% (2/2), 244 바이트 | 244.00 KiB/s, 완료.
Total 2 (delta 1), reused 0 (delta 0), pack-reused 0
To http://git.sysdocu.kr/root/sample.git
   3054f87..6943ce1  main -> main

GitLab 웹페이지에서 확인해보면 새로운 파일이 업로드 된것을 확인할 수 있습니다.

또한 올려진 파일리스트를 보면, 업로드 시간이 다른것으로 확인됩니다. 이로써 추가된 파일만 업로드 했음을 알 수 있습니다.

 

 

4. 커밋 변경

 

1) 로그 활용

실수로 로컬 파일을 삭제하거나 잘못 수정하였을때 이전 커밋 시점으로 돌리는 방법입니다.

테스트를 위해 다시 위 예제와 동일한 상태로 만들고 진행하였습니다.

 

복원이 잘 되는지 확인하기 위해 로컬의 file11.bin 파일을 삭제하였습니다.

# rm file11.bin

 

로컬의 변경사항을 되돌리기 위해 마지막으로 Git 원격 저장소에 업로드했던 해시를 확인합니다.

(최신 일시 순으로 정렬됩니다)
# git log
commit cfefa5fede689a7004f022f711d749fe8c79bfe1 (HEAD -> main, origin/main)
Author: SYSDOCU <root@sysdocu.kr>
Date:   Tue Jan 23 08:56:08 2024 +0900

    Second commit

commit 4c5d008cec251e152b5a197a6117b7d576611003
Author: SYSDOCU <root@sysdocu.kr>
Date:   Tue Jan 23 08:54:29 2024 +0900

    First commit

commit 91ee7943e944edb6f62a65d1036fb055fbf66753
Author: Administrator <admin@example.com>
Date:   Mon Jan 22 23:53:38 2024 +0000

    Initial commit


로컬의 현재 위치 (커밋) 를 file11.bin 파일이 존재했던 시점으로 변경하면 로컬에 삭제된 파일이 복원 됩니다.

작업량이 많은 경우 더 이전의 커밋 상태로 돌아갈 수도 있습니다.

# git reset --hard cfefa5fede689a7004f022f711d749fe8c79bfe1
HEAD의 현재 위치는 cfefa5f입니다 Second commit

 

# ls -al
합계 1024032
drwxr-xr-x  2 root root      4096  1월 19 16:45 .
drwx------ 25 root root      4096  1월 19 16:45 ..

drwxr-xr-x  8 root root      4096  1월 23 09:03 .git
-rw-r--r--  1 root root 104857600  1월 19 16:44 file01.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file02.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file03.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file04.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file05.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file06.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file07.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file08.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file09.bin
-rw-r--r--  1 root root 104857600  1월 19 16:44 file10.bin

-rw-r--r--  1 root root 104857600  1월 19 16:44 file11.bin
-rw-r--r--  1 root root        44  1월 19 16:45 index.php

 

2) 스테이시 활용

경우에 따라 git stash 명령을 사용해도 됩니다. 현재 작업 디렉토리의 변경사항을 일시적으로 저장하는 기능을 수행하는데, 이는 현재 브랜치에서 아직 커밋하지 않은 변경사항이 있을 때, 브랜치를 변경하거나 다른 브랜치로 이동할 때 유용합니다.
git stash 명령을 실행하면 현재 변경된 파일들을 스태시 스택에 저장하고, 작업 디렉토리는 이전 커밋의 상태로 돌아갑니다. 스태시는 나중에 필요할 때 다시 적용할 수 있습니다.

# git stash

명령 한 번이면 이전 커밋 상태로 돌아갑니다.

 

 

5. 전체 다운로드

 

공개된 Git 소스를 다운로드 받을 때 많이 사용하는 방법으로, 항상 전체 파일을 다운로드 합니다.

로컬에 같은 디렉토리가 있을 경우 다운로드가 되지 않습니다.

# git clone http://git.sysdocu.kr/root/sample.git

 

반응형

댓글()