Omnibus GitLab 아키텍처 및 구성 요소

Omnibus GitLab은 Chef의 Omnibus 프로젝트의 사용자 컴퓨터에서 GitLab을 구성하는 작업을 수행하는 데 사용되는 Chef 구성 요소 및 레시피와 같은 요소의 커스텀 포크입니다. Omnibus GitLab 리포지토리는 GitLab.com에서 제공되며 패키지 빌드에 필요한 Omnibus의 모든 구성요소와 프로젝트 메타데이터, 설치 후 사용자 컴퓨터에서 사용되는 Chef 관련 구성 요소를 호스팅합니다.

Omnibus-GitLab 구성요소

이러한 구성요소에 대한 체계적인 비디오 설명은 YouTube에서 확인할 수 있습니다.

소프트웨어 정의

GitLab 프로젝트 정의 파일

Omnibus 아키텍처의 기본 구성요소 중 하나는 프로젝트 정의 파일로, 프로젝트 세부 정보 및 외부 소프트웨어 및 라이브러리와의 종속성 관계를 나열하는 파일입니다.

프로젝트 정의 파일의 주요 구성요소는 다음과 같습니다:

  • 프로젝트 메타데이터: 프로젝트명 및 설명과 같은 속성을 포함합니다.
  • 프로젝트의 라이센스 세부 정보
  • 종속성 목록: GitLab을 빌드하거나 실행하는 데 필요한 외부 도구 및 소프트웨어 목록 및 경우에 따라 그들의 메타데이터를 포함합니다.
  • GitLab 설치에 사용되는 전역 구성 변수: 설치 디렉토리, 시스템 사용자 및 시스템 그룹을 포함합니다.

개별 소프트웨어 정의

Omnibus GitLab은 포함형 스타일의 배포를 따릅니다. GitLab 인스턴스의 올바른 작동에 필요한 모든 소프트웨어, 라이브러리 및 이진 파일이 패키지의 일부로 제공됩니다.

따라서 Omnibus 아키텍처의 주요 구성요소 중 하나는 소프트웨어 정의 및 구성입니다. 일반적인 소프트웨어 구성은 다음 부분으로 구성됩니다:

  • 필요한 소프트웨어의 버전
  • 소프트웨어의 라이센스
  • 소프트웨어를 빌드/실행하는 데 필요한 종속성
  • 소프트웨어를 빌드하고 패키지에 포함하기 위해 필요한 명령

가끔씩 소프트웨어의 소스 코드를 GitLab에서 사용하기 위해 수정해야 할 수도 있습니다. 이를 위해 Omnibus GitLab에는 다른 소프트웨어의 패치가 저장된 패치 디렉터리가 있습니다.

