고급 구성

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed

GitLab Runner 및 개별 등록된 runner의 동작을 변경하려면 config.toml 파일을 수정하세요.

config.toml 파일은 다음 위치에 있습니다.

  • 루트로 GitLab Runner가 실행될 때 *nix 시스템의 /etc/gitlab-runner/. 해당 디렉터리는 또한 서비스 구성의 경로입니다.
  • *nix 시스템의 GitLab Runner가 루트로 실행될 때 ~/.gitlab-runner/.
  • 다른 시스템의 경우 ./.

대부분의 옵션을 변경할 때 GitLab Runner를 다시 시작할 필요가 없습니다. 이에는 [[runners]] 섹션의 매개변수 및 글로벌 섹션의 대부분의 매개변수가 포함됩니다(단, listen_address는 제외). 이미 등록된 runner의 경우 다시 등록할 필요가 없습니다.

GitLab Runner는 구성 수정을 3초마다 확인하고 필요한 경우 다시로드합니다. 또한 SIGHUP 시그널에 응답하여 구성을 다시로드합니다.

구성 유효성 검사

구성 유효성 검사는 config.toml 파일의 구조를 확인하는 프로세스입니다. 구성 유효성 검사기의 출력은 info 레벨 메시지만 제공합니다.

구성 유효성 검사 프로세스는 정보 목적으로만 사용됩니다. 해당 출력을 사용하여 runner 구성의 잠재적 문제를 식별할 수 있습니다. 그러나 구성 유효성 검사는 모든 가능한 문제를 잡아내지 못할 수 있으며, 메시지가 없다고 해서 config.toml 파일에 결함이 없다는 것을 보장하지 않습니다.

글로벌 섹션

이러한 설정은 전역적으로 적용됩니다. 모든 runner에 적용됩니다.

설정 설명
concurrent 등록된 모든 runner를 통해 동시에 실행될 수 있는 작업 수를 제한합니다. 각 [[runners]] 섹션은 해당 값에 대한 고유한 제한을 정의할 수 있지만, 이 값은 이러한 값의 합계에 대한 최대값을 설정합니다. 예를들어, 10이라는 값은 10개 이상의 작업이 동시에 실행되지 않음을 의미합니다. 0은 금지됩니다. 이 값은 사용하면 runner 프로세스가 중대한 오류로 종료됩니다. 이 설정이 Docker Machine, Instance, Docker Autoscaler 실행자와 어떻게 작동하는지 확인하세요.
log_level 로그 수준을 정의합니다. 옵션으로는 debug, info, warn, error, fatal, panic이 있습니다. 해당 설정은 커맨드 라인 인수 --debug, -l, 또는 --log-level로 설정한 수준보다 낮은 우선순위를 갖습니다.
log_format 로그 형식을 지정합니다. 옵션으로는 runner, text, json이 있습니다. 이 설정은 커맨드 라인 인수 --log-format으로 설정한 형식보다 낮은 우선순위를 갖습니다. 기본값은 ANSI 이스케이프 코드가 포함된 runner로, 색칠에 사용됩니다.
check_interval runner가 새로운 작업을 확인하는 간격 길이를 초 단위로 정의합니다. 기본값은 3입니다. 0 또는 그 이하로 설정하면 기본값이 사용됩니다.
sentry_dsn 모든 시스템 레벨 오류를 Sentry로 추적하는 것을 활성화합니다.
connection_max_age GitLab 서버와의 TLS keepalive 연결이 다시 연결되기 전에 열려 있을 수 있는 최대 기간을 정의합니다. 기본값은 15분을 의미하는 15m입니다. 0 또는 그 이하로 설정하면 연결이 가능한 한 오래 유지됩니다.
listen_address Prometheus 메트릭 HTTP 서버가 수신 대기해야 하는 주소(<호스트>:<포트>)를 정의합니다.
shutdown_timeout 강제 종료 작업이 타임아웃되고 프로세스를 종료하는데까지 걸리는 시간(초)을 정의합니다. 기본값은 30입니다. 0 또는 그 이하로 설정하면 기본값이 사용됩니다.

다음은 구성 예제입니다:

# `config.toml` 예제 파일 

concurrent = 100 # 이 `config.toml` 파일에서 정의된 모든 runner 섹션에 적용되는 작업 병렬성을 위한 전역 설정
log_level = "warning"
log_format = "info"
check_interval = 3 # 초 단위 값

[[runners]]
  name = "first"
  url = "Gitlab 인스턴스 URL (예: `https://gitlab.com`)"
  executor = "shell"
  (...)

[[runners]]
  name = "second"
  url = "Gitlab 인스턴스 URL (예: `https://gitlab.com`)"
  executor = "docker"
  (...)

[[runners]]
  name = "third"
  url = "Gitlab 인스턴스 URL (예: `https://gitlab.com`)"
  executor = "docker-autoscaler"
  (...)

log_format 예제 (일부)

runner

Runtime platform                                    arch=amd64 os=darwin pid=37300 revision=HEAD version=development version
Starting multi-runner from /etc/gitlab-runner/config.toml...  builds=0
WARNING: Running in user-mode.
WARNING: Use sudo for system-mode:
WARNING: $ sudo gitlab-runner...

Configuration loaded                                builds=0
listen_address not defined, metrics & debug endpoints disabled  builds=0
[session_server].listen_address not defined, session endpoints disabled  builds=0

text

INFO[0000] Runtime platform                              arch=amd64 os=darwin pid=37773 revision=HEAD version="development version"
INFO[0000] Starting multi-runner from /etc/gitlab-runner/config.toml...  builds=0
WARN[0000] Running in user-mode.
WARN[0000] Use sudo for system-mode:
WARN[0000] $ sudo gitlab-runner...
INFO[0000]
INFO[0000] Configuration loaded                          builds=0
INFO[0000] listen_address not defined, metrics & debug endpoints disabled  builds=0
INFO[0000] [session_server].listen_address not defined, session endpoints disabled  builds=0

json

{"arch":"amd64","level":"info","msg":"런타임 플랫폼","os":"darwin","pid":38229,"revision":"HEAD","time":"2020-06-05T15:57:35+02:00","version":"development version"}
{"builds":0,"level":"info","msg":"/etc/gitlab-runner/config.toml에서 멀티런너 시작 중...","time":"2020-06-05T15:57:35+02:00"}
{"level":"warning","msg":"사용자 모드로 실행 중.","time":"2020-06-05T15:57:35+02:00"}
{"level":"warning","msg":"시스템 모드를 위해 sudo를 사용하세요:","time":"2020-06-05T15:57:35+02:00"}
{"level":"warning","msg":"$ sudo gitlab-runner...","time":"2020-06-05T15:57:35+02:00"}
{"level":"info","msg":"","time":"2020-06-05T15:57:35+02:00"}
{"builds":0,"level":"info","msg":"구성이 로드되었습니다","time":"2020-06-05T15:57:35+02:00"}
{"builds":0,"level":"info","msg":"listen_address가 정의되지 않아 메트릭 및 디버그 엔드포인트가 비활성화되었습니다","time":"2020-06-05T15:57:35+02:00"}
{"builds":0,"level":"info","msg":"[session_server].listen_address가 정의되지 않아 세션 엔드포인트가 비활성화되었습니다","time":"2020-06-05T15:57:35+02:00"}

check_interval 작동 방식

만약 config.toml에 둘 이상의 [[runners]] 섹션이 있다면, GitLab Runner에는 GitLab Runner가 구성된 GitLab 인스턴스로 작업 요청을 지속적으로 스케줄링하는 루프가 포함되어 있습니다.

다음 예제에서는 check_interval이 10초이고 runner-1runner-2의 두 [[runners]] 섹션이 있습니다. GitLab Runner는 10초마다 요청을 보내고 5초간 일시 중단됩니다.

  1. check_interval 값 구하기 (10초).
  2. 러너 목록 가져오기 (runner-1, runner-2).
  3. 일시 중단 간격 계산하기 (10초 / 2 = 5초).
  4. 무한 루프 시작하기:
    1. runner-1의 작업 요청하기.
    2. 5초 동안 중단하기.
    3. runner-2의 작업 요청하기.
    4. 5초 동안 중단하기.
    5. 반복.

다음은 check_interval 구성 예제입니다:

# `config.toml` 파일 예시

concurrent = 100 # 이 `config.toml` 파일에 정의된 모든 러너 섹션에 적용되는 작업 동시성에 대한 전역 설정.
log_level = "warning"
log_format = "info"
check_interval = 10 # 초 단위의 값

[[runners]]
  name = "runner-1"
  url = "GitLab 인스턴스 URL(예: `https://gitlab.com`)"
  executor = "shell"
  (...)

[[runners]]
  name = "runner-2"
  url = "GitLab 인스턴스 URL(예: `https://gitlab.com`)"
  executor = "docker"
  (...)

이 예에서는 러너 프로세스로부터의 작업 요청이 5초마다 이루어집니다. 만약 runner-1runner-2가 동일한 GitLab 인스턴스에 연결되어 있다면, 이러한 러너에서 GitLab 인스턴스는 5초마다 새로운 요청을 받습니다.

runner-1에 대한 첫 번째와 두 번째 요청 사이에는 두 개의 중단 기간이 있습니다. 각 기간은 5초이므로, runner-1에 대한 연속적인 요청 사이에는 약 10초가 소요됩니다. runner-2에도 동일한 원리가 적용됩니다.

만약 이보다 더 많은 러너를 정의한다면, 중단 간격은 더 짧아집니다. 그러나 러너에 대한 요청은 다른 러너의 모든 요청과 그들의 중단 기간이 호출된 후에 재반복됩니다.

[session_server] 섹션

[session_server] 섹션을 통해 사용자는 예를 들어 대화형 웹 터미널에서 작업할 수 있습니다.

[session_server] 섹션은 러너별로가 아닌 루트 레벨에서 지정해야 합니다.

# 세션 서버 구성이 포함된 `config.toml` 파일 예시

concurrent = 100 # 이 `config.toml` 파일에 정의된 모든 러너 섹션에 적용되는 작업 동시성에 대한 전역 설정
log_level = "warning"
log_format = "info"
check_interval = 3 # 초 단위의 값

[session_server]
  listen_address = "[::]:8093" # 포트 `8093`에서 모든 사용 가능한 인터페이스로 수신 대기
  advertise_address = "runner-host-name.tld:8093"
  session_timeout = 1800

[session_server] 섹션을 구성할 때:

  • listen_addressadvertise_address에는 host:port 형식을 사용하세요. host는 IP 주소(127.0.0.1:8093) 또는 도메인(my-runner.example.com:8093)이어야 합니다. 러너는 안전한 연결을 위해 이 정보를 사용하여 TLS 인증서를 만듭니다.
  • 웹 브라우저가 advertise_address에 연결할 수 있는지 확인하세요. 라이브 세션은 웹 브라우저에 의해 초기화됩니다.
  • advertise_address가 공개 IP 주소인지 확인하세요. 이는 런타임 중인 경우 GitLab에 러너가 브라우저로부터 로컬 요청을 허용하는 어플리케이션 설정 활성화가 사전에 활성화되었는지 확인하세요.
설정 설명
listen_address 세션 서버의 내부 URL입니다.
advertise_address 세션 서버에 액세스하기 위한 URL입니다. GitLab Runner가 GitLab에 노출시킵니다. 정의되지 않은 경우 listen_address가 사용됩니다.
session_timeout 작업 완료 후 세션이 활성 상태를 유지할 수 있는 시간(초). 타임아웃은 작업을 완료하지 못하도록 차단합니다. 기본값은 1800 (30분)입니다.

세션 서버 및 터미널 지원을 비활성화하려면 [session_server] 섹션을 삭제하세요.

참고: 러너 인스턴스가 이미 실행 중인 경우, [session_server] 섹션의 변경 내용이 적용되려면 gitlab-runner restart를 실행해야 할 수 있습니다.

GitHub Runner 도커 이미지를 사용하는 경우, docker run 명령-p 8093:8093을 추가하여 포트 8093을 노출해야 합니다.

[[runners]] 섹션

[[runners]] 섹션은 하나의 러너를 정의합니다.

