푸시 규칙

Tier: Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated
  • 푸시 규칙에 대한 최대 정규 표현식 길이가 변경되었습니다 - GitLab 16.3에서 255에서 511자로 늘어났습니다.

푸시 규칙은 사용하기 쉬운 인터페이스에서 활성화할 수 있는 pre-receive Git 후크입니다.

푸시 규칙은 저장소에 푸시할 수 있는 것과 없는 것에 대한 더 많은 제어를 제공합니다. GitLab은 보호된 브랜치를 제공하지만, 다음과 같은 보다 구체적인 규칙이 필요할 수 있습니다:

  • 커밋 내용 평가하기.
  • 커밋 메시지가 예상 형식과 일치하는지 확인하기.
  • 브랜치 이름 규칙 시행하기.
  • 파일의 세부정보 평가하기.
  • Git 태그 제거 방지하기.

GitLab은 푸시 규칙에서 정규 표현식을 위해 RE2 구문을 사용합니다.
정규 표현식을 regex101 정규 표현식 테스터에서 테스트할 수 있습니다.
각 정규 표현식은 511자로 제한됩니다.

사용자 지정 푸시 규칙을 위해 서버 후크를 사용하세요.

글로벌 푸시 규칙 활성화

모든 새 프로젝트가 상속할 푸시 규칙을 만들 수 있지만, 프로젝트나 그룹에서 무시할 수 있습니다.
글로벌 푸시 규칙을 설정한 후 생성된 모든 프로젝트는 이 구성을 상속합니다.
그러나 기존 프로젝트는 프로젝트별로 글로벌 푸시 규칙 무시라는 프로세스를 사용하여 수동으로 업데이트해야 합니다.

사전 조건:

  • 관리자여야 합니다.

글로벌 푸시 규칙을 생성하려면:

  1. 왼쪽 사이드바에서 하단의 Admin을 선택합니다.
  2. Push rules를 선택합니다.
  3. Push rules를 확장합니다.
  4. 원하는 규칙을 설정합니다.
  5. Save push rules를 선택합니다.

프로젝트별 글로벌 푸시 규칙 무시

개별 프로젝트의 푸시 규칙이 글로벌 푸시 규칙을 무시합니다.
특정 프로젝트에 대한 글로벌 푸시 규칙을 무시하거나 기존 프로젝트의 규칙을 새로운 글로벌 푸시 규칙에 맞게 업데이트하려면:

  1. 왼쪽 사이드바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
  2. Settings > Repository를 선택합니다.
  3. Push rules를 확장합니다.
  4. 원하는 규칙을 설정합니다.
  5. Save push rules를 선택합니다.

사용자 검증

이 규칙을 사용하여 커밋을 하는 사용자를 검증합니다.

참고:
이 푸시 규칙은 커밋에만 적용되며 태그에는 적용되지 않습니다.

  • 확인되지 않은 사용자 거부: 사용자는 확인된 이메일 주소를 가져야 합니다.
  • 커밋 작성자가 GitLab 사용자 여부 확인: 커밋 작성자와 커미터는 GitLab에서 확인된 이메일 주소를 가져야 합니다.
  • 커밋 작성자의 이메일: 작성자와 커미터의 이메일 주소는 정규 표현식과 일치해야 합니다.
    모든 이메일 주소를 허용하려면 비워 두세요.

커밋 메시지 검증

이 규칙을 커밋 메시지에 사용합니다.

  • 커밋 메시지에서 표현식 요구: 메시지는 표현식과 일치해야 합니다.
    모든 커밋 메시지를 허용하려면 비워 두세요.
    멀티라인 모드를 사용하며, (?-m)을 사용하여 비활성화할 수 있습니다. 몇 가지 검증 예시:

    • JIRA\-\d+는 모든 커밋이 Jira 문제를 참조해야 한다는 것을 요구합니다. 예: 슥 css 수정. JIRA-123 수정.
    • [[:^punct:]]\b$는 마지막 문자가 구두점인 경우 커밋을 거부합니다.
      단어 경계 문자(\b)는 Git이 커밋 메시지의 끝에 개행 문자(\n)를 추가하기 때문에 잘못된 음성을 방지합니다.

    GitLab UI에서 생성된 커밋 메시지는 \r\n을 개행 문자로 설정합니다.
    정규 표현식에서 \n 대신 (\r\n?|\n)을 사용하여 올바르게 일치시킵니다.

    예를 들어, 다음의 멀티라인 커밋 설명이 주어졌을 때:

    JIRA:  
    설명  
    

    이 정규 표현식 JIRA:(\r\n?|\n)\w+로 검증할 수 있습니다.

  • 커밋 메시지에서 표현식 거부: 커밋 메시지는 표현식과 일치하지 않아야 합니다.
    모든 커밋 메시지를 허용하려면 비워 두세요.
    멀티라인 모드를 사용하며, (?-m)을 사용하여 비활성화할 수 있습니다.

