GitLab CI/CD 인스턴스 구성

Tier: Free, Premium, Ultimate Offering: Self-managed

GitLab 관리자는 자신의 인스턴스에 대한 GitLab CI/CD 구성을 관리할 수 있습니다.

새로운 프로젝트에서 GitLab CI/CD 비활성화

GitLab CI/CD는 모든 새로운 프로젝트에서 기본적으로 활성화되어 있습니다.
새로운 프로젝트의 경우 기본적으로 CI/CD가 비활성화되도록 설정하려면 다음의 설정을 수정하면 됩니다:

  • 자체 컴파일한 설치의 경우 gitlab.yml.
  • 리눅스 패키지 설치의 경우 gitlab.rb.

이미 CI/CD가 활성화된 기존 프로젝트는 변경되지 않습니다.
또한, 이 설정은 프로젝트 기본값만 변경하므로 프로젝트 소유자는 프로젝트 설정에서 CI/CD를 여전히 활성화할 수 있습니다.

자체 컴파일한 설치의 경우:

  1. 편집기로 gitlab.yml을 열고 buildsfalse로 설정합니다:

    ## 기본 프로젝트 기능 설정
    default_projects_features:
      issues: true
      merge_requests: true
      wiki: true
      snippets: false
      builds: false
    
  2. gitlab.yml 파일을 저장합니다.

  3. GitLab을 재시작합니다:

    sudo service gitlab restart
    

리눅스 패키지 설치의 경우:

  1. /etc/gitlab/gitlab.rb를 편집하고 다음 줄을 추가합니다:

    gitlab_rails['gitlab_default_projects_features_builds'] = false
    
  2. /etc/gitlab/gitlab.rb 파일을 저장합니다.

  3. GitLab을 재구성합니다:

    sudo gitlab-ctl reconfigure
    

needs 작업 한도 설정

Tier: Free, Premium, Ultimate Offering: Self-managed

needs에서 정의될 수 있는 작업의 최대 수는 기본적으로 50으로 설정되어 있습니다.

GitLab Rails 콘솔에 접근할 수 있는 GitLab 관리자는 사용자 정의 한도를 선택할 수 있습니다. 예를 들어, 한도를 100으로 설정하려면:

Plan.default.actual_limits.update!(ci_needs_size_limit: 100)

needs 종속성을 비활성화하려면 한도를 0으로 설정합니다.
needs를 사용하려고 구성된 작업이 있는 파이프라인은 오류 job can only need 0 others를 반환합니다.

최대 예약된 파이프라인 빈도 변경

예약된 파이프라인은 모든 cron 값으로 구성할 수 있지만, 항상 정확히 예약된 시간에 실행되지는 않습니다.
내부 프로세스인 _파이프라인 스케줄 작업자_는 모든 예약된 파이프라인을 큐에 추가하지만, 지속적으로 실행되지는 않습니다.
작업자는 자체 일정을 따르며, 시작할 준비가 된 예약된 파이프라인은 작업자가 다음 번에 실행될 때만 큐에 추가됩니다.
예약된 파이프라인은 작업자보다 더 자주 실행될 수 없습니다.

파이프라인 스케줄 작업자의 기본 빈도는 3-59/10 * * * * (매 10분, 0:03, 0:13, 0:23 등에서 시작)입니다.
GitLab.com의 기본 빈도는 GitLab.com 설정에서 확인할 수 있습니다.

파이프라인 스케줄 작업자의 빈도를 변경하려면:

  1. 인스턴스의 gitlab.rb 파일에서 gitlab_rails['pipeline_schedule_worker_cron'] 값을 편집합니다.
  2. 변경 사항이 적용되도록 GitLab을 재구성합니다.

예를 들어, 파이프라인의 최대 빈도를 하루에 두 번으로 설정하려면 pipeline_schedule_worker_cron0 */12 * * *의 cron 값으로 설정합니다 (00:0012:00 매일).

재해 복구

진행 중인 다운타임 동안 데이터베이스의 부담을 덜기 위해 애플리케이션의 일부 중요하지만 계산적으로 비용이 많이 드는 부분을 비활성화할 수 있습니다.

인스턴스 러너에서 공정한 스케줄링 비활성화