설정 설명
name 러너의 설명입니다. 정보 제공용입니다.
url GitLab 인스턴스 URL입니다.
token 러너의 인증 토큰으로, 러너 등록 시 얻습니다. 등록 토큰과 다름.
tls-ca-file HTTPS 사용 시, 피어를 확인하기 위한 인증서가 포함된 파일입니다. 자체 서명 인증서 또는 사용자 정의 인증 기관 문서를 참조하세요.
tls-cert-file HTTPS 사용 시, 피어와의 인증을 위한 인증서가 포함된 파일입니다.
tls-key-file HTTPS 사용 시, 피어와의 인증을 위한 개인 키가 포함된 파일입니다.
limit 등록된 러너가 동시에 처리할 수 있는 작업 수를 제한합니다. 0(기본값)은 제한하지 않음을 의미합니다. Docker Machine, Instance, Docker Autoscaler 실행기와 함께 이 설정이 작동하는 방식을 확인하세요.
executor 러너가 CI/CD 작업을 실행하는 데 사용하는 호스트 운영 체제의 환경 또는 명령 처리기입니다. 자세한 내용은 executors를 참조하세요.
shell 스크립트를 생성하는 셸의 이름입니다. 기본값은 플랫폼에 따라 다릅니다.
builds_dir 선택한 실행기의 문맥에서 빌드가 저장된 디렉터리의 절대 경로입니다. 예: 로컬, Docker, 또는 SSH.
cache_dir 선택한 실행기의 문맥에서 빌드 캐시가 저장된 디렉터리의 절대 경로입니다. 예: 로컬, Docker, 또는 SSH. docker 실행기를 사용하는 경우, 이 디렉터리는 volumes 매개변수에 포함되어야 합니다.
environment 환경 변수를 추가하거나 덮어씁니다.
request_concurrency GitLab으로부터의 새 작업에 대한 동시 요청 수를 제한합니다. 기본값은 1입니다.
output_limit 킬로바이트 단위의 최대 빌드 로그 크기입니다. 기본값은 4096(4MB)입니다.
pre_get_sources_script Git 리포지토리 및 서브모듈을 업데이트하기 전에 러너에서 실행할 명령입니다. 첫 번째로 Git 클라이언트 구성을 조정하는 데 사용합니다. 여러 명령을 삽입하려면 (셋으로 묶여 있는) 여러 줄 문자 또는 \n 문자를 사용하세요.
post_get_sources_script Git 리포지토리 및 서브모듈을 업데이트한 후에 러너에서 실행할 명령입니다. 여러 명령을 삽입하려면 (셋으로 묶여 있는) 여러 줄 문자 또는 \n 문자를 사용하세요.
pre_build_script 작업을 실행하기 전에 러너에서 실행할 명령입니다. 여러 명령을 삽입하려면 (셋으로 묶여 있는) 여러 줄 문자 또는 \n 문자를 사용하세요.
post_build_script 작업을 실행한 직후에 러너에서 실행할 명령입니다. 다만 after_script를 실행하기 전입니다. 여러 명령을 삽입하려면 (셋으로 묶여 있는) 여러 줄 문자 또는 \n 문자를 사용하세요.
clone_url GitLab 인스턴스의 URL을 덮어씁니다. 러너가 GitLab URL에 연결할 수 없는 경우에만 사용됩니다.
debug_trace_disabled 디버그 추적을 비활성화합니다. true로 설정하면 디버그 로그(추적)는 CI_DEBUG_TRACEtrue로 설정되어 있는 경우에도 비활성화된 상태로 유지됩니다.
referees 작업 모니터링 결과를 작업 아티팩트로 GitLab에 전달하는 추가 작업 모니터링 워커입니다.
unhealthy_requests_limit 러너 워커가 비활성화될 새 작업 요청에 대한 unhealthy 응답 수입니다.
unhealthy_interval 비활성화된 러너 워커의 기간은 unhealthy 요청 제한을 초과한 후에 유효합니다. ‘3600초’, ‘1시간30분’ 등과 같은 구문을 지원합니다.

예시:

[[runners]]
  name = "ruby-3.3-docker"
  url = "https://CI/"
  token = "TOKEN"
  limit = 0
  executor = "docker"
  builds_dir = ""
  shell = ""
  environment = ["ENV=value", "LC_ALL=en_US.UTF-8"]
  clone_url = "http://gitlab.example.local"

clone_url 작동 방법

러너가 사용할 수 없는 URL에서 GitLab 인스턴스가 사용 가능한 경우, clone_url을 구성할 수 있습니다.

예를 들어 방화벽이 러너가 URL에 도달하는 것을 막을 수 있습니다. 러너가 192.168.1.23의 노드에 접근할 수 있는 경우, clone_urlhttp://192.168.1.23로 설정하세요.

clone_url이 설정되면, 러너는 http://gitlab-ci-token:s3cr3tt0k3n@192.168.1.23/namespace/project.git 형식의 복제 URL을 구성합니다.

참고: clone_url은 Git LFS 엔드포인트에 영향을 주지 않습니다.

Git LFS 엔드포인트 수정

Git LFS 엔드포인트를 수정하려면 다음 파일 중 하나에 pre_get_sources_script을 설정하세요:

  • config.toml:

    pre_get_sources_script = "mkdir -p $RUNNER_TEMP_PROJECT_DIR/git-template; git config -f $RUNNER_TEMP_PROJECT_DIR/git-template/config lfs.url https://<alternative-endpoint>"
    
  • .gitlab-ci.yml:

    default:
      hooks:
        pre_get_sources_script:
          - mkdir -p $RUNNER_TEMP_PROJECT_DIR/git-template
          - git config -f $RUNNER_TEMP_PROJECT_DIR/git-template/config lfs.url https://localhost
    

unhealthy_requests_limitunhealthy_interval 동작 방식

GitLab 인스턴스가 장기간 사용 불가능한 경우(예: 버전 업그레이드 중), 해당 인스턴스에 구성된 러너는 유휴 상태가되어 GitLab 인스턴스가 다시 사용 가능한 후 30-60 분 동안 작업 처리를 다시 시작하지 않습니다.

러너가 유휴 상태로 있게하는 기간을 늘리거나 줄이려면 unhealthy_interval 설정을 변경하십시오.

GitLab 서버에 연결을 시도하는 횟수 및 유효하지 않은 대기 후 유휴 상태가 되기 전의 러너 횟수를 변경하려면 unhealthy_requests_limit 설정을 변경하십시오. 자세한 내용은 check_interval 동작 방식을 참조하십시오.

실행자들

다음 실행자들을 사용할 수 있습니다.

실행자 필수 구성 작업 실행 위치
shell   로컬 셸. 기본 실행자.
docker [runners.docker]Docker Engine Docker 컨테이너.
docker-windows [runners.docker]Docker Engine Windows Docker 컨테이너.
ssh [runners.ssh] 원격으로 SSH.
parallels [runners.parallels][runners.ssh] Parallels VM, 그러나 SSH로 연결.
virtualbox [runners.virtualbox][runners.ssh] VirtualBox VM, 그러나 SSH로 연결.
docker+machine [runners.docker][runners.machine] docker와 유사하지만 자동 확장 Docker machines를 사용합니다.
kubernetes [runners.kubernetes] Kubernetes pods.
docker-autoscaler [docker-autoscaler][runners.autoscaler] docker와 유사하지만 자동으로 조절되는 인스턴스를 사용하여 CI/CD 작업을 컨테이너에서 실행합니다.
instance [docker-autoscaler][runners.autoscaler] shell과 유사하지만, 호스트 인스턴스에서 CI/CD 작업을 직접 실행할 수 있도록 자동으로 조절되는 인스턴스를 사용합니다.

셸들

셸 실행자를 사용하도록 구성된 경우, CI/CD 작업은 호스트 머신에서 로컬로 실행됩니다. 지원되는 운영 체제 셸은 다음과 같습니다:

설명
bash Bash (Bourne 셸) 스크립트를 생성합니다. 모든 명령은 Bash 컨텍스트에서 실행됩니다. 모든 유닉스 시스템의 기본값입니다.
sh Sh (Bourne 셸) 스크립트를 생성합니다. 모든 명령은 Sh 컨텍스트에서 실행됩니다. 모든 유닉스 시스템에서는 bash의 대체가 됩니다.
powershell PowerShell 스크립트를 생성합니다. 모든 명령은 PowerShell 데스크톱 컨텍스트에서 실행됩니다. GitLab Runner 12.0-13.12에서는 Windows의 기본값입니다.
pwsh PowerShell 스크립트를 생성합니다. 모든 명령은 PowerShell Core 컨텍스트에서 실행됩니다. GitLab Runner 14.0 및 이후 버전에서는 Windows의 기본값입니다.

shell 옵션을 bash 또는 sh로 설정한 경우, Bash의 ANSI-C quoting이 작업 스크립트를 셸 이스케이핑하는 데 사용됩니다.

POSIX 준수 셸 사용

GitLab Runner 14.9 이상에서 기능 플래그를 활성화하여 FF_POSIXLY_CORRECT_ESCAPES로 설정하여 POSIX 준수 셸(dash와 같은)을 사용할 수 있습니다. 활성화된 경우, POSIX 준수 셸 이스케이핑 메커니즘이 사용됩니다.

[runners.docker] 섹션

다음 설정은 Docker 실행자로 구성된 경우 Docker 컨테이너 매개변수를 정의합니다.

Docker-in-Docker를 서비스로 사용하거나 작업 내부에 구성된 컨테이너 실행 시 이러한 매개변수가 상속되지 않습니다.

매개변수 설명
allowed_images .gitlab-ci.yml 파일에서 지정할 수 있는 이미지의 와일드카드 목록입니다. 없으면 모든 이미지가 허용됩니다(["*/*:*"]와 동일함). Docker 또는 Kubernetes 실행자와 함께 사용합니다.
allowed_privileged_images privileged가 활성화되면 특권 모드로 실행되는 allowed_images의 와일드카드 하위 집합입니다. 없으면 모든 이미지가 허용됩니다(["*/*:*"]와 동일함). Docker 실행자와 함께 사용합니다.
allowed_pull_policies .gitlab-ci.yml 파일이나 config.toml 파일에서 지정할 수 있는 풀 정책의 목록입니다. 지정되지 않으면 pull-policy에서 지정된 풀 정책만 허용됩니다. Docker 실행자와 함께 사용합니다.
allowed_services .gitlab-ci.yml 파일에서 지정할 수 있는 서비스의 와일드카드 목록입니다. 없으면 모든 이미지가 허용됩니다(["*/*:*"]와 동일함). Docker 또는 Kubernetes 실행자와 함께 사용합니다.
allowed_privileged_services privileged 또는 services_privileged이 활성화되면 특권 모드로 실행되는 allowed_services의 와일드카드 하위 집합입니다. 없으면 모든 이미지가 허용됩니다(["*/*:*"]와 동일함). Docker 실행자와 함께 사용합니다.
cache_dir 도커 캐시를 저장할 디렉토리입니다. 이 경로는 현재 작업 디렉토리의 절대 경로 또는 상대 경로일 수 있습니다. 더 많은 정보는 disable_cache를 참조하십시오.
cap_add 컨테이너에 추가 Linux 기능을 추가합니다.
cap_drop 컨테이너에서 추가 Linux 기능을 삭제합니다.
cpuset_cpus 컨트롤 그룹의 CpusetCpus입니다. 문자열입니다.
cpuset_mems 컨트롤 그룹의 CpusetMems입니다. 문자열입니다.
cpu_shares 상대 CPU 사용량을 설정하는 데 사용되는 CPU 공유의 수입니다. 기본값은 1024입니다.
cpus CPU의 개수(Docker 1.13 이상에서 사용 가능). 문자열입니다.
devices 컨테이너와 추가 호스트 장치를 공유합니다.
device_cgroup_rules 사용자 정의 장치 cgroup 규칙입니다(Docker 1.28 이상에서 사용 가능).
disable_cache Docker 실행자에는 전역 캐시(다른 실행자와 마찬가지로)와 Docker 볼륨에 기반한 로컬 캐시가 두 가지 수준이 있습니다. 이 구성 플래그는 로컬 캐시의 사용을 비활성화합니다. 즉, 임시 파일을 보관하는 컨테이너 생성을 비활성화합니다(분산 캐시 모드에서 실행자가 설정된 경우 캐시가 비활성화되지 않음에 유의하십시오).
disable_entrypoint_overwrite 이미지 진입점 덮어쓰기를 비활성화합니다.
dns 컨테이너에서 사용할 DNS 서버 목록입니다.
dns_search DNS 검색 도메인 목록입니다.
extra_hosts 컨테이너 환경에 정의해야 하는 호스트입니다.
gpus Docker 컨테이너의 GPU 장치입니다. docker CLI와 동일한 형식을 사용합니다. 자세한 내용은 Docker 문서를 참조하십시오.
group_add 컨테이너 프로세스가 실행될 추가 그룹을 추가합니다.
helper_image (고급) 저장소를 복제하고 아티팩트를 업로드하는 데 사용되는 기본 도우미 이미지입니다.
helper_image_flavor 도우미 이미지 버전(alpine, alpine3.16, alpine3.17, alpine3.18, alpine3.19, alpine-latest, ubi-fips, ubuntu)를 설정합니다. 기본값은 alpine입니다. alpine 버전은 alpine3.19와 동일합니다.
helper_image_autoset_arch_and_os 기본 OS를 사용하여 도우미 이미지 ARCH 및 OS를 설정합니다.
host 사용자 정의 Docker 엔드포인트입니다. 기본값은 DOCKER_HOST 환경 또는 unix:///var/run/docker.sock입니다.
hostname 컨테이너의 사용자 정의 호스트 이름입니다.
image 작업을 실행하는 이미지입니다.
links 작업을 실행하는 컨테이너와 연결해야 하는 컨테이너입니다.
memory 메모리 제한입니다. 문자열입니다.
memory_swap 총 메모리 제한입니다. 문자열입니다.
memory_reservation 메모리 소프트 제한입니다. 문자열입니다.

