GitLab CI/CD 인스턴스 구성
GitLab 관리자는 자신의 인스턴스에 대한 GitLab CI/CD 구성을 관리할 수 있습니다.
새로운 프로젝트에서 GitLab CI/CD 비활성화
GitLab CI/CD는 모든 새로운 프로젝트에서 기본적으로 활성화되어 있습니다.
새로운 프로젝트의 경우 기본적으로 CI/CD가 비활성화되도록 설정하려면 다음의 설정을 수정하면 됩니다:
- 자체 컴파일한 설치의 경우
gitlab.yml
. - 리눅스 패키지 설치의 경우
gitlab.rb
.
이미 CI/CD가 활성화된 기존 프로젝트는 변경되지 않습니다.
또한, 이 설정은 프로젝트 기본값만 변경하므로 프로젝트 소유자는 프로젝트 설정에서 CI/CD를 여전히 활성화할 수 있습니다.
자체 컴파일한 설치의 경우:
-
편집기로
gitlab.yml
을 열고builds
를false
로 설정합니다:## 기본 프로젝트 기능 설정 default_projects_features: issues: true merge_requests: true wiki: true snippets: false builds: false
-
gitlab.yml
파일을 저장합니다. -
GitLab을 재시작합니다:
sudo service gitlab restart
리눅스 패키지 설치의 경우:
-
/etc/gitlab/gitlab.rb
를 편집하고 다음 줄을 추가합니다:gitlab_rails['gitlab_default_projects_features_builds'] = false
-
/etc/gitlab/gitlab.rb
파일을 저장합니다. -
GitLab을 재구성합니다:
sudo gitlab-ctl reconfigure
needs
작업 한도 설정
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 설정에서 확인할 수 있습니다.
파이프라인 스케줄 작업자의 빈도를 변경하려면:
- 인스턴스의
gitlab.rb
파일에서gitlab_rails['pipeline_schedule_worker_cron']
값을 편집합니다. - 변경 사항이 적용되도록 GitLab을 재구성합니다.
예를 들어, 파이프라인의 최대 빈도를 하루에 두 번으로 설정하려면 pipeline_schedule_worker_cron
을 0 */12 * * *
의 cron 값으로 설정합니다 (00:00
과 12: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)