셸 실행기

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

셸 실행기는 GitLab Runner가 설치된 머신에서 로컬로 빌드를 실행하는 데 사용하는 간단한 실행기입니다. Runner가 설치될 수 있는 모든 시스템을 지원합니다. 즉, Bash, PowerShell Core, Windows PowerShell 및 Windows Batch(더 이상 사용되지 않음)를 위해 생성된 스크립트를 사용할 수 있습니다.

note
GitLab Runner가 셸 실행기를 사용하는 머신에서 일반적인 전제 조건을 충족하는지 확인하세요.

승격된 사용자로 스크립트 실행하기

스크립트는 --usergitlab-runner run 명령에 추가되면 비승격 사용자로 실행될 수 있습니다. 이 기능은 Bash에서만 지원됩니다.

소스 프로젝트는 다음 경로에 체크아웃됩니다:
<working-directory>/builds/<short-token>/<concurrent-id>/<namespace>/<project-name>

프로젝트의 캐시는
<working-directory>/cache/<namespace>/<project-name>에 저장됩니다.

여기서:

  • <working-directory>gitlab-runner run 명령에 전달된 --working-directory의 값입니다. 또는 Runner가 실행 중인 현재 디렉토리입니다.
  • <short-token>은 Runner의 토큰(첫 8자)의 축약형입니다.
  • <concurrent-id>는 특정 Runner의 프로젝트에 대한 로컬 작업 ID를 식별하는 고유한 번호입니다(접근 가능: CI_CONCURRENT_PROJECT_ID 사전 정의 변수).
  • <namespace>는 GitLab에 프로젝트가 저장된 네임스페이스입니다.
  • <project-name>은 GitLab에 저장된 프로젝트의 이름입니다.

<working-directory>/builds<working-directory/cache를 덮어쓰려면 [[runners]] 섹션 아래에서 builds_dircache_dir 옵션을 config.toml에서 지정하세요.

비승격 사용자로 스크립트 실행하기

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"  
...  

보안

일반적으로 셸 실행기로 작업을 실행하는 것은 안전하지 않습니다. 작업은 사용자의 권한(gitlab-runner)으로 실행되며, 이 서버에서 실행되는 다른 프로젝트의 코드를 “훔칠” 수 있습니다. 구성에 따라, 작업은 권한이 높은 사용자로서 서버에서 임의의 명령을 실행할 수 있습니다. 신뢰할 수 있는 사용자로부터 신뢰할 수 있는 서버에서 빌드를 실행하는 데만 사용하세요.

프로세스 종료 및 강제 종료

Shell Executor는 각 작업에 대해 새 프로세스에서 스크립트를 시작합니다. UNIX 시스템에서는 주 프로세스를 프로세스 그룹으로 설정합니다.

GitLab Runner는 다음과 같은 경우에 프로세스를 종료합니다:

UNIX 시스템에서 gitlab-runner는 프로세스와 그 자식 프로세스에 SIGTERM을 보낸 후, 10분 후에 SIGKILL을 보냅니다. 이는 프로세스의 정상 종료를 허용합니다. Windows에는 SIGTERM에 해당하는 신호가 없으므로 종료 신호가 두 번 전송됩니다. 두 번째 신호는 10분 후에 전송됩니다.