Shell executor
Shell executor는 GitLab Runner가 설치된 기기에서 빌드를 실행하는 데 사용하는 간단한 실행기입니다. Runner가 설치될 수 있는 모든 시스템을 지원합니다. 즉, Bash, PowerShell Core, Windows PowerShell 및 Windows Batch(deprecated)용으로 생성된 스크립트를 사용할 수 있습니다.
특권 사용자로 스크립트 실행
스크립트는 --user
를 gitlab-runner run
명령에 추가하면 비특권 사용자로 실행할 수 있습니다. 이 기능은 Bash에서만 지원됩니다.
소스 프로젝트는 다음 경로에 체크아웃됩니다:
<working-directory>/builds/<short-token>/<concurrent-id>/<namespace>/<project-name>
.
프로젝트 캐시는
<working-directory>/cache/<namespace>/<project-name>
에 저장됩니다.
여기서:
-
<working-directory>
는gitlab-runner run
명령 또는 Runner가 실행 중인 현재 디렉터리에 전달된--working-directory
값입니다. -
<short-token>
은 Runner 토큰의 짧은 버전 (첫 8글자)입니다. -
<concurrent-id>
는 프로젝트의 로컬 작업 ID를 해당 Runner 내에서 고유하게 식별하는 번호입니다 (프로젝트의 컨텍스트 내에서 CI_CONCURRENT_PROJECT_ID 미리 정의된 변수를 통해 액세스 가능함). -
<namespace>
는 GitLab에 저장된 프로젝트의 네임스페이스입니다. -
<project-name>
은 GitLab에 저장된 프로젝트의 이름입니다.
<working-directory>/builds
및 <working-directory/cache
를 덮어쓰려면 config.toml
의 [[runners]]
섹션에서 builds_dir
및 cache_dir
옵션을 지정하세요.
비특권 사용자로 스크립트 실행
GitLab Runner가 Linux에 공식 .deb
또는 .rpm
패키지에서 설치된 경우, 설치 프로그램은 gitlab_ci_multi_runner
사용자를 사용하려고 시도합니다. 찾을 수 없는 경우 gitlab-runner
사용자를 만들어 대신 사용합니다.
그런 다음 모든 쉘 빌드는 gitlab-runner
또는 gitlab_ci_multi_runner
사용자로 실행됩니다.
일부 테스트 시나리오에서 빌드가 Docker Engine이나 VirtualBox와 같은 특권 자원에 액세스해야 할 수 있습니다. 이 경우 gitlab-runner
사용자를 해당 그룹에 추가해야 합니다:
usermod -aG docker gitlab-runner
usermod -aG vboxusers gitlab-runner
셸 선택
GitLab Runner는 특정 셸을 지원합니다. 셸을 선택하려면 config.toml
파일에서 지정하세요. 예를 들어:
...
[[runners]]
name = "shell executor runner"
executor = "shell"
shell = "powershell"
...
보안
일반적으로 셸 executor로 작업을 실행하면 안전하지 않습니다. 작업은 사용자 권한(gitlab-runner
)으로 실행되어이 서버에서 실행되는 다른 프로젝트에서 코드를 “도난”할 수 있습니다. 구성에 따라 작업은 고도로 권한있는 사용자로 서버에서 임의의 명령을 실행할 수 있습니다. 신뢰할 수 있는 사용자가 소유하고 있는 서버에서 신뢰할 수 있는 사용자의 빌드 만을 실행하는 경우에만 사용하세요.
프로세스 종료 및 중단
셸 executor는 각 작업에 대해 새 프로세스에서 스크립트를 시작합니다. UNIX 시스템에서 메인 프로세스를 프로세스 그룹으로 설정합니다.
GitLab Runner는 다음과 같은 경우에 프로세스를 종료합니다:
- 작업이 시간 초과될 때.
- 작업이 취소될 때.
GitLab 13.0 및 이전 버전
UNIX 시스템에서 gitlab-runner
는 프로세스를 종료하기 위해 SIGKILL
을 보냅니다. 왜냐하면 자식 프로세스는 동일한 프로세스 그룹에 속하므로 신호가 그들에게도 전송됩니다. Windows는 taskkill /F /T
를 보냅니다.
GitLab 13.1 및 이후 버전
UNIX 시스템에서 gitlab-runner
는 프로세스와 해당 자식 프로세스에 SIGTERM
을 보내고 10분 후에 SIGKILL
을 보냅니다. 이는 프로세스에 대한 정상적인 종료를 허용합니다. Windows에는 SIGTERM
과 유사한 것이 없으므로 킬 신호가 두 번 보내집니다. 두 번째 신호는 10분 후에 보내집니다.