GitLab Shell 개발 가이드라인
GitLab Shell은 GitLab의 Git SSH 세션을 처리하고 인가된 키 목록을 수정합니다. GitLab Shell은 Unix 셸이나 Bash 또는 Zsh와 대체되는 것이 아닙니다.
GitLab은 SSH를 통한 Git LFS 인증을 지원합니다.
요구 사항
GitLab Shell은 Go로 작성되었으며 빌드하기 위해 Go 컴파일러가 필요합니다. 여전히 빌드하고 테스트하기 위해 Ruby가 필요하지만 실행에는 필요하지 않습니다.
Omnibus 설치에서 GitLab Shell은 포트 22
에서 실행됩니다. 일반적인 SSH 서비스를 사용하려면 대체 포트에 구성해야 합니다.
현재 버전의 Go를 다운로드하고 설치하세요. 우리는 Go 릴리즈 정책을 따르며 다음을 지원합니다:
- 현재 안정 버전
- 이전 두 개의 주요 버전
버전
GitLab Shell과 관련된 두 개의 버전 파일이 있습니다:
GitLab 팀 멤버들은 #announcements
내부 Slack 채널을 모니터링할 수도 있습니다.
GitLab Shell 작동 방식
SSH를 통해 GitLab 서버에 액세스하면 GitLab Shell은 다음을 수행합니다:
- 미리 정의된 Git 명령(
git push
,git pull
,git fetch
)으로 제한합니다. - 권한이 있는지, 그리고 당신의 저장소가 어느 Gitaly 서버에 있는지 확인하기 위해 GitLab Rails API를 호출합니다.
- SSH 클라이언트와 Gitaly 서버 간에 데이터를 오고 갈 수 있도록 복사합니다.
만약 HTTP(S)를 통해 GitLab 서버에 액세스하면, gitlab-workhorse
로 이동하게 됩니다.
SSH를 통한 git pull
SSH를 통한 git push
git push
명령은 gitlab-rails
이 푸쉬를 수락한 후에 수행됩니다:
authorized_keys
수정
GitLab Shell은 클라이언트 기계의 authorized_keys
파일을 수정합니다.
GitLab Shell에 기여
GitLab Shell에 기여하려면:
- GitLab API 액세스 및 내부 API를 통해 Redis에 도달할 수 있는지 확인하세요:
make check
-
gitlab-shell
이진 파일을 컴파일하여bin/
에 배치하세요:make compile
-
make install
을 실행하여gitlab-shell
이진 파일을 빌드하고 설치하세요. 기본 위치는/usr/local
입니다. 위치를 변경하려면PREFIX
및DESTDIR
환경 변수를 설정하세요. - 단일 기계에서 소스로부터 GitLab을 설치하려면
make setup
을 실행하세요. 이 명령은 GitLab Shell 이진 파일을 컴파일하고 파일 시스템에 올바른 권한으로 다양한 경로가 존재함을 보장합니다. 설치 방법 문서에서 명령을 실행하라는 안내가 없는 경우에는 이 명령을 실행하지 마세요.
더 많은 정보는 CONTRIBUTING.md를 참조하세요.
테스트 실행
기여할 때 테스트를 실행하세요:
-
bundle install
및make test
로 테스트를 실행하세요. - Gofmt를 실행하세요:
make verify
-
테스트 및 검증을 동시에 실행하세요 (기본 Makefile 대상):
bundle install make validate
- 필요한 경우 Gitaly를 구성하세요.
로컬 테스트를 위해 Gitaly 구성
일부 테스트에서 Gitaly 서버가 필요합니다.
docker-compose.yml
파일은 Gitaly를 8075 포트에서 실행합니다.
테스트에게 Gitaly의 위치를 알리려면 GITALY_CONNECTION_INFO
를 설정하세요:
export GITALY_CONNECTION_INFO='{"address": "tcp://localhost:8075", "storage": "default"}'
make test
만약 GITALY_CONNECTION_INFO
가 설정되어 있지 않다면 테스트 스위트는 여전히 실행되지만 Gitaly가 필요한 테스트는 건너뜁니다. 테스트는 항상 CI 환경에서 실행됩니다.
속도 제한
GitLab Shell은 Git 작업에 대한 사용자 계정 및 프로젝트별로 속도 제한을 수행합니다.
GitLab Shell은 Git 작업 요청을 수락한 다음, Redis를 백엔드로 하는 Rails 속도 제한자에 대한 호출을 수행합니다. 사용자 + 프로젝트
가 속도 제한을 초과하면 GitLab Shell은 해당 사용자 + 프로젝트
의 추가 연결 요청을 드롭합니다.
속도 제한자는 Git 명령(plumbing) 수준에서 적용됩니다. 각 명령은 분당 600개의 제한을 가지고 있습니다. 예를 들어, git push
는 분당 600개이며, git pull
도 분당 600개입니다.
동일한 plumbing 명령을 사용하기 때문에, git-upload-pack
, git pull
, 그리고 git clone
은 속도 제한 목적을 위해 사실상 동일한 명령입니다.
Gitaly도 속도 제한자를 가지고 있지만, GitLab Shell(Rails)에서 속도 제한을 초과할 경우 Gitaly에 대한 호출은 절대 이루어지지 않습니다.
GitLab Shell 로그
일반적으로 GitLab Shell 또는 gitlab-sshd
세션의 구조는 로그를 검사하여 확인할 수 있지만 내용은 확인할 수 없습니다. 몇 가지 지침:
- 로깅에는
gitlab.com/gitlab-org/labkit/log
을 사용합니다. - 항상 상관 ID를 포함시킵니다.
- 로그 메시지는 불변하고 고유해야 합니다.
log.WithField
,log.WithFields
, 또는log.WithError
를 사용하여 보조 정보를 필드에 포함합니다. - 성공 사례와 오류 사례를 모두 로깅합니다.
- 로깅하는 양이 적은 것 보다는 많은 것이 나을 수 있습니다. 메시지가 너무 자세하다고 생각된다면 메시지를 제거하기 전에 로그 레벨을 낮추는 것을 고려하세요.
GitLab SaaS
GitLab.com의 gitlab-shell
흐름을 나타낸 다이어그램: