GitLab Runner에서 지원하는 셸 유형
GitLab Runner은 실행 환경에 따라 빌드를 실행할 수 있도록 하는 셸 스크립트 생성기를 구현합니다.
셸 스크립트에는 빌드의 모든 단계를 실행하는 명령이 포함되어 있습니다.
git clone
- 빌드 캐시 복원
- 빌드 명령
- 빌드 캐시 업데이트
- 빌드 아티팩트 생성 및 업로드
셸에는 구성 옵션이 없습니다. 빌드 단계는 .gitlab-ci.yml
의 script
지시문에 정의된 명령에서 받습니다.
지원되는 셸은 다음과 같습니다:
셸 | 상태 | 설명 |
---|---|---|
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
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 패턴이 시연되는지에 대한 자세한 내용은 프로젝트 페이지에서 확인할 수 있습니다.