GitLab Runner에서 지원하는 셸 유형

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

GitLab Runner은 실행 환경에 따라 빌드를 실행할 수 있도록 하는 셸 스크립트 생성기를 구현합니다.

셸 스크립트에는 빌드의 모든 단계를 실행하는 명령이 포함되어 있습니다.

  1. git clone
  2. 빌드 캐시 복원
  3. 빌드 명령
  4. 빌드 캐시 업데이트
  5. 빌드 아티팩트 생성 및 업로드

셸에는 구성 옵션이 없습니다. 빌드 단계는 .gitlab-ci.ymlscript 지시문에 정의된 명령에서 받습니다.

지원되는 셸은 다음과 같습니다:

상태 설명
bash 완전히 지원됨 Bash (Bourne Again Shell). Bash 환경에서 모든 명령이 실행됨 (Unix 시스템의 기본값)
sh 완전히 지원됨 Sh (Bourne shell). Sh 환경에서 모든 명령이 실행됨 (모든 Unix 시스템의 bash의 대체)
powershell 완전히 지원됨 PowerShell 스크립트. 모든 명령이 PowerShell 데스크톱 환경에서 실행됨.
pwsh 완전히 지원됨 PowerShell 스크립트. 모든 명령이 PowerShell Core 환경에서 실행됨. GitLab Runner 14.0 이상에서는 Windows에서 새 runner를 등록할 때 기본값입니다.
cmd 사용 중단됨 Windows 배치 스크립트. 모든 명령이 배치 환경에서 실행됨. PowerShell Core를 선호하도록 사용 중단됨. shell을 지정하지 않았을 때의 기본값

기본값 이외의 특정 셸을 선택하려면 config.toml 파일에서 셸을 지정해야 합니다.

Sh/Bash 셸

이것은 Unix 기반 시스템에서 사용하는 기본 셸입니다. .gitlab-ci.yml에서 사용된 bash 스크립트는 다음 명령어 중 하나에 파이프하여 실행됩니다:

# 빌드를 다른 사용자의 컨텍스트에서 실행해야 하는 경우 (셸 실행자)
cat generated-bash-script | su --shell /bin/bash --login user

# 현재 사용자를 사용하지만 로그인 환경에서 실행해야 하는 경우
cat generated-bash-script | /bin/bash --login

# Docker 환경에서 실행해야 하는 경우
cat generated-bash-script | /bin/bash

셸 프로필 로드

일부 실행자는 위에 표시된 것처럼 셸 프로필을 로드합니다. .bashrc, .bash_logout, 또는 다른 dotfile에 있는 내용이 작업에서 실행됩니다.

환경 설정 준비 단계에서 작업이 실패하는 경우, 셸 프로필의 내용이 실패의 원인이 될 수 있습니다. 일반적인 실패는 .bash_logout에서 콘솔을 지우려고 시도하는 경우입니다.

이 오류를 해결하려면 /home/gitlab-runner/.bash_logout을 확인하십시오. 예를 들어, .bash_logout 파일에 다음과 같은 스크립트 부분이 있는 경우 주석 처리하고 파이프라인을 다시 시작하십시오:

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

셸 프로필을 로드하는 실행자:

  • shell
  • parallels (대상 가상 머신의 셸 프로필이 로드됨)
  • virtualbox (대상 가상 머신의 셸 프로필이 로드됨)
  • ssh (대상 컴퓨터의 셸 프로필이 로드됨)

PowerShell

PowerShell Desktop Edition은 GitLab Runner를 사용하여 Windows에 새 runner를 등록할 때 기본 셸입니다(버전 12.0-13.12). 14.0 이상에서는 기본값이 PowerShell Core Edition입니다.

PowerShell은 다른 사용자의 컨텍스트에서 빌드를 실행하는 것을 지원하지 않습니다.

생성된 PowerShell 스크립트는 내용을 파일에 저장하고 다음 명령에 파일 이름을 전달하여 실행됩니다:

  • PowerShell Desktop Edition의 경우:

    powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command generated-windows-powershell.ps1
    
  • PowerShell Core Edition의 경우:

    pwsh -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command generated-windows-powershell.ps1
    

다음은 PowerShell 스크립트의 예시입니다:

$ErrorActionPreference = "Continue" # PowerShell Core를 대상으로 설정될 경우 'Stop'으로 설정됨