서명되지 않은 커밋 거부

개발자 인증서 (DCO)로 서명된 커밋은 기여자가 작성했거나 제출할 권리가 있는 코드가 포함되어 있음을 인증합니다. 프로젝트에 대한 모든 커밋이 DCO를 준수하도록 요구할 수 있습니다. 이 푸시 규칙은 모든 커밋 메시지에 Signed-off-by: 트레일러를 요구하며, 이 트레일러가 없는 커밋은 거부됩니다.

브랜치 이름 유효성 검사

브랜치 이름을 유효성 검사하려면 브랜치 이름에 대한 정규 표현식을 입력하십시오.

모든 브랜치 이름을 허용하려면 비워 두십시오. 당신의 기본 브랜치는 항상 허용됩니다.

보안을 위해 기본적으로 특정 형식의 브랜치 이름은 제한됩니다. 40개의 16진수 문자로 구성된 이름은 Git 커밋 해시와 유사하며 금지됩니다.

다음은 유효성 검사의 예입니다:

  • 브랜치는 JIRA-로 시작해야 합니다.

    ^JIRA-
    
  • 브랜치는 -JIRA로 끝나야 합니다.

    -JIRA$
    
  • 브랜치는 4자에서 15자 사이의 길이를 가져야 하며, 소문자, 숫자 및 하이픈만 허용됩니다.

    ^[a-z0-9\\-]{4,15}$
    

원치 않는 결과 방지

원치 않는 결과를 방지하기 위해 이 규칙을 사용하십시오.

파일 유효성 검사

커밋에 포함된 파일을 유효성 검사하기 위해 이 규칙을 사용하십시오.

  • 비밀 파일 푸시 방지: 파일에는 비밀이 포함되어서는 안 됩니다.

  • 금지된 파일 이름: 리포지토리에 존재하지 않는 파일은 정규 표현식과 일치하지 않아야 합니다. 모든 파일 이름을 허용하려면 비워 두십시오. 일반적인 예를 참조하십시오.

  • 최대 파일 크기: 추가되거나 업데이트된 파일은 이 파일 크기(단위: MB)를 초과하지 않아야 합니다. 모든 크기의 파일을 허용하려면 0으로 설정하십시오. Git LFS에 의해 추적되는 파일은 면제됩니다.

리포지토리에 비밀 푸시 방지

버전 관리 시스템에 자격 증명 파일 및 SSH 개인 키와 같은 비밀 정보는 절대 커밋하지 마십시오. GitLab에서는 미리 정의된 파일 목록을 사용하여 이러한 파일이 리포지토리에 포함되지 않도록 차단할 수 있습니다. 목록과 일치하는 파일이 포함된 병합 요청은 차단됩니다. 이 푸시 규칙은 이미 리포지토리에 커밋된 파일을 제한하지 않습니다. 기존 프로젝트에서 이 규칙을 사용하려면 프로젝트별로 전역 푸시 규칙 재정의에서 설명한 프로세스를 사용하여 구성을 업데이트해야 합니다.

이 규칙에 의해 차단된 파일은 아래에 나열되어 있습니다. 전체 기준 목록은 files_denylist.yml에서 확인하십시오.

  • AWS CLI 자격 증명 블롭:

    • .aws/credentials
    • aws/credentials
    • homefolder/aws/credentials
  • 개인 RSA SSH 키:

    • /ssh/id_rsa
    • /.ssh/personal_rsa
    • /config/server_rsa
    • id_rsa
    • .id_rsa
  • 개인 DSA SSH 키:

    • /ssh/id_dsa
    • /.ssh/personal_dsa
    • /config/server_dsa
    • id_dsa
    • .id_dsa
  • 개인 ED25519 SSH 키:

    • /ssh/id_ed25519
    • /.ssh/personal_ed25519
    • /config/server_ed25519
    • id_ed25519
    • .id_ed25519
  • 개인 ECDSA SSH 키:

    • /ssh/id_ecdsa
    • /.ssh/personal_ecdsa
    • /config/server_ecdsa
    • id_ecdsa
    • .id_ecdsa
  • 개인 ECDSA_SK SSH 키:

    • /ssh/id_ecdsa_sk
    • /.ssh/personal_ecdsa_sk
    • /config/server_ecdsa_sk
    • id_ecdsa_sk
    • .id_ecdsa_sk
  • 개인 ED25519_SK SSH 키:

    • /ssh/id_ed25519_sk
    • /.ssh/personal_ed25519_sk
    • /config/server_ed25519_sk
    • id_ed25519_sk
    • .id_ed25519_sk
  • 다음 접미사로 끝나는 모든 파일:

    • *.pem
    • *.key
    • *.history
    • *_history

파일 이름으로 금지

Git에서 파일 이름은 파일의 이름과 해당 이름 이전의 모든 디렉터리를 포함합니다.