대량의 작업을 정리할 때 ci_queueing_disaster_recovery_disable_fair_scheduling 기능 플래그를 일시적으로 활성화할 수 있습니다. 이 플래그는 인스턴스 러너에서 공정한 스케줄링을 비활성화하여 jobs/request 엔드포인트에서 시스템 리소스 사용량을 줄입니다.

활성화되면, 작업은 시스템에 추가된 순서대로 처리되며 여러 프로젝트 간에 균형을 맞추지 않습니다.

계산 쿼터 집행 비활성화

인스턴스 러너에서 계산 쿼터 집행을 비활성화하려면 ci_queueing_disaster_recovery_disable_quota 기능 플래그를 일시적으로 활성화할 수 있습니다. 이 플래그는 jobs/request 엔드포인트에서 시스템 리소스 사용량을 줄입니다.

활성화되면, 지난 한 시간 동안 생성된 작업은 쿼터가 소진된 프로젝트에서도 실행될 수 있습니다. 이전 작업은 이미 주기적인 백그라운드 작업자(StuckCiJobsWorker)에 의해 취소되었습니다.

CI/CD 문제 해결 Rails 콘솔 명령

다음 명령은 Rails 콘솔에서 실행됩니다.

경고:
데이터를 직접 변경하는 모든 명령은 올바른 조건에서 실행되지 않으면 손상을 초래할 수 있습니다.
백업이 준비된 테스트 환경에서 실행할 것을 강력히 권장합니다.

정체된 대기 파이프라인 취소

project = Project.find_by_full_path('<project_path>')
Ci::Pipeline.where(project_id: project.id).where(status: 'pending').count
Ci::Pipeline.where(project_id: project.id).where(status: 'pending').each {|p| p.cancel if p.stuck?}
Ci::Pipeline.where(project_id: project.id).where(status: 'pending').count

병합 요청 통합 시도

project = Project.find_by_full_path('<project_path>')
mr = project.merge_requests.find_by(iid: <merge_request_iid>)
mr.project.try(:ci_integration)

.gitlab-ci.yml 파일 검증

project = Project.find_by_full_path('<project_path>')
content = p.ci_config_for(project.repository.root_ref_sha)
Gitlab::Ci::Lint.new(project: project,  current_user: User.first).validate(content)

기존 프로젝트에서 AutoDevOps 비활성화

Project.all.each do |p|
  p.auto_devops_attributes={"enabled"=>"0"}
  p.save
end

러너 등록 토큰 얻기

경고:
러너 등록 토큰을 전달할 수 있는 기능과 특정 구성 인수에 대한 지원은 제거 예정이며 GitLab 15.6에서 deprecated 되었고 GitLab 18.0에서 제거될 예정입니다. 대신 러너 인증 토큰을 사용해야 합니다.
자세한 내용은 새 러너 등록 워크플로우로 마이그레이션을 참조하세요.

사전 요구 사항:

Gitlab::CurrentSettings.current_application_settings.runners_registration_token

러너 등록 토큰 시드

경고:
러너 등록 토큰을 전달할 수 있는 기능과 특정 구성 인수에 대한 지원은 제거 예정이며 GitLab 15.6에서 deprecated 되었고 GitLab 18.0에서 제거될 예정입니다. 대신 러너 인증 토큰을 사용해야 합니다.
자세한 내용은 새 러너 등록 워크플로우로 마이그레이션을 참조하세요.

appSetting = Gitlab::CurrentSettings.current_application_settings
appSetting.set_runners_registration_token('<new-runners-registration-token>')
appSetting.save!

파이프라인 스케줄 수동 실행

파이프라인 스케줄은 Rails 콘솔을 통해 수동으로 실행하여 일반적으로 보이지 않는 오류를 드러낼 수 있습니다.

# schedule_id는 파이프라인 스케줄 편집 페이지에서 얻을 수 있습니다.
schedule = Ci::PipelineSchedule.find_by(id: <schedule_id>)

# 스케줄을 실행할 사용자를 선택합니다.
user = User.find_by_username('<username>')

# 스케줄을 실행합니다.
ps = Ci::CreatePipelineService.new(schedule.project, user, ref: schedule.ref).execute!(:schedule, ignore_skip_ci: true, save_on_errors: false, schedule: schedule)