[[runners.docker.services]] 섹션

작업과 함께 실행할 추가적인 서비스를 지정합니다. 사용 가능한 이미지 목록은 Docker Registry를 참조하십시오. 각 서비스는 별도의 컨테이너에서 실행되며 해당 작업과 연결됩니다.

매개변수 설명
name 서비스로 실행할 이미지의 이름입니다.
alias 해당 서비스에 액세스하는 데 사용할 수 있는 추가 별칭 이름입니다.
entrypoint 해당 컨테이너의 엔트리포인트로 실행해야 하는 명령 또는 스크립트입니다. 이 문법은 Dockerfile의 ENTRYPOINT 지시문과 유사하며 각 쉘 토큰이 배열의 별도의 문자열입니다. GitLab Runner 13.6에서 도입되었습니다.
command 컨테이너의 명령 또는 스크립트로 사용해야 하는 명령입니다. 이 문법은 Dockerfile의 CMD 지시문과 유사하며 각 쉘 토큰이 배열의 별도의 문자열입니다. GitLab Runner 13.6에서 도입되었습니다.
environment 서비스 컨테이너에 대한 환경 변수를 추가하거나 덮어씁니다.

예시:

[runners.docker]
  host = ""
  hostname = ""
  tls_cert_path = "/Users/ayufan/.boot2docker/certs"
  image = "ruby:3.3"
  memory = "128m"
  memory_swap = "256m"
  memory_reservation = "64m"
  oom_kill_disable = false
  cpuset_cpus = "0,1"
  cpuset_mems = "0,1"
  cpus = "2"
  dns = ["8.8.8.8"]
  dns_search = [""]
  service_memory = "128m"
  service_memory_swap = "256m"
  service_memory_reservation = "64m"
  service_cpuset_cpus = "0,1"
  service_cpus = "2"
  services_limit = 5
  privileged = false
  group_add = ["docker"]
  userns_mode = "host"
  cap_add = ["NET_ADMIN"]
  cap_drop = ["DAC_OVERRIDE"]
  devices = ["/dev/net/tun"]
  disable_cache = false
  wait_for_services_timeout = 30
  cache_dir = ""
  volumes = ["/data", "/home/project/cache"]
  extra_hosts = ["other-host:127.0.0.1"]
  shm_size = 300000
  volumes_from = ["storage_container:ro"]
  links = ["mysql_container:mysql"]
  allowed_images = ["ruby:*", "python:*", "php:*"]
  allowed_services = ["postgres:9", "redis:*", "mysql:*"]
  [runners.docker.ulimit]
    "rtprio" = "99"
  [[runners.docker.services]]
    name = "registry.example.com/svc1"
    alias = "svc1"
    entrypoint = ["entrypoint.sh"]
    command = ["executable","param1","param2"]
    environment = ["ENV1=value1", "ENV2=value2"]
  [[runners.docker.services]]
    name = "redis:2.8"
    alias = "cache"
  [[runners.docker.services]]
    name = "postgres:9"
    alias = "postgres-db"
  [runners.docker.sysctls]
    "net.ipv4.ip_forward" = "1"

[runners.docker] 섹션에서의 볼륨

볼륨에 대한 자세한 정보는 Docker 문서를 참조하십시오.

다음 예시에서는 [runners.docker] 섹션에서 볼륨을 지정하는 방법을 보여줍니다.

예시 1: 데이터 볼륨 추가

데이터 볼륨은 유니언 파일 시스템을 우회하며 하나 이상의 컨테이너 내에서 특별히 지정된 디렉토리로, 컨테이너의 수명 주기와 독립적으로 데이터를 유지할 수 있도록 설계되었습니다.

[runners.docker]
  host = ""
  hostname = ""
  tls_cert_path = "/Users/ayufan/.boot2docker/certs"
  image = "ruby:3.3"
  privileged = false
  disable_cache = true
  volumes = ["/path/to/volume/in/container"]

이 예시에서는 컨테이너 내의 /path/to/volume/in/container에 새 볼륨을 생성합니다.

예시 2: 호스트 디렉토리를 데이터 볼륨으로 마운트

컨테이너 외부에 디렉토리를 저장하려면 Docker 데몬 호스트의 디렉토리를 컨테이너에 마운트할 수 있습니다.

[runners.docker]
  host = ""
  hostname = ""
  tls_cert_path = "/Users/ayufan/.boot2docker/certs"
  image = "ruby:3.3"
  privileged = false
  disable_cache = true
  volumes = ["/path/to/bind/from/host:/path/to/bind/in/container:rw"]

이 예시에서는 /path/to/bind/from/host를 CI/CD 호스트의 컨테이너 내의 /path/to/bind/in/container에 사용합니다.