git push를 할 때, 푸시의 각 파일 이름은 금지된 파일 이름의 정규 표현식과 비교됩니다.

귀하의 금지된 파일 이름 푸시 규칙에 있는 정규 표현식은 제외할 여러 독립적인 매치를 포함할 수 있습니다.

파일 이름은 저장소의 어디에서든 넓게 매치할 수 있으며, 특정 위치에서만 제한할 수 있습니다. 파일 이름 매치는 부분적으로도 가능하며, 확장을 기반으로 파일 유형을 제외할 수 있습니다.

이 예제는 문자열의 시작(^)과 끝($)을 매치하기 위해 정규 표현식(regular expressions) 문자열 경계 문자를 사용합니다.

또한 디렉터리 경로나 파일 이름에 . 또는 /가 포함될 수 있는 경우를 포함합니다. 이러한 두 가지 특수 정규 표현식 문자는 매치 조건에서 표준 문자로 사용하려면 백슬래시 \\로 이스케이프 처리해야 합니다.

  • 저장소의 어느 위치에도 .exe 파일 푸시 방지 - 이 정규 표현식은 끝에 .exe가 포함된 모든 파일 이름과 일치합니다:

    \.exe$
    
  • 저장소 루트에서 특정 구성 파일 푸시 방지

    ^config\.yml$
    
  • 알려진 디렉터리에서 특정 구성 파일 푸시 방지

    ^directory-name\/config\.yml$
    
  • 저장소의 어느 위치에도 특정 파일 푸시 방지 - 이 예제는 install.exe라는 이름의 파일을 테스트합니다. 괄호로 묶인 표현식 (^|\/)는 디렉터리 구분자 뒤에 있는 파일이나 저장소의 루트 디렉터리에 있는 파일을 매치합니다:

    (^|\/)install\.exe$
    
  • 모든 이전 표현식을 하나의 표현식으로 결합 - 앞의 표현식들은 문자열 끝 문자인 $에 의존합니다. 각 표현식의 이 부분을 매치 조건의 그룹 모음 끝으로 이동시켜 모든 매치에 추가할 수 있습니다:

    (\.exe|^config\.yml|^directory-name\/config\.yml|(^|\/)install\.exe)$
    

관련 주제

문제 해결

서명이 없는 커밋 푸시 규칙이 Web IDE를 비활성화합니다

프로젝트에 서명이 없는 커밋 거부 푸시 규칙이 있는 경우, 사용자는 GitLab Web IDE를 통해 커밋을 생성할 수 없습니다.

이 푸시 규칙이 있는 프로젝트에서 Web IDE를 통해 커밋을 허용하려면, GitLab 관리자가 기능 플래그 reject_unsigned_commits_by_gitlab를 비활성화해야 합니다 플래그로.

Feature.disable(:reject_unsigned_commits_by_gitlab)

GitLab UI에서 생성된 서명이 없는 커밋

서명이 없는 커밋 거부 푸시 규칙은 인증되고 GitLab (UI 또는 API를 통해)에서 생성된 커밋을 무시합니다. 이 푸시 규칙이 활성화되면, GitLab 자체에서 생성된 커밋이 있을 경우 서명이 없는 커밋이 커밋 히스토리에 여전히 나타날 수 있습니다. 예상대로, GitLab 외부에서 생성되어 저장소에 푸시된 커밋은 거부됩니다. 이 문제에 대한 추가 정보는 문제 #19185를 읽어보세요.

모든 프로젝트에 대한 대량 업데이트 푸시 규칙

모든 프로젝트에 대해 푸시 규칙을 동일하게 업데이트하려면,

Rails 콘솔을 사용하거나,

푸시 규칙 API 엔드포인트를 사용하여 각 프로젝트를 업데이트하는 스크립트를 작성하세요.

예를 들어, 커밋 작성자가 GitLab 사용자인지 확인사용자가 git push로 Git 태그를 제거하는 것을 허용하지 않음 체크박스를 활성화하고 레일즈 콘솔을 통해 특정 이메일 도메인에서만 커밋을 허용하는 필터를 생성하려면:

경고:

데이터를 변경하는 명령은 올바르게 실행되지 않거나 적절한 조건에서 실행되지 않으면 손상을 초래할 수 있습니다. 항상 테스트 환경에서 먼저 명령을 실행하고 복원할 준비가 된 백업 인스턴스를 준비하십시오.

Project.find_each do |p|
  pr = p.push_rule || PushRule.new(project: p)
  # 커밋 작성자가 GitLab 사용자인지 확인
  pr.member_check = true
  # 사용자가 `git push`로 Git 태그를 제거하는 것을 허용하지 않음
  pr.deny_delete_tag = true
  # 커밋 작성자의 이메일
  pr.author_email_regex = '@domain\.com$'
  pr.save!
end