GitLab CI/CD 인스턴스 구성
GitLab 관리자는 자신의 인스턴스에 대한 GitLab CI/CD 구성을 관리할 수 있습니다.
새 프로젝트에서 GitLab CI/CD 비활성화
GitLab CI/CD는 기본적으로 인스턴스의 모든 새 프로젝트에서 활성화됩니다. 새 프로젝트에서 CI/CD를 기본적으로 비활성화하려면 다음과 같이 설정을 수정할 수 있습니다.
- 오프라인 설치의 경우
gitlab.yml
. - Linux 패키지 설치의 경우
gitlab.rb
.
이미 CI/CD가 활성화된 기존 프로젝트는 변경되지 않습니다. 또한 이 설정은 프로젝트 기본 설정만 변경하므로 프로젝트 소유자는 여전히 프로젝트 설정에서 CI/CD를 활성화할 수 있습니다: CI/CD 파이프라인 비활성화.
오프라인 설치의 경우:
-
에디터로
gitlab.yml
을 열고builds
를false
로 설정합니다:## Default project features settings default_projects_features: issues: true merge_requests: true wiki: true snippets: false builds: false
-
gitlab.yml
파일을 저장합니다. -
GitLab을 재시작합니다:
sudo service gitlab restart
Linux 패키지 설치의 경우:
-
/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 관리자는 GitLab Rails 콘솔에 액세스하여 사용자 정의 한도를 선택할 수 있습니다. 예를 들어, 한도를 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 * * *
(매일 00:00
및 12:00
)로 설정합니다.
재해 복구
지속적인 다운타임 중 데이터베이스에 가해지는 부하를 줄이기 위해 애플리케이션의 중요하지만 계산적으로 비싼 부분을 비활성화할 수 있습니다.
인스턴스 러너에서 공정 스케줄링 비활성화
대량의 작업 대기열을 지울 때 임시로 ci_queueing_disaster_recovery_disable_fair_scheduling
기능 플래그를 활성화할 수 있습니다. 이 플래그는 인스턴스 러너에서 공정 스케줄링을 비활성화하여 jobs/request
엔드포인트의 시스템 리소스 사용량을 줄입니다.
활성화되면 작업은 시스템에 넣은 순서대로 처리되며 여러 프로젝트 사이에 균형있게 분산되지 않습니다.
계산 할당량 강제 비활성화
인스턴스 러너에서 계산 할당량 강제 적용을 비활성화하려면 임시로 ci_queueing_disaster_recovery_disable_quota
기능 플래그를 활성화할 수 있습니다. 이 플래그는 jobs/request
엔드포인트의 시스템 리소스 사용량을 줄입니다.
활성화되면 지난 1시간 동안 생성된 작업은 할당량을 초과한 프로젝트에서 실행할 수 있습니다. 이전 작업은 주기적인 백그라운드 워커(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
러너 등록 토큰 획득
경고: 새로운 러너 등록 흐름으로의 이동이 deprecated되었으며 향후 GitLab 18.0에서 제거될 예정입니다. 러너 인증 토큰을 사용해야 합니다. 자세한 내용은 새 러너 등록 흐름으로 마이그레이션을 참조하십시오.
전제 조건: - 러너 등록 토큰은 관리자 영역에서 활성화되어 있어야 합니다.
Gitlab::CurrentSettings.current_application_settings.runners_registration_token
시드 러너 등록 토큰
경고: 런너 등록 토큰을 전달하고 특정 구성 매개변수를 지원하는 기능이 GitLab 15.6에서 폐기되었으며, GitLab 18.0에서 제거될 예정입니다. 러너 인증 토큰을 대신 사용해야 합니다. 자세한 정보는 새 러너 등록 워크플로우로의 이주를 참조하세요.
appSetting = Gitlab::CurrentSettings.current_application_settings
appSetting.set_runners_registration_token('<new-runners-registration-token>')
appSetting.save!
파이프라인 스케줄 수동 실행
레일즈 콘솔을 통해 파이프라인 스케줄을 수동으로 실행하여 일반적으로 보이지 않는 오류를 확인할 수 있습니다.
# 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)