보다 체계적인 변경을 위해 미러의 브랜치에서 필요한 변경 사항을 추적하는 것이 더 편리할 수 있습니다. 이를 위한 패턴은 미러에서 브랜치를 생성하고 해당 브랜치포인트를 이름에 참조하는 것입니다. 예를 들어, Omnibus 코드베이스에서 gitlab-omnibus-v5.6.10는 상위 프로젝트의 v5.6.10 태그를 기반으로합니다. 이를 통해 로컬 변경 사항이 어떻게 있는지 식별할 수 있는 비교 링크(예: https://gitlab.com/gitlab-org/omnibus/compare/v5.6.10...gitlab-omnibus-v5.6.10)를 생성할 수 있습니다.

전역 GitLab 구성 템플릿

Omnibus GitLab은 사용자 컴퓨터에 설치될 GitLab 인스턴스의 모든 구성을 구성할 수 있는 단일 구성 파일을 제공합니다. 이 구성 파일은 GitLab 인스턴스에 적용될 모든 구성 설정의 근본적인 소스 역할을 합니다. 이 파일은 GitLab 인스턴스의 일반적인 설정 및 다양한 구성 요소에 대한 여러 옵션을 나열합니다. 이 파일의 일반적인 구조는 <component>['<setting>'] = <value> 형식으로 지정된 구성으로 구성되어 있습니다. 모든 가능한 옵션은 구성 템플릿에 나열되어 있지만, 기본적인 GitLab 작동에 필요한 옵션을 제외하고는 기본적으로 주석 처리되어 있습니다. 사용자는 필요한 경우 그것들을 주석을 해제하고 해당 값을 지정할 수 있습니다.

GitLab Cookbook

이전에 설명한 것과 같이 Omnibus GitLab은 요리사 구성 요소 중 많은 요소를 사용합니다. GitLab EE는 GitLab CE가 사용하는 것에서 확장된 별도의 Cookbook을 사용하고 EE 전용 구성요소를 추가합니다. Omnibus GitLab의 Chef 관련 주요 구성 요소는 다음과 같습니다:

기본 속성

기본 속성은 이름에서 알 수 있듯이 구성 파일에서 제공된 다른 설정에 대한 기본값을 지정합니다. 이러한 값은 사용자가 설정의 값을 제공하지 않은 경우에 대비하여 작동하는데, 따라서 최소한의 사용자 조정으로 작동하는 GitLab 인스턴스를 보장합니다.

레시피

레시피 는 Omnibus 패키지를 사용하여 GitLab을 설치하는 동안 대부분의 작업을 수행합니다. 사용자의 컴퓨터에 GitLab 생태계의 각 구성 요소를 설정하는 데 책임이 있으며 필요한 파일, 디렉토리 및 링크를 생성하고 해당 위치에 배치하며 권한과 소유자를 설정하고 필요한 서비스를 구성, 시작 및 중지하고 파일이 변경되면 해당 서비스에 알립니다. default라는 마스터 레시피는 모든 다른 구성 요소 및 서비스에 대한 필요한 레시피를 호출하는 진입점으로 작용합니다.

사용자 지정 리소스

사용자 지정 리소스 는 레시피 전반에 걸쳐 사용할 수 있는 전역 수준의 매크로로 간주될 수 있습니다. 사용자 지정 리소스의 일반적인 사용 사례로는 일반적인 서비스에 사용되는 포트를 정의하거나 다른 레시피에서 사용될 수 있는 중요한 디렉토리를 나열하는 것이 있습니다. 이들은 다른 레시피에서 재사용될 수 있는 리소스를 정의합니다.

구성 요소 구성을 위한 템플릿

이전에 언급했듯이 Omnibus GitLab은 GitLab 인스턴스의 모든 구성 요소를 조정하기 위한 단일 구성 파일을 제공합니다. 그러나 다른 구성 요소의 구조적 설계는 특정 위치에 상주하는 개별 구성 파일을 가져야 하는 경우가 있습니다. 이러한 구성 파일은 사용자가 일반 구성 파일에 지정한 값이나 지정한 기본 값에서 생성되어야 합니다. 따라서 Omnibus GitLab은 이러한 구성 파일의 템플릿을 구비하여 기본 값이나 사용자의 값으로 채울 수 있는 자리표를 가지고 있습니다. 레시피는 이러한 템플릿을 완성하여 필요한 위치에 채우고 배치하는 작업을 수행합니다.

일반 라이브러리 메서드

Omnibus GitLab은 또한 주로 코드 재사용을 목적으로 하는 라이브러리 메서드를 제공합니다. 이에는 서비스가 실행 중인지 확인하는 방법, 파일이 존재하는지 확인하는 방법, 다른 구성 요소와 상호 작용하는 도우미 메서드 등이 포함됩니다. 이러한 메서드들은 종종 Chef 레시피에서 사용됩니다.

Omnibus GitLab에서 사용된 모든 라이브러리 중에는 일부 특별한 라이브러리가 있습니다. 기본 GitLab 모듈 및 그것이 호출하는 모든 구성 요소별 라이브러리입니다. 구성 요소별 라이브러리에는 해당 구성 요소에 대한 설정이 정의된 구문 구성 파일을 구문 분석하는 역할을 하는 메서드가 포함되어 있습니다. 기본 GitLab 모듈에는 이를 조정하는 메서드가 포함되어 있습니다. 이는 기본 값을 식별하고 구성 요소별 라이브러리를 호출하며 기본 값과 사용자 지정 값 병합, 검증 및 초기 값에 따라 추가 구성을 생성하는 역할을 합니다. Omnibus GitLab 패키지로 제공되는 모든 최상위 구성 요소는 구성 파일 및 기본 속성에서 언급될 수 있도록 이 모듈로 추가되므로 올바르게 구문 분석됩니다.

runit

GitLab은 서비스 관리 및 감독을 위해 runit 레시피를 사용합니다. runit 레시피는 OS에서 사용하는 이닛 시스템을 식별하고 GitLab에 필요한 서비스 파일을 생성하고 서비스 활성화 및 서비스 다시로드와 같은 기본 서비스 관리 작업을 수행합니다. runit은 다른 레시피에서 사용할 runit_service 정의를 제공하여 서비스와 상호 작용할 수 있습니다. 자세한 내용은 여기를 참조하십시오: /files/gitlab-cookbooks/runit.

서비스

서비스는 runit 프로세스 이닛/감독을 사용하여 실행하는 소프트웨어 프로세스입니다. gitlab-ctl 명령을 사용하여 상태를 확인하고 시작, 중지 및 다시 시작할 수 있습니다. 또한 레시피는 이러한 서비스를 프로세스 그룹 및 인스턴스의 구성된 설정/역할에 따라 비활성화 또는 활성화할 수도 있습니다. 서비스 및 해당 서비스 그룹 목록은 여기에서 확인할 수 있습니다.

추가 gitlab-ctl 명령

기본적으로 Omnibus는 GitLab 인스턴스를 관리하기 위한 gitlab-ctl reconfiguregitlab-ctl restart와 같은 래퍼 명령을 제공합니다. Omnibus GitLab 저장소에 정의된 특정 사용 사례를 대상으로 하는 몇 가지 추가 래퍼 명령이 있습니다. 이 명령들은 일반적인 gitlab-ctl 명령과 함께 사용되어 데이터베이스 마이그레이션 실행 또는 휴면 계정 제거와 같은 일부 특정하지 않은 작업을 수행합니다.

테스트

Omnibus GitLab 저장소는 ChefSpec을 사용하여 쿡북 및 레시피를 테스트합니다. 일반적인 전략은 사용자가 해당 구성을 지정하지 않았을 때(즉, 기본값이 사용될 때) 및 사용자가 지정한 구성을 사용했을 때 레시피가 올바르게 작동하는지 확인하는 것입니다. 테스트에는 올바른 위치에 파일이 생성되는지, 서비스가 시작/중지/알림을 받는지, 올바른 이진 파일이 호출되는지, 메서드 호출에 올바른 매개변수가 전달되는지 확인하는 것이 포함될 수 있습니다. 레시피 및 라이브러리 메서드에는 해당되는 테스트가 있습니다. Omnibus GitLab은 테스트 프로세스를 지원하기 위해 일부 지원 메서드 또는 매크로를 사용합니다. 가능한 경우 병렬화 호환성으로 정의된 테스트는 전체 테스트 스위트를 실행하는 데 필요한 시간을 줄이기 위해 병렬화됩니다.

따라서 여기에 설명된 구성 요소 중 일부(예: 소프트웨어 정의, 프로젝트 메타데이터 및 테스트)는 빌드 환경에서 패키지 빌딩 중에 사용되며 일부(예: Chef 쿡북 및 레시피, GitLab 구성 파일, runit 및 gitlab-ctl 명령)은 사용자 설치된 인스턴스를 구성하는 데 사용됩니다.

Omnibus GitLab의 작업 수명주기

패키지 빌딩 중 발생하는 일들

빌드 프로세스가 실행되는 OS에 따라 빌드되는 패키지의 종류가 달라집니다. Debian 환경에서 빌드를 수행하는 경우 .deb 패키지가 생성됩니다. 패키지 빌딩 중에 발생하는 일들은 다음 단계로 요약될 수 있습니다.

  1. 의존 소프트웨어의 소스 가져오기:
    1. 소프트웨어 정의 구문을 구문 분석하여 해당 버전을 파악합니다.
    2. 원격지 또는 캐시에서 소스 코드 가져오기.
  2. 개별 소프트웨어 구성물 빌드:
    1. 필요한 환경 변수 및 플래그 설정.
    2. 해당되는 경우 패치 적용.
    3. 빌드 및 구성물 설치 수행으로, 적절한 위치(내부 /opt/gitlab에 설치)에 설치합니다.
  3. 외부 소프트웨어, Ruby 젬 및 JS 모듈을 포함한 모든 번들된 구성 요소의 라이선스 정보 생성. 이는 각 종속성의 정의를 분석하고 구성 요소가 제공하는 추가 라이선스 문서(예: GitLab Rails에서 제공하는 licenses.csv 파일)를 분석합니다.
  4. 비호환 라이선스로 구성 요소를 제공하지 않는지 확인하기 위해 구성 요소의 라이선스 확인.
  5. 패키지의 건강 상태 확인으로, 이진 파일이 사용 가능한 라이브러리에 링크되어 있는지 확인합니다. 번들된 라이브러리의 경우, 이진 파일은 이러한 라이브러리에 링크되어야 하며 전역적으로 사용 가능한 라이브러리에 링크되어서는 안 됩니다.
  6. /opt/gitlab의 내용으로 패키지 빌드. gitlab.rb 파일 내에 있는 메타데이터를 활용합니다. 이에는 패키지 이름, 버전, 유지 관리자, 홈페이지 및 다른 패키지와의 충돌에 관한 정보가 포함됩니다.

캐싱

Omnibus는 빌드 프로세스의 최적화를 위해 두 가지 유형의 캐시를 사용합니다: 소프트웨어 아티팩트(의존 소프트웨어의 소스)를 저장하는 하나, 그리고 각 소프트웨어 구성 요소가 빌드된 후의 프로젝트 트리를 저장하는 다른 하나

소프트웨어 아티팩트 캐시 (GitLab Inc 빌드용)

소프트웨어 아티팩트 캐시는 Amazon S3 버킷을 사용하여 의존 소프트웨어의 소스를 저장합니다. 이 캐시는 빌드 프로세스에서 bin/omnibus cache populate 명령을 사용하여 채워집니다. 이 명령은 필요한 소프트웨어 소스를 Amazon 버킷에서 가져와 필요한 위치에 저장합니다. 소프트웨어의 버전 요구 사항이 변경되면 omnibus가 컴포넌트를 원래 원격지에서 가져와 아티팩트 캐시에 추가합니다. 이 프로세스는 omnibus 내부적으로 수행되며, 레포지토리 루트에 있는 omnibus.rb 파일에서 사용할 Amazon 버킷을 설정합니다. 이 캐시는 원래 원격지가 다운될 경우에도 의존 소프트웨어를 사용할 수 있도록 보장합니다.

빌드 캐시

빌드 프로세스에서 중요한 역할을 하는 두 번째 유형의 캐시는 빌드 캐시입니다. 빌드 캐시는 각 의존 소프트웨어가 빌드된 후의 프로젝트 트리의 스냅샷으로 설명할 수 있습니다. A, B, C, D, E의 다섯 개의 의존 소프트웨어가 있는 프로젝트를 고려해 보겠습니다. 이들의 의존성에 대해서는 고려하지 않습니다. 빌드 캐시는 스냅샷을 생성하기 위해 Git 태그를 사용합니다. 각 소프트웨어가 빌드된 후에 Git 태그가 계산되고 커밋됩니다. 이제 소프트웨어 D의 정의에 변경이 가해졌다고 가정해 봅시다. A, B, C, E는 그대로 유지됩니다. 다시 빌드하려고 할 때, omnibus는 이전 빌드에서 D가 빌드되기 전에 만든 스냅샷을 재사용할 수 있습니다. 따라서 A, B, 및 C의 빌드에 걸리는 시간을 저장할 수 있습니다. omnibus는 “빌드된 소프트웨어가 적용되어 캐시를 더럽힌” 경우 (이로 인해 더러워질 수 있는 것은 소프트웨어 정의의 변경, 이전 컴포넌트의 이름/버전 변경, 또는 현재 컴포넌트의 버전 변경 중 하나) 이전에 만든 스냅샷을 사용합니다. 마찬가지로, 빌드 중에 소프트웨어 A의 정의에 변경이 가해지면 캐시를 더럽히고, A 및 모든 이후의 종속성이 처음부터 다시 빌드됩니다. C가 캐시를 더럽힌 경우, A와 B는 재사용되고, C, D, E는 처음부터 다시 빌드됩니다.

이 캐시는 빌드를 유지하는 한 의미를 갖습니다. 이를 위해, 우리는 GitLab CI의 캐싱 메커니즘을 사용합니다. Amazon 버킷에 내부 캐시를 저장하도록 구성된 전용 러너가 있습니다. 각 빌드 전에 이 캐시를 가져와서 (restore_cache_bundle 우리 Makefile에 있는 대상), 적절한 위치로 이동하여 빌드를 시작합니다. omnibus에서 사용하고, 캐시가 더럽혀지는 시점까지 유지됩니다. 빌드 후, 새로운 캐시를 압축하고 CI에게 Amazon 버킷에 백업하도록 지시합니다 (pack_cache_bundle 우리 Makefile에 있는).

두 유형의 캐시는 GitLab 및 외부 요소에 대한 종속성을 줄이고 전반적인 GitLab 및 종속 요소의 빌드 시간을 감소시킵니다.

캐시 메커니즘은 다음과 같이 요약됩니다:

  1. 각 소프트웨어 의존성에 대해:
    1. 버전 및 SHA256를 이해하기 위해 정의를 구문 분석합니다.
    2. Amazon 버킷에 있는 소스 파일 타볼이 버전 및 SHA256과 일치하는지 확인합니다.
    3. 그렇지 않은 경우, 올바른 타볼을 원격지에서 다운로드합니다.
  2. CI 캐시에서 캐시 가져오기.
  3. 각 소프트웨어 의존성에 대해:
    1. 캐시가 더러워졌으면 루프를 중단합니다.
    2. 그렇지 않은 경우, 스냅샷을 확인합니다.
  4. 남아 있는 종속성이 있는 경우:
    1. 각 남아 있는 종속성에 대해:
      1. 종속성을 빌드합니다.
      2. 스냅샷을 생성하고 커밋합니다.
  5. 새로운 빌드 캐시를 CI 캐시로 밀어넣습니다.

gitlab-ctl reconfigure 작업은 무엇을 하는가

깃랩 인스턴스를 관리하는 동안 자주 사용되는 명령어 중 하나는 gitlab-ctl reconfigure입니다. 이 명령어는 간단히 말해서 구성 파일을 구문 분석하고 해당 값을 사용하여 레시피를 실행합니다. 실행될 레시피들은 설치 디렉토리 내의 embedded 폴더에 있는 dna.json 파일에 정의되어 있습니다. (이 파일은 소프트웨어 정의에서 정의된 gitlab-cookbooks라는 소프트웨어 의존성에 의해 생성됩니다). GitLab CE의 경우 gitlab이라는 쿡북이 마스터 레시피로 선택되며, 차례로 runit을 포함한 모든 필요한 레시피를 호출합니다. 즉, reconfigure는 구성 템플릿에서 제공된 값으로 다양한 파일 및 서비스를 구성하는 chef-client 실행입니다.

다중 데이터베이스

이전에는 GitLab Rails 애플리케이션이 Omnibus GitLab 데이터베이스에 연결된 유일한 클라이언트였습니다. 그러나 시간이 지나면서 상황이 변화했습니다:

  • Praefect 및 컨테이너 레지스트리는 자체 데이터베이스를 사용합니다.
  • 레일즈 애플리케이션은 이제 분해된 데이터베이스를 사용합니다.

추가 데이터베이스가 필요할 수 있기 때문에:

  • 다중 데이터베이스 블루프린트에서는 Omnibus GitLab에 새 구성 요소 및 기능에 대한 데이터베이스 지원을 추가하는 방법을 설명합니다.
  • 동반 개발 문서에는 구현 모델을 상세히 설명하고 데이터베이스 지원을 추가하는 예시가 제공됩니다.