GitLab Runner 11.11부터는 정의된 [서비스](https://docs.gitlab.com/ee/ci/services/)에 대해 호스트 디렉토리를 마운트합니다.

사설 컨테이너 레지스트리 사용

작업에 사용할 이미지의 원본으로 사설 레지스트리를 사용하려면 CI/CD 변수 DOCKER_AUTH_CONFIG를 사용하여 권한을 구성하십시오. 다음 중 하나에 변수를 설정할 수 있습니다:

  • 프로젝트의 CI/CD 설정에서 file 타입
  • config.toml 파일

if-not-present 풀 정책으로 사설 레지스트리를 사용하는 것은 보안 문제를 도입할 수 있습니다. 풀 정책이 작동하는 방법에 대한 자세한 내용은 런너가 이미지를 끌어오는 방법 구성을 참조하십시오.

사설 컨테이너 레지스트리 사용에 대한 자세한 내용은 다음을 참조하십시오:

런너가 수행하는 단계는 다음과 같습니다:

  1. 이미지 이름에서 레지스트리 이름을 찾습니다.
  2. 값이 비어 있지 않으면 실행기는 해당 레지스트리에 대한 인증 구성을 검색합니다.
  3. 마지막으로, 지정된 레지스트리에 해당하는 인증이 찾으면 후속 풀은 그것을 사용합니다.

GitLab 통합 레지스트리 지원

GitLab은 작업 데이터와 함께 통합 레지스트리용 자격 증명을 보냅니다. 이러한 자격 증명은 자동으로 레지스트리의 권한 부여 매개변수 목록에 추가됩니다.

이 단계 후에 레지스트리 인증은 DOCKER_AUTH_CONFIG 변수로 추가된 구성과 유사하게 진행됩니다.

작업에서 GitLab 통합 레지스트리에서는 이미지를 비공개 또는 보호된 이미지라도 사용할 수 있습니다. 작업이 액세스할 수 있는 이미지에 대한 자세한 내용은 CI/CD 작업 토큰 설명서를 참조하세요.

Docker 인증 우선 순위 결정

이전에 설명했듯이, GitLab Runner는 다양한 방법으로 Docker를 레지스트리에 대해 인증할 수 있습니다. 적절한 레지스트리를 찾기 위해 다음 우선 순위가 고려됩니다:

  1. DOCKER_AUTH_CONFIG로 구성된 자격 증명.
  2. ~/.docker/config.json 또는 ~/.dockercfg 파일에 로컬로 구성된 자격 증명 (예: 호스트에서 docker login 실행).
  3. 작업의 페이로드로 기본적으로 보낸 자격 증명 (예: 이전에 설명된 통합 레지스트리에 대한 자격 증명).

레지스트리를 위해 찾은 첫 번째 자격 증명이 사용됩니다. 예를 들어, DOCKER_AUTH_CONFIG 변수로 통합 레지스트리에 자격 증명을 추가하면 기본 자격 증명이 재정의됩니다.

[runners.parallels] 섹션

Parallels를 위한 다음 매개변수입니다.

매개변수 설명
base_name 복제된 Parallels VM의 이름.
template_name Parallels VM에 연결된 사용자 정의 이름. 선택 사항.
disable_snapshots 비활성화되면 작업이 완료된 후 VM이 파기됩니다.
allowed_images image/base_name 값을 나타내는 허용된 정규 표현식 목록. 자세한 내용은 기본 VM 이미지 재정의 섹션을 참조하세요.

예시:

[runners.parallels]
  base_name = "나의 Parallels 이미지"
  template_name = ""
  disable_snapshots = false

[runners.virtualbox] 섹션

다음 매개변수는 VirtualBox를 위한 것입니다. 이 실행기는 VirtualBox 머신을 제어하기 위해 vboxmanage 실행 파일에 의존하므로 Windows 호스트의 PATH 환경 변수를 조정해야 합니다: PATH=%PATH%;C:\Program Files\Oracle\VirtualBox.

매개변수 설명
base_name 복제된 VirtualBox VM의 이름.
base_snapshot VM의 특정 스냅샷의 이름 또는 UUID. 이 값이 비어 있거나 생략된 경우 현재 스냅샷이 사용됩니다. 현재 스냅샷이 없으면 하나가 만들어집니다. disable_snapshots가 true이면 기본 VM의 전체 복제가 만들어집니다.
base_folder 새 VM을 저장할 폴더. 이 값이 비어 있거나 생략된 경우 기본 VM 폴더가 사용됩니다.
disable_snapshots 비활성화되면 작업이 완료된 후 VM이 파기됩니다.
allowed_images image/base_name 값을 나타내는 허용된 정규 표현식 목록. 자세한 내용은 기본 VM 이미지 재정의 섹션을 참조하세요.
start_type VM을 시작할 때 사용하는 그래픽 프론트엔드 유형.

예시:

[runners.virtualbox]
  base_name = "나의 VirtualBox 이미지"
  base_snapshot = "나의 이미지 스냅샷"
  disable_snapshots = false
  start_type = "headless"

start_type 매개변수는 가상 이미지를 시작할 때 사용하는 그래픽 프론트엔드를 결정합니다. 유효한 값은 호스트 및 게스트 조합에서 지원하는 headless (기본값), gui, separate입니다.

기본 VM 이미지 재정의

  • GitLab Runner 14.2에서 도입되었습니다.

Parallels 및 VirtualBox 실행기 모두 base_name에 지정된 기본 VM 이름을 재정의할 수 있습니다. 이를 위해 .gitlab-ci.yml 파일의 image 매개변수를 사용하세요.

역호환성을 고려하여, 기본적으로이 값을 재정의할 수 없습니다. base_name으로 지정된 이미지만 허용됩니다.

사용자가 .gitlab-ci.ymlimage 매개변수를 사용하여 VM 이미지를 선택할 수 있도록 하려면:

[runners.virtualbox]
  ...
  allowed_images = [".*"]

예제에서는 기존 VM 이미지를 사용할 수 있습니다.

allowed_images 매개변수는 정규 표현식 목록입니다. 구성은 필요에 따라 정확할 수 있습니다. 예를 들어 특정한 VM 이미지만 허용하려면 다음과 같은 정규 표현식을 사용할 수 있습니다:

[runners.virtualbox]
  ...
  allowed_images = ["^allowed_vm[1-2]$"]

이 예에서는 allowed_vm1allowed_vm2만 허용됩니다. 다른 시도는 오류가 발생합니다.

[runners.ssh] 섹션

다음 매개변수는 SSH 연결을 정의합니다.

매개변수 설명
host 연결할 위치.
port 포트. 기본값은 22입니다.
user 사용자 이름.
password 비밀번호.
identity_file SSH 개인 키 (id_rsa, id_dsa, 또는 id_edcsa)의 파일 경로. 파일은 암호화되지 않아야 합니다.
disable_strict_host_key_checking 이 값은 러너가 엄격한 호스트 키 확인을 사용해야 하는지 여부를 결정합니다. 기본값은 true입니다. GitLab 15.0부터 기본값이나 값이 지정되지
않은 경우 false가 됩니다.  

예시:

[runners.ssh]
  host = "나의 프로덕션 서버"
  port = "22"
  user = "root"
  password = "프로덕션 서버 비밀번호"
  identity_file = ""

[runners.machine] 섹션

다음 매개변수는 Docker Machine 기반 자동 스케일링 기능을 정의합니다. 자세한 내용은 Docker Machine Executor autoscale configuration를 참조하십시오.

매개변수 설명
MaxGrowthRate 병렬로 러너에 추가할 수 있는 최대 머신 수. 기본값은 0 (제한 없음)입니다.
IdleCount 생성되어 대기 중인 Idle 상태 머신 수.
IdleScaleFactor 사용 중인 머신 수의 Idle 머신 수에 대한 배수. 부동 소수점 형식이어야 합니다. 자세한 내용은 autoscale 문서를 참조하십시오. 기본값은 0.0입니다.
IdleCountMin IdleScaleFactor를 사용할 때 생성되어 대기 중인 Idle 상태 머신의 최소 수. 기본값은 1입니다.
IdleTime 머신이 제거되기 전에 Idle 상태로 유지되는 시간(초).
[[runners.machine.autoscaling]] 현재 시간과 일치하는 표현식을 가진 마지막 섹션을 선택하는 여러 섹션.
OffPeakPeriods 사용되지 않음: 스케줄러가 OffPeak 모드인 시간대. 크론 스타일 패턴 배열(아래 설명 참조).
OffPeakTimezone 사용되지 않음: OffPeakPeriods에서 제공된 시간대. Europe/Berlin과 같은 시간대 문자열. 지정되지 않았거나 비어 있으면 호스트의 로캘 시스템 설정을 기본값으로 사용합니다. GitLab Runner는 ZONEINFO 환경 변수로 지정된 디렉토리나 압축 해제된 zip 파일에서 시간대 데이터베이스를 찾으려고 시도한 후 Unix 시스템의 알려진 설치 위치에서 시간대 데이터베이스를 찾고 마지막으로 $GOROOT/lib/time/zoneinfo.zip에서 찾습니다.
OffPeakIdleCount 사용되지 않음: Off Peak 시간대의 Idle 수. IdleCount와 유사하지만 Off Peak 시간대에 대한 것입니다.
OffPeakIdleTime 사용되지 않음: Off Peak 시간대의 Idle 시간. IdleTime과 유사하지만 Off Peak 시간대에 대한 것입니다.
MaxBuilds 머신이 제거되기 전의 최대 작업(빌드) 수.
MachineName 머신의 이름. 고유한 머신 식별자로 대체되어야 하는 %s반드시 포함해야 합니다.
MachineDriver Docker Machine driver. Docker Machine configurationCloud Providers Section에서 자세한 정보를 확인하십시오.
MachineOptions MachineDriver의 Docker Machine 옵션. 자세한 내용은 Supported Cloud Providers를 참조하십시오. AWS의 모든 옵션에 대한 자세한 내용은 Docker Machine 리포지토리의 AWSGCP 프로젝트를 참조하십시오.

[[runners.machine.autoscaling]] 섹션들

다음 매개변수는 Instance 또는 Docker Autoscaler 실행기를 사용할 때 사용 가능한 구성을 정의합니다.

매개변수 설명
Periods 이 스케줄이 활성화되는 시간대. 크론 스타일 패턴 배열(아래 설명 참조).
IdleCount 생성되어 대기 중인 Idle 상태 머신 수.
IdleScaleFactor (실험) 사용 중인 머신 수의 Idle 머신 수에 대한 배수. 부동 소수점 형식이어야 합니다. 자세한 내용은 autoscale 문서를 참조하십시오. 기본값은 0.0입니다.
IdleCountMin IdleScaleFactor를 사용할 때 생성되어 대기 중인 Idle 상태 머신의 최소 수. 기본값은 1입니다.
IdleTime 머신이 제거되기 전에 Idle 상태로 유지되는 시간(초).
Timezone Periods에서 제공된 시간대. Europe/Berlin과 같은 시간대 문자열. 지정되지 않았거나 비어 있으면 호스트의 로캘 시스템 설정을 기본값으로 사용합니다. GitLab Runner는 ZONEINFO 환경 변수로 지정된 디렉토리나 압축 해제된 zip 파일에서 시간대 데이터베이스를 찾으려고 시도한 후 Unix 시스템의 알려진 설치 위치에서 시간대 데이터베이스를 찾고 마지막으로 $GOROOT/lib/time/zoneinfo.zip에서 찾습니다.

예시:

[runners.machine]
  IdleCount = 5
  IdleTime = 600
  MaxBuilds = 100
  MachineName = "auto-scale-%s"
  MachineDriver = "google" # Docker Machine 문서를 참조하여 인증하는 방법 확인: https://docs.docker.com/machine/drivers/gce/#credentials
  MachineOptions = [
      # Google Compute Engine driver를 사용하여 추가적인 머신 옵션을 추가할 수 있습니다.
      # 호스트에 연결할 수 없음(예: "SSH 대기 중")과 같은 문제가 발생하는 경우
      # 디버깅에 도움을 주기 위해 선택적 매개변수를 제거해야 합니다.
      # https://docs.docker.com/machine/drivers/gce/
      "google-project=GOOGLE-PROJECT-ID",
      "google-zone=GOOGLE-ZONE", # 예: 'us-central1-a', 전체 목록은 https://cloud.google.com/compute/docs/regions-zones/에서 확인할 수 있습니다.
  ]
  [[runners.machine.autoscaling]]
    Periods = ["* * 9-17 * * mon-fri *"]
    IdleCount = 50
    IdleCountMin = 5
    IdleScaleFactor = 1.5 # 현재 Idle 머신 수가 1.5*사용 중인 머신 수가 되도록 함,
                          # 50(IdleCount 값)을 넘지 않으며 5(IdleCountMin 값)보다 작아지지 않음
    IdleTime = 3600
    Timezone = "UTC"
  [[runners.machine.autoscaling]]
    Periods = ["* * * * * sat,sun *"]
    IdleCount = 5
    IdleTime = 60
    Timezone = "UTC"

기간 구문

Periods 설정에는 cron 스타일 형식으로 표시된 시간 기간의 문자열 패턴 배열이 포함되어 있습니다. 이 줄에는 다음 필드가 포함되어 있습니다.

[초] [분] [시] [월의 날짜] [월] [주의 요일] [년]

표준 cron 구성 파일과 마찬가지로 필드에는 단일 값을, 범위를, 목록을, 그리고 별표를 포함시킬 수 있습니다. 구문의 자세한 설명은 구문 구현에 대한 자세한 설명을 참조하세요.

[runners.instance] 섹션

매개변수 유형 설명
allowed_images 문자열 VM 격리가 활성화되면 allowed_images는 작업이 지정할 수 있는 이미지를 제어합니다.

[runners.autoscaler] 섹션

  • GitLab Runner v15.10.0에서 도입되었습니다.

다음 매개변수는 오토스케일러 기능을 구성합니다. 이러한 매개변수는 InstanceDocker Autoscaler 실행기와 함께만 사용할 수 있습니다.

매개변수 설명
capacity_per_instance 단일 인스턴스에서 동시에 실행할 수 있는 작업 수.
max_use_count 인스턴스가 제거되기 전에 사용될 수 있는 최대 횟수.
max_instances 허용된 최대 인스턴스 수, 이는 인스턴스 상태(대기 중, 실행 중, 삭제 중)와 관계없이 적용됩니다. 기본값: 0 (무제한).
plugin 사용할 fleeting 플러그인. 플러그인을 설치하고 참조하는 방법에 대한 자세한 내용은 fleeting 플러그인 설치를 참조하세요.
delete_instances_on_shutdown GitLab Runner가 종료될 때 모든 프로비저닝된 인스턴스를 삭제할지 지정합니다. 기본값: false. GitLab Runner 15.11에서 도입되었습니다.
instance_ready_command 오토스케일러에 의해 프로비저닝된 각 인스턴스에서 실행하여 사용 가능한지 확인하는 명령. 실패하면 인스턴스가 제거됩니다. GitLab Runner 16.11에서 도입되었습니다.
update_interval 인스턴스 업데이트를 위해 fleeting 플러그인과 확인할 간격. 기본값: 1m (1분). GitLab Runner 16.11에서 도입되었습니다.
update_interval_when_expecting 상태 변경을 기대할 때 fleeting 플러그인과 확인할 간격. 예를 들어 인스턴스가 프로비저닝되었고 실행자가 대기 중에서 실행 중으로 전환되기를 기다리는 경우. 기본값: 2s (2초). GitLab Runner 16.11에서 도입되었습니다.

참고: 만약 instance_ready_command가 idle scale rules로 인해 자주 실패한다면, 인스턴스가 생성 및 제거되는 속도가 실행자가 작업을 수락하는 것보다 빠를 수 있습니다. 스케일 스로틀링을 지원하기 위해 지수 백오프가 GitLab 17.0에서 추가되었습니다.

참고: 오토스케일러 구성 옵션은 구성 변경으로 다시로드되지 않습니다. 그러나, GitLab 17.5.0 이상에서는 구성이 변경될 때 [[runners.autoscaler.policy]] 항목이 다시로드됩니다.

[runners.autoscaler.plugin_config] 섹션

이 해시 테이블은 JSON으로 다시 인코딩되어 구성된 플러그인에 직접 전달됩니다.

fleeting 플러그인은 일반적으로 지원되는 구성에 대한 동반 자료를 가지고 있습니다.

[runners.autoscaler.scale_throttle] 섹션

  • GitLab Runner v17.0.0에서 도입되었습니다.
매개변수 설명
limit 초당 생성할 수 있는 새 인스턴스의 요율 제한. -1은 무제한입니다. 기본값(0)은 제한을 100으로 설정합니다.
burst 새 인스턴스의 버스트 한도. limit이 무제한인 경우 burst는 무시됩니다. 기본값은 max_instances 또는 limit으로 설정되며, max_instances가 설정되지 않은 경우 limit로 설정됩니다.

[runners.autoscaler.connector_config] 섹션

fleeting 플러그인은 일반적으로 지원되는 연결 옵션에 대한 동반 자료를 가지고 있습니다.

플러그인은 커넥터 구성을 자동으로 업데이트합니다. [runners.autoscaler.connector_config]를 사용하여 자동 커넥터 구성을 무시하거나 플러그인이 결정할 수 없는 빈 값들을 채울 수 있습니다.

매개변수 설명
os 인스턴스의 운영 체제.
arch 인스턴스의 아키텍처.
protocol 사용할 프로토콜: ssh 또는 winrm.
username 연결에 사용되는 사용자 이름.
password 연결에 사용되는 암호.
key_path 연결에 사용되는 TLS 키 또는 동적으로 자격 증명을 제공합니다.
use_static_credentials 자동 자격 증명 제공 비활성화. 기본값: false.
keepalive 연결 keepalive 기간.
timeout 연결 제한 기간.
use_external_addr 플러그인이 외부 주소를 제공하도록 해야 하는지 여부. 플러그인이 내부 주소만 반환하는 경우에도 이 설정에 관계없이 사용됩니다. 기본값: false.

[runners.autoscaler.state_storage] 섹션

상태: 베타
  • GitLab Runner 17.5.0에서 도입되었습니다.

상태 저장소가 비활성화된(default) 상태로 GitLab Runner를 시작하면 기존 fleeting 인스턴스가 안전성을 위해 즉시 제거됩니다. max_use_count: 1과 같은 구성을 사용하는 경우, 우리는 그것의 사용 상태를 알지 못한다면 이미 사용된 인스턴스에 작업을 잘못 할당할 수 있습니다.

상태 저장소 기능을 활성화하면 인스턴스의 상태가 로컬 디스크에 유지됩니다. 이 경우, GitLab Runner가 시작할 때 인스턴스가 존재하면 삭제되지 않습니다. 캐시된 연결 세부 정보, 사용 횟수 및 기타 구성이 복원됩니다.

상태 저장소 기능을 활성화할 때 다음 정보를 고려하세요:

  • 인스턴스의 인증 상세 정보(사용자 이름, 암호, 키)가 디스크에 유지됩니다.
  • 인스턴스가 활발한 작업을 실행하고 있는 상태로 복원되면 GitLab Runner가 기본적으로 삭제합니다. 이 동작은 GitLab Runner가 작업을 재개할 수 없기 때문에 안전을 보장합니다. 인스턴스를 유지하려면 keep_instance_with_acquisitionstrue로 설정하세요.

    keep_instance_with_acquisitionstrue로 설정하는 것은 인스턴스에서 실행 중인 작업에 신경 쓰지 않는 경우 유용합니다. 환경을 정리하는 데 유용합니다. 예를 들어, instance_ready_command 구성 옵션을 사용하여 환경을 정리하여 인스턴스를 유지할 수 있습니다. 이는 모든 실행 중인 명령을 중지하거나 Docker 컨테이너를 강제로 제거하는 작업을 포함할 수 있습니다.

매개변수 설명
enabled 상태 저장소가 활성화되었는지 여부. 기본값: false.
dir 상태 저장소 디렉토리. 각 runner 구성 항목은 여기에 하위 디렉토리를 가지게 됩니다. 기본값: GitLab Runner 구성 파일 디렉토리에 있는 .taskscaler.
keep_instance_with_acquisitions 활성 작업이 있는 인스턴스가 제거되는지 여부. 기본값: false.

[[runners.autoscaler.policy]] 섹션

참고 - 이 문맥에서의 idle_count는 기존 오토스케일링 방법에서의 자동 스케일되는 머신의 수가 아니라 작업 수를 나타냅니다.

periods 해당 정책이 활성화된 기간을 나타내는 unix-cron 형식 문자열 배열입니다. 기본값: * * * * *
timezone unix-cron 기간을 평가할 때 사용되는 시간대입니다. 기본값: 시스템의 로컬 시간대
idle_count 즉시 사용 가능한 대상 공석 용량으로 작업을 위해 필요한 대상 공석 수입니다.
idle_time 인스턴스가 종료되기 전에 유휴 상태일 수 있는 시간입니다.
scale_factor 현재 사용 중인 용량의 요소로써 idle_count에 추가된 작업을 위한 즉시 사용 가능한 대상 공석 용량입니다. 기본값: 0.0
scale_factor_limit scale_factor 계산이 산출할 수 있는 최대 용량입니다.

scale_factor가 설정되면, idle_count는 최소 idle 용량이 되며, scaler_factor_limit은 최대 idle 용량이 됩니다.

여러 정책을 정의할 수 있습니다. 가장 최근에 일치하는 정책이 사용됩니다.

다음 예에서 idle count 1은 월요일부터 금요일까지 08:00부터 15:59까지 사용됩니다. 그 외에는 idle count는 0입니다.

[[runners.autoscaler.policy]]
  idle_count        = 0
  idle_time         = "0s"
  periods           = ["* * * * *"]

[[runners.autoscaler.policy]]
  idle_count        = 1
  idle_time         = "30m0s"
  periods           = ["* 8-15 * * mon-fri"]

기간 구문

periods 설정은 정책이 활성화된 기간을 나타내는 unix-cron 형식 문자열의 배열을 포함합니다.
크론 형식은 5개의 필드로 구성됩니다:

 ┌────────── 분 (0 - 59)
 │ ┌──────── 시 (0 - 23)
 │ │ ┌────── 일 (1 - 31)
 │ │ │ ┌──── 월 (1 - 12)
 │ │ │ │ ┌── 주중 (1 - 7 또는 MON-SUN, 0은 일요일의 별칭)
 * * * * *
  • -은 두 숫자 사이에 사용되어 범위를 지정합니다.
  • *는 해당 필드에 대한 유효한 값의 전체 범위를 나타내는 데 사용할 수 있습니다.
  • /는 숫자 뒤에 사용되거나 범위 뒤에 사용되어 해당 숫자를 범위에서 건너뛰는 데 사용할 수 있습니다. 예를 들어, 시간 필드에 대해 0-12/2는 00:00부터 00:12까지 매 2시간마다 기간을 활성화합니다.
  • ,은 해당 필드에 대한 유효한 숫자 또는 범위의 목록을 구분하는 데 사용할 수 있습니다. 예를 들어, 1,2,6-9.

이 크론 작업은 시간 범위를 나타내는 것을 명심할 가치가 있습니다. 예를 들어:

기간 영향
1 * * * * * 매 시간 1분 동안 규칙이 활성화됨 (아마도 크게 유용하지 않을 것임)
* 0-12 * * * 하루의 시작에서 12시간 동안 규칙이 활성화됨
0-30 13,16 * * SUN 매 주 일요일에 1시와 4시에 30분 동안 규칙이 활성화됨.

[runners.autoscaler.vm_isolation] 섹션

VM Isolation은 현재 MacOS에서만 지원되는 nesting을 사용합니다.

매개변수 설명
enabled VM Isolation이 활성화되어 있는지 여부를 지정합니다. 기본값: false
nesting_host nesting 데몬 호스트입니다.
nesting_config nesting 구성입니다. 이것은 JSON으로 직렬화되어 nesting 데몬에게 전송됩니다.
image 작업 이미지가 지정되지 않은 경우 nesting 데몬에서 사용하는 기본 이미지입니다.

[runners.autoscaler.vm_isolation.connector_config] 섹션

[runners.autoscaler.vm_isolation.connector_config] 섹션의 매개변수는 [runners.autoscaler.connector_config] 섹션과 동일하지만, 오토스케일된 인스턴스가 아닌 nesting으로 프로비저닝된 가상 머신에 연결하는 데 사용됩니다.

[runners.custom] 섹션

다음 매개변수는 커스텀 실행기의 구성을 정의합니다.

매개변수 유형 설명
config_exec string 작업 시작 전에 사용자가 일부 구성 설정을 재정의할 수 있도록 실행 파일의 경로입니다. 이러한 값들은 [[runners]] 섹션에 설정된 값보다 우선됩니다. 커스텀 실행기 설명서에 전체 목록이 있습니다.
config_args string array config_exec 실행 파일에 전달되는 첫 번째 인수 모음입니다.
config_exec_timeout integer config_exec의 실행이 완료되기까지의 제한 시간(초). 기본값은 3600초(1시간)입니다.
prepare_exec string 환경을 준비하는 데 사용되는 실행 파일의 경로입니다.
prepare_args string array prepare_exec 실행 파일에 전달되는 첫 번째 인수 모음입니다.
prepare_exec_timeout integer prepare_exec의 실행이 완료되기까지의 제한 시간(초). 기본값은 3600초(1시간)입니다.
run_exec string 필수. 환경에서 스크립트를 실행하는 데 사용되는 실행 파일의 경로입니다. 예를 들어 클론 및 빌드 스크립트.
run_args string array run_exec 실행 파일에 전달되는 첫 번째 인수 모음입니다.
cleanup_exec string 환경을 정리하는 데 사용되는 실행 파일의 경로입니다.
cleanup_args string array cleanup_exec 실행 파일에 전달되는 첫 번째 인수 모음입니다.
cleanup_exec_timeout integer cleanup_exec의 실행이 완료되기까지의 제한 시간(초). 기본값은 3600초(1시간)입니다.
graceful_kill_timeout integer prepare_execcleanup_exec가 중지되었을 때(예: 작업 취소 중) 대기할 시간(초). 이 시간이 지나면 프로세스는 종료됩니다. 기본값은 600초(10분)입니다.
force_kill_timeout integer 스크립트에 킬 신호를 보낸 후 대기할 시간(초). 기본값은 600초(10분)입니다.

[runners.cache] 섹션

다음 매개변수는 분산 캐시 기능을 정의합니다. 자세한 내용은 런너 오토스케일 문서를 참조하십시오.

매개변수 유형 설명
Type string 다음 중 하나: s3, gcs, azure.
Path string 캐시 URL에 선행되는 경로 이름입니다.
Shared 부울 러너 간 캐시 공유를 활성화합니다. 기본값은 false입니다.
MaxUploadedArchiveSize int64 클라우드 저장소에 업로드되는 캐시 아카이브의 바이트 제한입니다. 악의적인 사용자는 이 제한을 우회할 수 있으므로 GCS 어댑터는 서명된 URL의 X-Goog-Content-Length-Range 헤더를 통해 이를 강제합니다. 클라우드 저장소 제공 업체에서도 제한을 설정해야 합니다.

캐시 메커니즘은 사전 서명된 URL을 사용하여 캐시를 업로드하고 다운로드합니다. URL은 GitLab 러너에 의해 자체 인스턴스에서 서명됩니다. 작업 스크립트(캐시 업로드/다운로드 스크립트 포함)가 로컬 또는 외부 기계에서 실행되는지는 중요하지 않습니다. 예를 들어 shell 또는 docker 실행기는 작업 스크립트를 GitLab 러너 프로세스가 실행 중인 동일한 기계에서 실행합니다. 동시에 virtualbox 또는 docker+machine은 스크립트를 실행하기 위해 별도의 VM에 연결합니다. 이 프로세스는 보안상의 이유로 캐시 어댑터 자격 증명이 유출될 가능성을 최소화하기 위한 것입니다.

S3 캐시 어댑터가 IAM 인스턴스 프로필을 사용하도록 구성된 경우 어댑터는 GitLab 러너 머신에 연결된 프로필을 사용합니다. 마찬가지로 GCS 캐시 어댑터CredentialsFile을 사용하도록 구성된 경우 파일은 GitLab 러너 머신에 있어야 합니다.

이 표는 register에 대한 config.toml, CLI 옵션 및 ENV 변수를 나열합니다.

설정 TOML 필드 register에 대한 CLI 옵션 register에 대한 ENV 변수
Type [runners.cache] -> Type --cache-type $CACHE_TYPE
Path [runners.cache] -> Path --cache-path

12.0 이전: --cache-s3-cache-path
$CACHE_PATH

12.0 이전: $S3_CACHE_PATH
Shared [runners.cache] -> Shared --cache-shared

12.0 이전: --cache-cache-shared
$CACHE_SHARED
S3.ServerAddress [runners.cache.s3] -> ServerAddress

12.0 이전, [runners.cache] -> ServerAddress
--cache-s3-server-address $CACHE_S3_SERVER_ADDRESS

12.0 이전, $S3_SERVER_ADDRESS
S3.AccessKey [runners.cache.s3] -> AccessKey

12.0 이전, [runners.cache] -> AccessKey
--cache-s3-access-key $CACHE_S3_ACCESS_KEY

12.0 이전, $S3_ACCESS_KEY
S3.SecretKey [runners.cache.s3] -> SecretKey

12.0 이전, [runners.cache] -> SecretKey
--cache-s3-secret-key $CACHE_S3_SECRET_KEY

12.0 이전, $S3_SECRET_KEY
S3.SessionToken [runners.cache.s3] -> SessionToken --cache-s3-session-token $CACHE_S3_SESSION_TOKEN
S3.BucketName [runners.cache.s3] -> BucketName

12.0 이전, [runners.cache] -> BucketName
--cache-s3-bucket-name $CACHE_S3_BUCKET_NAME

12.0 이전, $S3_BUCKET_NAME
S3.BucketLocation [runners.cache.s3] -> BucketLocation

12.0 이전, [runners.cache] -> BucketLocation
--cache-s3-bucket-location $CACHE_S3_BUCKET_LOCATION

12.0 이전, $S3_BUCKET_LOCATION
S3.Insecure [runners.cache.s3] -> Insecure

12.0 이전, [runners.cache] -> Insecure
--cache-s3-insecure $CACHE_S3_INSECURE

12.0 이전, $S3_INSECURE
S3.AuthenticationType [runners.cache.s3] -> AuthenticationType --cache-s3-authentication_type $CACHE_S3_AUTHENTICATION_TYPE
S3.ServerSideEncryption [runners.cache.s3] -> ServerSideEncryption --cache-s3-server-side-encryption $CACHE_S3_SERVER_SIDE_ENCRYPTION
S3.ServerSideEncryptionKeyID [runners.cache.s3] -> ServerSideEncryptionKeyID --cache-s3-server-side-encryption-key-id $CACHE_S3_SERVER_SIDE_ENCRYPTION_KEY_ID
S3.DualStack [runners.cache.s3] -> DualStack --cache-s3-dual-stack $CACHE_S3_DUAL_STACK
S3.Accelerate [runners.cache.s3] -> Accelerate --cache-s3-accelerate $CACHE_S3_ACCELERATE
S3.PathStyle [runners.cache.s3] -> PathStyle --cache-s3-path-style $CACHE_S3_PATH_STYLE
S3.UploadRoleARN [runners.cache.s3] -> UploadRoleARN --cache-s3-upload-role-arn $CACHE_S3_UPLOAD_ROLE_ARN
GCS.AccessID [runners.cache.gcs] -> AccessID --cache-gcs-access-id $CACHE_GCS_ACCESS_ID
GCS.PrivateKey [runners.cache.gcs] -> PrivateKey --cache-gcs-private-key $CACHE_GCS_PRIVATE_KEY
GCS.CredentialsFile [runners.cache.gcs] -> CredentialsFile --cache-gcs-credentials-file $GOOGLE_APPLICATION_CREDENTIALS
GCS.BucketName [runners.cache.gcs] -> BucketName --cache-gcs-bucket-name $CACHE_GCS_BUCKET_NAME
Azure.AccountName [runners.cache.azure] -> AccountName --cache-azure-account-name $CACHE_AZURE_ACCOUNT_NAME
Azure.AccountKey [runners.cache.azure] -> AccountKey --cache-azure-account-key $CACHE_AZURE_ACCOUNT_KEY
Azure.ContainerName [runners.cache.azure] -> ContainerName --cache-azure-container-name $CACHE_AZURE_CONTAINER_NAME
Azure.StorageDomain [runners.cache.azure] -> StorageDomain --cache-azure-storage-domain $CACHE_AZURE_STORAGE_DOMAIN

[runners.cache.s3] 섹션

다음 매개변수들은 캐시용 S3 저장소를 정의합니다.

매개변수 타입 설명
ServerAddress string S3 호환 서버의 host:port. AWS 이외의 서버를 사용하는 경우, 올바른 주소를 확인하기 위해 저장소 제품 설명서를 참조하세요. DigitalOcean의 경우, 주소는 spacename.region.digitaloceanspaces.com 형식이어야 합니다.
AccessKey string S3 인스턴스에 지정된 액세스 키.
SecretKey string S3 인스턴스에 지정된 비밀 키.
SessionToken string 임시 자격 증명을 사용하는 경우 S3 인스턴스에 지정된 세션 토큰.
BucketName string 캐시가 저장된 저장소 버킷의 이름.
BucketLocation string S3 지역의 이름.
Insecure boolean S3 서비스가 HTTP로 사용 가능한 경우 true로 설정합니다. 기본값은 false입니다.
AuthenticationType string ServerAddress, AccessKey, 및 SecretKey가 모두 제공된 경우 기본값은 access-key입니다. ServerAddress, AccessKey, 또는 SecretKey 중 하나 이상이 누락된 경우 기본값은 iam으로 설정됩니다.
ServerSideEncryption string GitLab 15.3 이상에서 S3와 함께 사용되는 서버 측 암호화 유형은 S3 또는 KMS입니다. GitLab 17.5 이상에서 DSSE-KMS이 지원됩니다.
ServerSideEncryptionKeyID string GitLab 15.3 이상에서 KMS를 사용하는 경우 암호화에 사용되는 KMS 키의 별칭 또는 ID입니다. 별칭을 사용하는 경우 alias/로 시작해야 합니다.
DualStack boolean GitLab 17.5 이상에서 IPv4 및 IPv6 엔드포인트 사용을 가능하게 합니다 (기본값: true). AWS S3 Express를 사용하는 경우 비활성화하세요. ServerAddress가 설정된 경우 무시됩니다.
Accelerate bool GitLab 17.5 이상에서 AWS S3 Transfer Acceleration 사용을 가능하게 합니다. ServerAddress가 가속화된 엔드포인트로 구성된 경우 자동으로 true로 설정됩니다.
PathStyle boolean GitLab 17.5 이상에서 경로 스타일 액세스를 가능하게 합니다 (기본값: ServerAddress 기반으로 자동 감지됨).
UploadRoleARN boolean GitLab 17.5 이상에서 AssumeRole로 시간 제한이 있는 PutObject S3 요청을 생성할 수 있는 AWS 역할 ARN을 지정합니다. 이를 통해 S3 멀티파트 업로드를 사용할 수 있습니다.

예시:

[runners.cache]
  Type = "s3"
  Path = "path/to/prefix"
  Shared = false
  [runners.cache.s3]
    ServerAddress = "s3.amazonaws.com"
    AccessKey = "AWS_S3_ACCESS_KEY"
    SecretKey = "AWS_S3_SECRET_KEY"
    BucketName = "runners-cache"
    BucketLocation = "eu-west-1"
    Insecure = false
    ServerSideEncryption = "KMS"
    ServerSideEncryptionKeyID = "alias/my-key"

만약 ServerAddress, AccessKey, 또는 SecretKey 중 하나라도 지정되지 않았고 AuthenticationType이 제공되지 않은 경우, S3 클라이언트는 gitlab-runner 인스턴스에 사용 가능한 IAM 인스턴스 프로필을 사용합니다. autoscale 구성에서, 이는 작업을 실행하는 온디맨드 머신이 아닙니다. ServerAddress, AccessKey,와 SecretKey가 모두 지정된 경우이지만 AuthenticationType이 제공되지 않은 경우, 인증 유형으로 access-key가 사용됩니다.

GitLab Runner를 설치할 때 Helm 차트를 사용하고 values.yaml 파일에서 rbac.create가 true로 설정된 경우, ServiceAccount가 생성됩니다. 이 ServiceAccount의 주석은 rbac.serviceAccountAnnotations 섹션에서 검색됩니다.

Amazon EKS에서 러너를 사용하는 경우, 서비스 계정에 할당할 IAM 역할을 지정할 수 있습니다. 필요한 특정 주석은 다음과 같습니다: eks.amazonaws.com/role-arn: arn:aws:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>.

이 역할에 대한 IAM 정책은 지정된 버킷에 대해 다음 작업을 수행할 수 있는 권한을 가져야 합니다:

  • s3:PutObject
  • s3:GetObjectVersion
  • s3:GetObject
  • s3:DeleteObject

ServerSideEncryption에서 KMS 유형을 사용하는 경우, 해당 역할에 대한 IAM 정책은 지정된 AWS KMS 키에 대해 다음 작업을 수행할 수 있는 권한을 가지고 있어야 합니다:

  • kms:Encrypt
  • kms:Decrypt
  • kms:ReEncrypt*
  • kms:GenerateDataKey*
  • kms:DescribeKey

ServerSideEncryption에서 SSE-C 유형은 지원되지 않습니다. SSE-C는 사용자 제공 키를 포함하는 헤더를 다운로드 요청에 제공해야 하며, 또한 사전 서명된 URL에 대해 키를 제공해야 합니다. 이는 키 노출의 가능성을 가지고 있습니다. 이 문제에 대한 논의는 이 merge request에서 확인할 수 있습니다.

참고: 단일 파일의 AWS S3 캐시에 업로드할 수 있는 최대 크기는 5GB입니다. 이 동작에 대한 잠재적인 해결책에 대한 논의는 이 issue에서 확인할 수 있습니다.

러너 캐시를 위한 S3 버킷에서 KMS 키 암호화 사용

GenerateDataKey API는 KMS 대칭 키를 사용하여 클라이언트 측 암호화용 데이터 키를 생성합니다 (https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html). KMS 키 구성은 다음과 같아야 합니다:

속성 설명
키 유형 대칭
원본 AWS_KMS
키 규격 SYMMETRIC_DEFAULT
키 사용 암호화 및 복호화

rbac.serviceAccountName으로 정의된 ServiceAccount에 할당된 역할에 대한 IAM 정책은 KMS 키에 대해 다음 작업을 수행할 수 있는 권한을 가지고 있어야 합니다:

  • kms:GetPublicKey
  • kms:Decrypt
  • kms:Encrypt
  • kms:DescribeKey
  • kms:GenerateDataKey

UploadRoleARN을 사용하여 멀티파트 업로드 활성화

캐시 접근을 제한하기 위해 러너 매니저에서는 작업에서 캐시로 다운로드하고 업로드하기 위해 시간 제한이 있는 사전 서명 된 URL을 생성합니다. 그러나 AWS S3는 단일 PUT 요청을 5GB로 제한합니다. 5GB보다 큰 파일의 경우 멀티파트 업로드 API를 사용해야합니다.

멀티파트 업로드는 AWS S3에서만 지원되며 다른 S3 제공 업체에는 지원되지 않습니다. 러너 매니저는 다른 프로젝트에 대한 작업을 처리하므로 버킷 전역 권한을 가진 S3 자격 증명을 러너 매니저가 전달할 수 없습니다. 대신, 러너 매니저는 시간 제한이 있는 사전 서명 된 URL 및 구체적으로 범위가 좁은 자격 증명을 사용하여 하나의 특정 객체에 대한 액세스를 제한합니다.

AWS에서 S3 멀티파트 업로드를 사용하려면 UploadRoleARN에 IAM 역할을 지정합니다. arn:aws:iam:::<ACCOUNT ID>:<YOUR ROLE NAME> 형식으로 역할을 지정합니다. 이 역할은 버킷의 특정 blob에 쓰기 권한이 제한된 일시적인 AWS 자격 증명을 생성합니다. 지정한 UploadRoleARNAssumeRole에 대한 원래 S3 자격 증명이 액세스 할 수 있는지 확인하십시오.

UploadRoleARN에 지정된 IAM 역할은 다음 권한을 가지고 있어야합니다:

  • BucketName에 지정된 버킷에 대한 s3:PutObject 액세스.
  • KMS 또는 DSSE-KMS와 함께 서버 측 암호화가 활성화된 경우 kms:Decryptkms:GenerateDataKey.

예를 들어, my-instance-role이라는 IAM 역할이 arn:aws:iam::1234567890123:role/my-instance-role로 EC2 인스턴스에 연결되어 있는 경우

새 역할 arn:aws:iam::1234567890123:role/my-upload-role을 만들 수 있으며, s3:PutObject 권한만 BucketName에 부여합니다. my-instance-role에 대한 AWS 설정에서 Trust relationships는 다음과 유사한 모습을 가질 수 있습니다:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::1234567890123:role/my-upload-role"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

새 역할을 만드는 대신 my-instance-roleUploadRoleARN으로 재사용할 수도 있습니다. 단, my-instance-roleAssumeRole 권한이 있어야합니다. 예를 들어, EC2 인스턴스와 연관된 IAM 프로필에는 다음과 유사한 Trust relationships가 있을 수 있습니다:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com",
                "AWS": "arn:aws:iam::1234567890123:role/my-instance-role"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

AWS 명령줄 인터페이스를 사용하여 인스턴스가 AssumeRole 권한을 가지고 있는지 확인할 수 있습니다. 예를 들어:

aws sts assume-role --role-arn arn:aws:iam::1234567890123:role/my-upload-role --role-session-name gitlab-runner-test1

UploadRoleARN으로 업로드 작동하는 방법

UploadRoleARN이 존재하는 경우, 러너가 캐시로 업로드할 때마다:

  1. 러너 매니저는 원래 S3 자격 증명( AuthenticationType, AccessKey, 및 SecretKey로 지정됨)을 검색합니다.
  2. S3 자격 증명을 사용하여 러너 매니저가 UploadRoleARN으로 Amazon Security Token Service (STS)로 AssumeRole 요청을 보냅니다. 정책 요청은 다음과 같이 보일 수 있습니다:

     {
         "Version": "2012-10-17",
         "Statement": [
             {
                 "Effect": "Allow",
                 "Action": ["s3:PutObject"],
                 "Resource": "arn:aws:s3:::<YOUR-BUCKET-NAME>/<CACHE-FILENAME>"
             }
         ]
     }
    
  3. 요청이 성공하면, 러너 매니저는 제한된 세션을 가진 일시적인 AWS 자격 증명을 획들합니다.
  4. 러너 매니저는 이러한 자격 증명과 s3://<bucket name>/<filename> 형식의 URL을 캐시 아카이버에 전달하여 파일을 업로드합니다.

서비스 계정 자원에 대한 IAM 역할 활성화

서비스 계정에 IAM 역할을 사용하려면 클러스터에 IAM OIDC 제공자가 연결되어 있어야합니다. IAM OIDC 제공자가 클러스터에 연결된 후, 러너의 서비스 계정에 연결할 IAM 역할을 만들 수 있습니다.

  1. 역할 생성 창에서 신뢰할 수 있는 엔티티 유형 선택에서 웹 신원을 선택합니다.
  2. 역할의 신뢰 관계 탭에서:

    • 신뢰할 수 있는 엔티티 섹션은 다음 형식이어야합니다: arn:aws:iam::<ACCOUNT_ID>:oidc-provider/oidc.eks.<AWS_REGION>.amazonaws.com/id/<OIDC_ID>. OIDC ID는 EKS 클러스터의 Configuration 탭에서 찾을 수 있습니다.

    • 조건 섹션은 rbac.serviceAccountName에 정의된 GitLab 러너 서비스 계정 또는 rbac.createtrue로 설정된 경우에 만들어진 기본 서비스 계정이어야합니다:

      조건
      StringEquals ` oidc.eks..amazonaws.com/id/:sub` system:serviceaccount:<GITLAB_RUNNER_NAMESPACE>:<GITLAB_RUNNER_SERVICE_ACCOUNT>

[runners.cache.gcs] 섹션

다음 매개변수는 Google Cloud Storage의 네이티브 지원을 정의합니다. 이러한 값에 대한 자세한 정보는 Google Cloud Storage (GCS) 인증 문서를 참조하십시오.

매개변수 유형 설명
CredentialsFile 문자열 Google JSON 키 파일의 경로. service_account 유형 만 지원됩니다. 구성된 경우이 값은 config.toml에 직접 구성된 AccessIDPrivateKey보다 우선합니다.
AccessID 문자열 저장소에 액세스하는 데 사용되는 GCP 서비스 계정의 ID입니다.
PrivateKey 문자열 GCS 요청에 서명하는 데 사용되는 개인 키입니다.
BucketName 문자열 캐시가 저장된 저장소 버킷의 이름입니다.

예시:

config.toml 파일에 직접 구성된 자격 증명:

[runners.cache]
  Type = "gcs"
  Path = "path/to/prefix"
  Shared = false
  [runners.cache.gcs]
    AccessID = "cache-access-account@test-project-123456.iam.gserviceaccount.com"
    PrivateKey = "-----BEGIN PRIVATE KEY-----\nXXXXXX\n-----END PRIVATE KEY-----\n"
    BucketName = "runners-cache"

GCP에서 다운로드된 JSON 파일에서 자격 증명:

[runners.cache]
  Type = "gcs"
  Path = "path/to/prefix"
  Shared = false
  [runners.cache.gcs]
    CredentialsFile = "/etc/gitlab-runner/service-account.json"
    BucketName = "runners-cache"

GCP 메타데이터 서버의 메타데이터를 사용한 애플리케이션 기본 자격 증명(ADC):

Google Cloud ADC를 사용하면 일반적으로 기본 서비스 계정을 사용합니다. 그런 다음 인스턴스에 자격 증명을 제공할 필요가 없습니다.

[runners.cache]
  Type = "gcs"
  Path = "path/to/prefix"
  Shared = false
  [runners.cache.gcs]
    BucketName = "runners-cache"

ADC를 사용하는 경우 사용하는 서비스 계정에 iam.serviceAccounts.signBlob 권한이 있는지 확인하십시오. 일반적으로이는 서비스 계정에 서비스 계정 토큰 생성자 역할를 부여하여 수행됩니다.

[runners.cache.azure] 섹션

  • GitLab Runner 13.4.0에서 소개되었습니다.

다음 매개변수는 Azure Blob Storage의 네이티브 지원을 정의합니다. 자세한 내용은 Azure Blob Storage 문서를 참조하십시오. S3 및 GCS는 개체 모음에 대해 ‘bucket’이라는 용어를 사용하는 반면 Azure는 ‘container’라는 용어를 사용하여 blob 모음을 나타냅니다.

매개변수 유형 설명
AccountName string 저장소 접근에 사용되는 Azure Blob Storage 계정 이름입니다.
AccountKey string 컨테이너에 액세스하는 데 사용되는 저장소 계정 액세스 키입니다. 구성에서 AccountKey를 제외하려면 Azure workload 또는 관리 신원을 사용하십시오.
ContainerName string 캐시 데이터를 저장할 저장 컨테이너의 이름입니다.
StorageDomain string Azure 스토리지 엔드포인트를 서비스하는 데 사용되는 도메인 이름입니다(옵션). 기본값은 blob.core.windows.net입니다.

예시:

[runners.cache]
 Type = "azure"
 Path = "path/to/prefix"
 Shared = false
 [runners.cache.azure]
   AccountName = "<AZURE STORAGE ACCOUNT NAME>"
   AccountKey = "<AZURE STORAGE ACCOUNT KEY>"
   ContainerName = "runners-cache"
   StorageDomain = "blob.core.windows.net"

Azure 워크로드 및 관리 신원

  • GitLab Runner v17.5.0에서 소개되었습니다.

Azure 워크로드 또는 관리 신원을 사용하려면 구성에서 AccountKey를 제외하십시오. AccountKey가 공백인 경우, 러너는 다음을 시도합니다:

  1. DefaultAzureCredential를 통해 일시적인 자격 증명을 획들합니다.
  2. 사용자 위임 키를 가져옵니다.
  3. 해당 키로 Storage Account blob에 액세스하기 위해 SAS 토큰을 생성합니다.

인스턴스에 Storage Blob Data Contributor 역할이 할당되어 있는지 확인하십시오. 인스턴스가 위의 작업을 수행할 수 없는 경우, GitLab Runner에서 AuthorizationPermissionMismatch 오류가 보고됩니다.

[runners.kubernetes] 섹션

  • GitLab Runner v1.6.0에서 소개되었습니다.

다음 표는 Kubernetes executor에 대한 구성 매개변수를 나열합니다. 추가 매개변수에 대해서는 Kubernetes executor 문서를 참조하십시오.

매개변수 유형 설명
host string 선택 사항. Kubernetes 호스트 URL입니다. 지정되지 않으면, 러너는 자동으로 탐지를 시도합니다.
cert_file string 선택 사항. Kubernetes 인증서 파일입니다.
key_file string 선택 사항. Kubernetes 인증 개인 키입니다.
ca_file string 선택 사항. Kubernetes 인증 ca 인증서입니다.
image string 작업에 사용할 기본 컨테이너 이미지입니다.
allowed_images array .gitlab-ci.yml에서 허용된 컨테이너 이미지의 와일드카드 목록입니다. 허용된 이미지가 없으면 모든 이미지가 허용됩니다(equivalent to ["*/*:*"]). Docker 또는 Kubernetes executor와 함께 사용하십시오.
allowed_services array .gitlab-ci.yml에서 허용된 서비스의 와일드카드 목록입니다. 허용된 서비스가 없으면 모든 이미지가 허용됩니다(equivalent to ["*/*:*"]). Docker 또는 Kubernetes executor와 함께 사용하십시오.
namespace string Kubernetes 작업을 실행할 네임스페이스입니다.
privileged boolean 모든 컨테이너를 특권 플래그가 활성화된 상태로 실행합니다.
allow_privilege_escalation boolean 선택 사항. allowPrivilegeEscalation 플래그가 활성화된 상태로 모든 컨테이너를 실행합니다.
node_selector table key=value 쌍의 string=string 테이블입니다. 모든 key=value 쌍과 일치하는 Kubernetes 노드에만 pod 생성을 제한합니다.
image_pull_secrets array 개인 레지스트리에서 컨테이너 이미지를 인증하는 데 사용되는 Kubernetes docker-registry 비밀 이름이 포함된 항목의 배열입니다.
logs_base_dir string 빌드 로그를 저장할 경로에 추가될 기본 디렉토리입니다. GitLab Runner 17.2.에서 소개되었습니다.
scripts_base_dir string 빌드 스크립트를 저장할 경로에 추가될 기본 디렉토리입니다. GitLab Runner 17.2.에서 소개되었습니다.

예시:

[runners.kubernetes]
  host = "https://45.67.34.123:4892"
  cert_file = "/etc/ssl/kubernetes/api.crt"
  key_file = "/etc/ssl/kubernetes/api.key"
  ca_file = "/etc/ssl/kubernetes/ca.crt"
  image = "golang:1.8"
  privileged = true
  allow_privilege_escalation = true
  image_pull_secrets = ["docker-registry-credentials", "optional-additional-credentials"]
  allowed_images = ["ruby:*", "python:*", "php:*"]
  allowed_services = ["postgres:9.4", "postgres:latest"]
  logs_base_dir = "/tmp"
  scripts_base_dir = "/tmp"
  [runners.kubernetes.node_selector]
    gitlab = "true"

도우미 이미지

docker, docker+machine, 또는 kubernetes 실행자를 사용할 때 GitLab Runner는 Git, 아티팩트, 캐시 작업을 처리하기 위해 특정 컨테이너를 사용합니다. 이 컨테이너는 도우미 이미지라는 이름의 이미지에서 생성됩니다.

도우미 이미지는 amd64, arm, arm64, s390x 및 ppc64le 아키텍처에서 사용할 수 있습니다. 이 이미지에는 gitlab-runner-helper 이진 파일이 포함되어 있으며, 이는 GitLab Runner 이진 파일의 특별한 컴파일입니다. 사용 가능한 명령어의 하위 집합뿐만 아니라 Git, Git LFS 및 SSL 인증서 저장소도 포함되어 있습니다.

도우미 이미지에는 몇 가지 버전이 있습니다. alpine, alpine3.17, alpine3.18, alpine3.19, alpine-latest, ubi-fips, ubuntu 등이 있습니다. 현재 alpine 이미지가 크기가 작아서 기본값으로 사용됩니다. 하지만 일부 환경에서 DNS 문제가 발생할 수 있습니다. helper_image_flavor = "ubuntu"를 사용하면 도우미 이미지의 ubuntu 버전을 선택할 수 있습니다.

GitLab Runner 16.1부터 17.1 사이에서 alpine 버전은 alpine3.18의 별칭입니다. GitLab Runner 17.2 이후부터는 alpine3.19의 별칭입니다.

alpine-latest 버전은 기본 이미지로 alpine:latest를 사용하며, 이로 인해 더 불안정할 수 있습니다.

GitLab Runner가 DEB/RPM 패키지에서 설치되면 지원되는 아키텍처용 이미지가 호스트에 설치됩니다. 실행자가 작업을 실행하기 전에 지정된 버전의 이미지(런너의 Git 리비전을 기반으로 함)가 Docker 엔진에 없는 경우 자동으로 로드됩니다. dockerdocker+machine 실행자는 이러한 방식으로 작동합니다.

alpine 버전의 경우 패키지에는 기본 alpine 버전 이미지만 포함되어 있습니다. 다른 모든 버전은 레지스트리에서 다운로드해야 합니다.

kubernetes 실행자 및 GitLab Runner의 수동 설치는 다르게 동작합니다.

  • 수동 설치의 경우 gitlab-runner-helper 이진 파일이 포함되어 있지 않습니다.
  • kubernetes 실행자의 경우 Kubernetes API는 gitlab-runner-helper 이미지를 로컬 아카이브에서 로드할 수 없습니다.

두 경우 모두 GitLab Runner는 도우미 이미지를 다운로드합니다. GitLab Runner의 리비전 및 아키텍처는 다운로드할 태그를 정의합니다.

Kubernetes의 Arm용 도우미 이미지 구성

arm64 Kubernetes 클러스터에서 arm64 도우미 이미지를 사용하려면 구성 파일에서 다음 값을 설정하세요.

[runners.kubernetes]
        helper_image = "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:arm64-latest"

이전 버전의 Alpine Linux를 사용하는 러너 이미지

  • GitLab Runner 14.5에서 도입.

여러 버전의 Alpine Linux로 이미지가 빌드되어 있으므로 새로운 버전의 Alpine을 사용할 수 있을 뿐 아니라 이전 버전도 사용할 수 있습니다.

도우미 이미지의 경우 helper_image_flavor를 변경하거나 도우미 이미지 섹션을 참조하세요.

GitLab Runner 이미지의 경우 이미지의 접두사로 alpine, alpine3.16, alpine3.17, alpine3.18, alpine3.19 또는 alpine-latest가 사용되고 버전 앞에 사용됩니다.

docker pull gitlab/gitlab-runner:alpine3.19-v16.1.0

Alpine pwsh 이미지

GitLab Runner 16.1 이후 모든 alpine 도우미 이미지에 pwsh 변형이 포함되어 있습니다. 유일한 예외는 도우미 이미지가 기반으로 하는 pwsh 도커 이미지들alpine:latest를 지원하지 않기 때문에 alpine-latest입니다.

예시:

docker pull registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:alpine3.18-x86_64-v16.1.0-pwsh

도우미 이미지 레지스트리

GitLab 15.0 이전에는 도우미 이미지를 Docker Hub의 이미지를 사용하도록 구성했습니다.

GitLab 15.1 이후에는 도우미 이미지가 GitLab 컨테이너 레지스트리에서 가져옵니다.

Git의 기본 gitlab-runner-helper 이미지를 GitLab 레지스트리에서 검색하려면 helper-image 값을 사용하세요: registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-v${CI_RUNNER_VERSION}.

자체 관리형 인스턴스도 GitLab.com의 GitLab 컨테이너 레지스트리에서 도우미 이미지를 가져옵니다. GitLab 컨테이너 레지스트리의 상태를 확인하려면 GitLab 시스템 상태를 참조하세요.

도우미 이미지 재정의

경우에 따라 도우미 이미지를 재정의해야 할 수 있습니다. 이유는 여러 가지가 있습니다.

  1. 작업 실행 속도 향상: 더 느린 인터넷 연결 환경에서 여러 번 동일한 이미지를 다운로드하면 작업 실행에 걸리는 시간이 증가할 수 있습니다. registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:XYZ의 정확한 사본이 저장된 로컬 레지스트리에서 도우미 이미지를 다운로드하여 속도를 높일 수 있습니다.

  2. 보안 문제: 사전에 확인되지 않은 외부 종속성을 다운로드하고 싶지 않을 수 있습니다. 로컬 리포지토리에 저장된 것만 사용하는 비즈니스 규칙이 있을 수 있습니다.

  3. 인터넷 액세스 없는 빌드 환경: 인터넷 액세스가 없는 오프라인 환경에 Kubernetes 클러스터가 설치되어 있는 경우, CI/CD 작업에서 사용되는 이미지를 로컬 이미지 레지스트리나 패키지 리포지토리에서 가져올 수 있습니다.

  4. 추가 소프트웨어: openssh와 같은 추가 소프트웨어를 도우미 이미지에 설치하려는 경우가 있을 수 있습니다. 이를 통해 git+http 대신 git+ssh로 접근 가능한 하위 모듈을 지원할 수 있습니다.

이러한 경우에는 helper_image 구성 필드를 사용하여 사용자 지정 이미지를 구성할 수 있습니다. 이는 docker, docker+machine, kubernetes 실행자에 사용할 수 있습니다.

[[runners]]
  (...)
  executor = "docker"
  [runners.docker]
    (...)
    helper_image = "my.registry.local/gitlab/gitlab-runner-helper:tag"

도우미 이미지의 버전은 GitLab Runner 버전과 엄격하게 결합되어야 합니다. 이러한 이미지를 제공하는 주요 이유 중 하나는 GitLab Runner이 gitlab-runner-helper 이진 파일을 사용하기 때문입니다. 이 이진 파일은 GitLab Runner 소스의 일부에서 컴파일됩니다. 이 이진 파일은 두 버전 간에 동일하게 예상되는 내부 API를 사용합니다.

기본적으로 GitLab Runner는 gitlab-runner-helper:XYZ 이미지를 참조하며, 여기서 XYZ는 GitLab Runner 아키텍처와 Git 리비전에 기초합니다. GitLab Runner 11.3부터는 버전 변수 중 하나를 사용하여 이미지 버전을 정의할 수 있습니다:

[[runners]]
  (...)
  executor = "docker"
  [runners.docker]
    (...)
    helper_image = "my.registry.local/gitlab/gitlab-runner-helper:x86_64-v${CI_RUNNER_VERSION}"

이 구성으로 GitLab Runner는 executor에게 버전 x86_64-v${CI_RUNNER_VERSION}의 이미지를 사용하도록 지시하며, 이는 컴파일 데이터에 기초합니다. GitLab Runner를 새 버전으로 업데이트한 후에는 작업이 “No such image” 오류로 실패하지 않도록 하기 위해 이미지를 업로드해야 합니다.

GitLab Runner 13.2 이후로 도우미 이미지는 $CI_RUNNER_VERSION에 더해 $CI_RUNNER_REVISION으로 태그가 붙습니다. 두 태그 모두 유효하며 동일한 이미지를 가리킵니다.

[[runners]]
  (...)
  executor = "docker"
  [runners.docker]
    (...)
    helper_image = "my.registry.local/gitlab/gitlab-runner-helper:x86_64-v${CI_RUNNER_VERSION}"

PowerShell Core 사용 시

Linux용 헬퍼 이미지의 추가 버전인 registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:XYZ-pwsh 태그가 발행됨.

[runners.custom_build_dir] 섹션

이 섹션은 사용자 정의 빌드 디렉토리 매개변수를 정의합니다.

이 기능은 명시적으로 구성하지 않은 경우 ‘kubernetes’, ‘docker’, ‘docker+machine’, ‘docker autoscaler’ 및 ‘instance’ executor에 대해 기본적으로 활성화됩니다. 다른 executor에 대해서는 기본적으로 비활성화됩니다.

이 기능을 사용하려면 GIT_CLONE_PATHrunners.builds_dir에서 정의된 경로에 있어야 합니다. builds_dir를 사용하려면 $CI_BUILDS_DIR 변수를 사용합니다.

기본적으로, 이 기능은 dockerkubernetes executor에만 사용 가능합니다. 이 기능은 명시적으로 다른 executor에 대해 활성화할 수 있지만, ‘concurrent > 1’인 executor와 함께 사용할 때 주의가 필요합니다.

매개변수 유형 설명
enabled boolean 작업에 대해 사용자 정의 빌드 디렉토리를 정의할 수 있게 함.

예시:

[runners.custom_build_dir]
  enabled = true

기본 빌드 디렉토리

GitLab Runner는 리포지토리를 _빌드 디렉토리_로 알려진 기본 경로에 클론합니다. 이 기본 디렉토리의 기본 위치는 executor에 따라 다릅니다.

  • Kubernetes, DockerDocker Machine executor의 경우, 컨테이너 내의 /builds입니다.
  • Instance의 경우, 타겟 머신에 대한 SSH 또는 WinRM 연결을 처리하는 사용자의 홈 디렉토리 내의 ~/builds입니다.
  • Docker Autoscaler의 경우, 컨테이너 내의 /builds입니다.
  • Shell executor의 경우, $PWD/builds입니다.
  • SSH, VirtualBoxParallels executor의 경우, 타겟 머신에 대한 SSH 연결을 처리하는 사용자의 홈 디렉토리 내의 ~/builds입니다.
  • Custom executor의 경우, 기본값이 제공되지 않으며 명시적으로 구성해야 합니다.

사용자는 builds_dir 설정을 사용하여 사용하는 _빌드 디렉토리를 명시적으로 정의할 수 있습니다.

참고: GIT_CLONE_PATH도 지정할 수 있으며, 아래 지침은 해당 사항이 아닌 경우입니다.

GitLab Runner는 실행하는 모든 작업에 대해 _빌드 디렉토리_를 사용하지만 특정 패턴으로 중첩하여 사용합니다. {builds_dir}/$RUNNER_TOKEN_KEY/$CONCURRENT_PROJECT_ID/$NAMESPACE/$PROJECT_NAME. 예시: /builds/2mn-ncv-/0/user/playground.

GitLab Runner는 빌드 디렉토리 내에 저장되는 것을 막지는 않습니다. 예를 들어, CI 실행 중에 사용되는 도구를 /builds/tools에 저장할 수 있습니다. 그러나, 이를 권장하지 않습니다. 아무것도 _빌드 디렉토리_내에 저장하지 말아야 합니다. GitLab Runner에게 완전한 제어권이 있어야 하며 이러한 경우에는 안정성을 보장하지 않습니다. CI에 필요한 종속성이 있는 경우 다른 곳에 설치하길 권장합니다.

[runners.referees] 섹션

GitLab Runner referees를 사용하여 추가 작업 모니터링 데이터를 GitLab에 전달합니다. Referee는 작업과 관련된 추가 데이터를 쿼리하고 수집하는 러너 관리자의 worker입니다. 결과는 작업 artifact로 GitLab에 업로드됩니다.

Metrics Runner referee 사용

작업을 실행하는 기계 또는 컨테이너가 Prometheus 메트릭을 노출하는 경우, GitLab Runner는 Prometheus 서버에서 작업 기간 전체를 쿼리할 수 있습니다. 메트릭을 받은 후, 나중에 분석에 사용할 작업 artifact로 업로드됩니다.

현재 docker-machine executor만 referee를 지원합니다.

GitLab Runner를 위한 Metrics Runner Referee 구성

config.toml 파일의 [[runner]] 섹션 내에서 [runners.referees][runners.referees.metrics]를 정의하고 다음 필드를 추가합니다.

설정 설명
prometheus_address GitLab Runner 인스턴스에서 메트릭을 수집하는 서버. 작업이 종료될 때 러너 관리자에 의해 접근 가능해야 합니다.
query_interval 작업과 관련된 Prometheus 인스턴스의 시계열 데이터가 쿼리되는 빈도, 일정 간격(초 단위로 정의)으로 지정합니다.
queries 각 interval마다 실행되는 PromQL 쿼리의 배열입니다.

다음은 node_exporter 메트릭의 완전한 구성 예시입니다:

[[runners]]
  [runners.referees]
    [runners.referees.metrics]
      prometheus_address = "http://localhost:9090"
      query_interval = 10
      metric_queries = [
        "arp_entries:rate(node_arp_entries{{selector}}[{interval}])",
        "context_switches:rate(node_context_switches_total{{selector}}[{interval}])",
        "cpu_seconds:rate(node_cpu_seconds_total{{selector}}[{interval}])",
        "disk_read_bytes:rate(node_disk_read_bytes_total{{selector}}[{interval}])",
        "disk_written_bytes:rate(node_disk_written_bytes_total{{selector}}[{interval}])",
        "memory_bytes:rate(node_memory_MemTotal_bytes{{selector}}[{interval}])",
        "memory_swap_bytes:rate(node_memory_SwapTotal_bytes{{selector}}[{interval}])",
        "network_tcp_active_opens:rate(node_netstat_Tcp_ActiveOpens{{selector}}[{interval}])",
        "network_tcp_passive_opens:rate(node_netstat_Tcp_PassiveOpens{{selector}}[{interval}])",
        "network_receive_bytes:rate(node_network_receive_bytes_total{{selector}}[{interval}])",
        "network_receive_drops:rate(node_network_receive_drop_total{{selector}}[{interval}])",
        "network_receive_errors:rate(node_network_receive_errs_total{{selector}}[{interval}])",
        "network_receive_packets:rate(node_network_receive_packets_total{{selector}}[{interval}])",
        "network_transmit_bytes:rate(node_network_transmit_bytes_total{{selector}}[{interval}])",
        "network_transmit_drops:rate(node_network_transmit_drop_total{{selector}}[{interval}])",
        "network_transmit_errors:rate(node_network_transmit_errs_total{{selector}}[{interval}])",
        "network_transmit_packets:rate(node_network_transmit_packets_total{{selector}}[{interval}])"
      ]

메트릭 쿼리는 canonical_name:query_string 형식입니다. 쿼리 문자열은 실행 중에 대체되는 두 변수를 지원합니다:

설정 설명
{selector} Prometheus에서 특정 GitLab Runner 인스턴스에 의해 생성된 메트릭을 선택하는 label_name=label_value 쌍으로 대체됩니다.
{interval} 이 referee 구성의 [runners.referees.metrics] 설정에서 query_interval 매개변수로 대체됩니다.