echo "Running on $([Environment]::MachineName)..."

& {
  $CI="true"
  $env:CI=$CI
  $CI_COMMIT_SHA="db45ad9af9d7af5e61b829442fd893d96e31250c"
  $env:CI_COMMIT_SHA=$CI_COMMIT_SHA
  ...
  [중략]
  ...
}

Windows Batch 실행

이전의 Batch 스크립트가 PowerShell로 이동되지 않은 경우, PowerShell에서 Start-Process "cmd.exe" "/c C:\Path\file.bat"을 사용하여 Batch 스크립트를 실행할 수 있습니다.

Windows Batch

note
GitLab Runner의 Windows Batch 실행기(cmd 셸)는 PowerShell을 선호하여 폐기되었습니다. cmd 셸은 이후의 GitLab Runner 버전에도 포함되어 있지만, Windows용 새로운 기능은 PowerShell만 지원하도록 테스트 및 지원될 예정입니다. cmd 셸의 중요한 버그 및 회귀만 조사하고 수정됩니다.

이전에 PowerShell로 이동되지 않은 Batch 스크립트를 PowerShell에서 실행하려면 다음을 사용할 수 있습니다. powershell Start-Process "cmd.exe" "/c C:\Path\file.bat"

shell이 명시되지 않은 경우, Windows에서 기본적으로 사용되는 셸은 Windows Batch입니다.

또한, 다른 사용자의 콘텍스트에서 빌드를 실행하지 않습니다.

생성된 Batch 스크립트는 파일에 내용을 저장하고 다음 명령어에 파일 이름을 전달하여 실행됩니다:

cmd /Q /C generated-windows-batch.cmd

다음은 Batch 스크립트의 예시입니다:

```batch @echo off setlocal enableextensions setlocal enableDelayedExpansion set nl=^

echo %COMPUTERNAME%에서 실행 중…

call :prescript IF !errorlevel! NEQ 0 exit /b !errorlevel!

call :buildscript IF !errorlevel! NEQ 0 exit /b !errorlevel!

call :postscript IF !errorlevel! NEQ 0 exit /b !errorlevel!

goto :EOF :prescript SET CI=true SET CI_COMMIT_SHA=db45ad9af9d7af5e61b829442fd893d96e31250c SET CI_COMMIT_BEFORE_SHA=d63117656af6ff57d99e50cc270f854691f335ad SET CI_COMMIT_REF_NAME=main SET CI_JOB_ID=1 SET CI_REPOSITORY_URL=http://gitlab.example.com/group/project.git SET CI_PROJECT_ID=1 SET CI_PROJECT_DIR=Z:\Gitlab\tests\test\builds\0\project-1 SET CI_SERVER=yes SET CI_SERVER_NAME=GitLab CI SET CI_SERVER_VERSION= SET CI_SERVER_REVISION= SET GITLAB_CI=true md “C:\GitLab-Runner\builds\0\project-1.tmp” 2>NUL 1>NUL echo multiline!nl!tls!nl!chain > C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO SET GIT_SSL_CAINFO=C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO md “C:\GitLab-Runner\builds\0\project-1.tmp” 2>NUL 1>NUL echo multiline!nl!tls!nl!chain > C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE SET CI_SERVER_TLS_CA_FILE=C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE echo 리포지터리 복제 중… rd /s /q “C:\GitLab-Runner\builds\0\project-1” 2>NUL 1>NUL “git” “clone” “http://gitlab.example.com/group/project.git” “Z:\Gitlab\tests\test\builds\0\project-1” IF !errorlevel! NEQ 0 exit /b !errorlevel!

cd /D “C:\GitLab-Runner\builds\0\project-1” IF !errorlevel! NEQ 0 exit /b !errorlevel!

echo db45ad9a를 main으로 체크아웃 중… “git” “checkout” “db45ad9af9d7af5e61b829442fd893d96e31250c” IF !errorlevel! NEQ 0 exit /b !errorlevel!

IF EXIST “......\cache\project-1\pages\main\cache.tgz” ( echo 캐시 복원 중… “gitlab-runner-windows-amd64.exe” “extract” “–file” “......\cache\project-1\pages\main\cache.tgz” IF !errorlevel! NEQ 0 exit /b !errorlevel!

) ELSE ( IF EXIST “......\cache\project-1\pages\main\cache.tgz” ( echo 캐시 복원 중… “gitlab-runner-windows-amd64.exe” “extract” “–file” “......\cache\project-1\pages\main\cache.tgz” IF !errorlevel! NEQ 0 exit /b !errorlevel!

) ) goto :EOF

:buildscript SET CI=true SET CI_COMMIT_SHA=db45ad9af9d7af5e61b829442fd893d96e31250c SET CI_COMMIT_BEFORE_SHA=d63117656af6ff57d99e50cc270f854691f335ad SET CI_COMMIT_REF_NAME=main SET CI_JOB_ID=1 SET CI_REPOSITORY_URL=Z:\Gitlab\tests\test SET CI_PROJECT_ID=1 SET CI_PROJECT_DIR=Z:\Gitlab\tests\test\builds\0\project-1 SET CI_SERVER=yes SET CI_SERVER_NAME=GitLab CI SET CI_SERVER_VERSION= SET CI_SERVER_REVISION= SET GITLAB_CI=true md “C:\GitLab-Runner\builds\0\project-1.tmp” 2>NUL 1>NUL echo multiline!nl!tls!nl!chain > C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO SET GIT_SSL_CAINFO=C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO md “C:\GitLab-Runner\builds\0\project-1.tmp” 2>NUL 1>NUL echo multiline!nl!tls!nl!chain > C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE SET CI_SERVER_TLS_CA_FILE=C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE cd /D “C:\GitLab-Runner\builds\0\project-1” IF !errorlevel! NEQ 0 exit /b !errorlevel!

echo $ echo true echo true goto :EOF

:postscript SET CI=true SET CI_COMMIT_SHA=db45ad9af9d7af5e61b829442fd893d96e31250c SET CI_COMMIT_BEFORE_SHA=d63117656af6ff57d99e50cc270f854691f335ad SET CI_COMMIT_REF_NAME=main SET CI_JOB_ID=1 SET CI_REPOSITORY_URL=Z:\Gitlab\tests\test SET CI_PROJECT_ID=1 SET CI_PROJECT_DIR=Z:\Gitlab\tests\test\builds\0\project-1 SET CI_SERVER=yes SET CI_SERVER_NAME=GitLab CI SET CI_SERVER_VERSION= SET CI_SERVER_REVISION= SET GITLAB_CI=true md “C:\GitLab-Runner\builds\0\project-1.tmp” 2>NUL 1>NUL echo multiline!nl!tls!nl!chain > C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO SET GIT_SSL_CAINFO=C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO md “C:\GitLab-Runner\builds\0\project-1.tmp” 2>NUL 1>NUL echo multiline!nl!tls!nl!chain > C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE SET CI_SERVER_TLS_CA_FILE=C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE cd /D “C:\GitLab-Runner\builds\0\project-1” IF !errorlevel! NEQ 0 exit /b !errorlevel!

echo 캐시 아카이빙 중… “gitlab-runner-windows-amd64.exe” “archive” “–file” “......\cache\project-1\pages\main\cache.tgz” “–path” “vendor” IF !errorlevel! NEQ 0 exit /b !errorlevel!

goto :EOF

기본 PowerShell에서 CMD 셸에 액세스하는 방법

프로젝트: Call CMD From Default PowerShell in GitLab CI는 러너에서 PowerShell이 기본 셸일 때 CMD 셸에 액세스하는 방법을 보여줍니다.

작동 중인 PowerShell 예제의 비디오 안내

GitLab CI에서 PowerShell로 Slicing and Dicing 비디오는 GitLab CI의 PowerShell 파이프라인 Guided Exploration 프로젝트의 안내입니다. 다음에서 시험되었습니다:

  • GitLab의 Windows 공유 러너에서의 Windows PowerShell 및 PowerShell Core 7(https://docs.gitlab.com/ee/ci/runners/saas/windows_saas_runner.html).
  • Docker-Machine 러너에서 리눅스 컨테이너의 PowerShell Core 7.

예제를 귀하의 그룹이나 인스턴스로 복사하여 테스트할 수 있습니다. 어떤 다른 GitLab CI 패턴이 시연되는지에 대한 자세한 내용은 프로젝트 페이지에서 확인할 수 있습니다.