GitLab Runner에서 지원하는 쉘의 종류
GitLab Runner은 쉘 스크립트 생성기를 구현하여 다른 시스템에서 빌드를 실행할 수 있습니다.
쉘 스크립트에는 빌드의 모든 단계를 실행하는 명령이 포함되어 있습니다.
git clone
- 빌드 캐시 복원
- 빌드 명령
- 빌드 캐시 업데이트
- 빌드 아티팩트 생성 및 업로드
쉘에는 구성 옵션이 없습니다. 빌드 단계는 .gitlab-ci.yml
파일의 script
지시문에 정의된 명령에서 받습니다.
지원되는 쉘은 다음과 같습니다:
쉘 | 상태 | 설명 |
---|---|---|
bash
| 완전히 지원됨 | Bash(Bourne Again Shell). 모든 명령이 Bash 환경에서 실행됨(모든 Unix 시스템의 기본값) |
sh
| 완전히 지원됨 | Sh(Bourne shell). 모든 명령이 Sh 환경에서 실행됨(bash 의 Unix 시스템에서의 대체)
|
powershell
| 완전히 지원됨 | PowerShell 스크립트. 모든 명령이 PowerShell 데스크탑 환경에서 실행됨 |
pwsh
| 완전히 지원됨 | PowerShell 스크립트. 모든 명령이 PowerShell Core 환경에서 실행됨. GitLab Runner 14.0 이후, Windows에서 새로운 Runner를 등록할 때 기본값임 |
cmd
| 사용 중단됨 | Windows Batch 스크립트. 모든 명령이 Batch 환경에서 실행됨. PowerShell Core의 대체로 사용 중단됨. shell 을 지정하지 않았을 때 기본값임. PowerShell이 기본 쉘일 때 CMD 쉘에 액세스하는 방법을 확인하세요.
|
기본값 이외의 특정 쉘을 선택하려면 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
쉘 프로필 로드
특정 실행자들은 위에서 보여준 것처럼 --login
플래그를 전달하여 쉘 프로필을 로드합니다. .bashrc
, .bash_logout
,
또는 다른 도트 파일에 있는 내용은 작업에서 실행됩니다.
환경 준비 단계에서 작업 실패하면 쉘 프로필에 문제가 있는 것입니다. 흔한 실패는 .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 데스크톱 에디션은 GitLab Runner를 사용하여 Windows에 새로운 Runner를 등록할 때의 기본 쉘입니다(버전 12.0-13.12). 14.0 이상에서는 기본값은 PowerShell Core 에디션입니다.
PowerShell은 다른 사용자의 환경에서 빌드를 실행하는 것을 지원하지 않습니다.
생성된 PowerShell 스크립트는 해당 내용을 파일로 저장하고 다음 명령에 파일 이름을 전달하여 실행됩니다:
-
PowerShell 데스크톱 에디션의 경우:
powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command generated-windows-powershell.ps1
-
PowerShell Core 에디션의 경우:
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
$CI_COMMIT_BEFORE_SHA="d63117656af6ff57d99e50cc270f854691f335ad"
$env:CI_COMMIT_BEFORE_SHA=$CI_COMMIT_BEFORE_SHA
$CI_COMMIT_REF_NAME="main"
$env:CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME
$CI_JOB_ID="1"
$env:CI_JOB_ID=$CI_JOB_ID
$CI_REPOSITORY_URL="Z:\Gitlab\tests\test"
$env:CI_REPOSITORY_URL=$CI_REPOSITORY_URL
$CI_PROJECT_ID="1"
$env:CI_PROJECT_ID=$CI_PROJECT_ID
$CI_PROJECT_DIR="Z:\Gitlab\tests\test\builds\0\project-1"
$env:CI_PROJECT_DIR=$CI_PROJECT_DIR
$CI_SERVER="yes"
$env:CI_SERVER=$CI_SERVER
$CI_SERVER_NAME="GitLab CI"
$env:CI_SERVER_NAME=$CI_SERVER_NAME
$CI_SERVER_VERSION=""
$env:CI_SERVER_VERSION=$CI_SERVER_VERSION
$CI_SERVER_REVISION=""
$env:CI_SERVER_REVISION=$CI_SERVER_REVISION
$GITLAB_CI="true"
$env:GITLAB_CI=$GITLAB_CI
$GIT_SSL_CAINFO=""
New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null
$GIT_SSL_CAINFO | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO"
$GIT_SSL_CAINFO="C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO"
$env:GIT_SSL_CAINFO=$GIT_SSL_CAINFO
$CI_SERVER_TLS_CA_FILE=""
New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null
$CI_SERVER_TLS_CA_FILE | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE"
$CI_SERVER_TLS_CA_FILE="C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE"
$env:CI_SERVER_TLS_CA_FILE=$CI_SERVER_TLS_CA_FILE
echo "Cloning repository..."
if( (Get-Command -Name Remove-Item2 -Module NTFSSecurity -ErrorAction SilentlyContinue) -and (Test-Path "C:\GitLab-Runner\builds\0\project-1" -PathType Container) ) {
Remove-Item2 -Force -Recurse "C:\GitLab-Runner\builds\0\project-1"
} elseif(Test-Path "C:\GitLab-Runner\builds\0\project-1") {
Remove-Item -Force -Recurse "C:\GitLab-Runner\builds\0\project-1"
}
& "git" "clone" "https://gitlab.com/group/project.git" "Z:\Gitlab\tests\test\builds\0\project-1"
if(!$?) { Exit $LASTEXITCODE }
cd "C:\GitLab-Runner\builds\0\project-1"
if(!$?) { Exit $LASTEXITCODE }
echo "Checking out db45ad9a as main..."
& "git" "checkout" "db45ad9af9d7af5e61b829442fd893d96e31250c"
if(!$?) { Exit $LASTEXITCODE }
if(Test-Path "..\..\..\cache\project-1\pages\main\cache.tgz" -PathType Leaf) {
echo "Restoring cache..."
& "gitlab-runner-windows-amd64.exe" "extract" "--file" "..\..\..\cache\project-1\pages\main\cache.tgz"
if(!$?) { Exit $LASTEXITCODE }
} else {
if(Test-Path "..\..\..\cache\project-1\pages\main\cache.tgz" -PathType Leaf) {
echo "Restoring cache..."
& "gitlab-runner-windows-amd64.exe" "extract" "--file" "..\..\..\cache\project-1\pages\main\cache.tgz"
if(!$?) { Exit $LASTEXITCODE }
}
}
}
if(!$?) { Exit $LASTEXITCODE }
& {
$CI="true"
$env:CI=$CI
$CI_COMMIT_SHA="db45ad9af9d7af5e61b829442fd893d96e31250c"
$env:CI_COMMIT_SHA=$CI_COMMIT_SHA
$CI_COMMIT_BEFORE_SHA="d63117656af6ff57d99e50cc270f854691f335ad"
$env:CI_COMMIT_BEFORE_SHA=$CI_COMMIT_BEFORE_SHA
$CI_COMMIT_REF_NAME="main"
$env:CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME
$CI_JOB_ID="1"
$env:CI_JOB_ID=$CI_JOB_ID
$CI_REPOSITORY_URL="Z:\Gitlab\tests\test"
$env:CI_REPOSITORY_URL=$CI_REPOSITORY_URL
$CI_PROJECT_ID="1"
$env:CI_PROJECT_ID=$CI_PROJECT_ID
$CI_PROJECT_DIR="Z:\Gitlab\tests\test\builds\0\project-1"
$env:CI_PROJECT_DIR=$CI_PROJECT_DIR
$CI_SERVER="yes"
$env:CI_SERVER=$CI_SERVER
$CI_SERVER_NAME="GitLab CI"
$env:CI_SERVER_NAME=$CI_SERVER_NAME
$CI_SERVER_VERSION=""
$env:CI_SERVER_VERSION=$CI_SERVER_VERSION
$CI_SERVER_REVISION=""
$env:CI_SERVER_REVISION=$CI_SERVER_REVISION
$GITLAB_CI="true"
$env:GITLAB_CI=$GITLAB_CI
$GIT_SSL_CAINFO=""
New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null
$GIT_SSL_CAINFO | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO"
$GIT_SSL_CAINFO="C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO"
$env:GIT_SSL_CAINFO=$GIT_SSL_CAINFO
$CI_SERVER_TLS_CA_FILE=""
New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null
$CI_SERVER_TLS_CA_FILE | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE"
$CI_SERVER_TLS_CA_FILE="C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE"
$env:CI_SERVER_TLS_CA_FILE=$CI_SERVER_TLS_CA_FILE
cd "C:\GitLab-Runner\builds\0\project-1"
if(!$?) { Exit $LASTEXITCODE }
echo "`$ echo true"
echo true
}
if(!$?) { Exit $LASTEXITCODE }
& {
$CI="true"
$env:CI=$CI
$CI_COMMIT_SHA="db45ad9af9d7af5e61b829442fd893d96e31250c"
$env:CI_COMMIT_SHA=$CI_COMMIT_SHA
$CI_COMMIT_BEFORE_SHA="d63117656af6ff57d99e50cc270f854691f335ad"
$env:CI_COMMIT_BEFORE_SHA=$CI_COMMIT_BEFORE_SHA
$CI_COMMIT_REF_NAME="main"
$env:CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME
$CI_JOB_ID="1"
$env:CI_JOB_ID=$CI_JOB_ID
$CI_REPOSITORY_URL="Z:\Gitlab\tests\test"
$env:CI_REPOSITORY_URL=$CI_REPOSITORY_URL
$CI_PROJECT_ID="1"
$env:CI_PROJECT_ID=$CI_PROJECT_ID
$CI_PROJECT_DIR="Z:\Gitlab\tests\test\builds\0\project-1"
$env:CI_PROJECT_DIR=$CI_PROJECT_DIR
$CI_SERVER="yes"
$env:CI_SERVER=$CI_SERVER
$CI_SERVER_NAME="GitLab CI"
$env:CI_SERVER_NAME=$CI_SERVER_NAME
$CI_SERVER_VERSION=""
$env:CI_SERVER_VERSION=$CI_SERVER_VERSION
$CI_SERVER_REVISION=""
$env:CI_SERVER_REVISION=$CI_SERVER_REVISION
$GITLAB_CI="true"
$env:GITLAB_CI=$GITLAB_CI
$GIT_SSL_CAINFO=""
New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null
$GIT_SSL_CAINFO | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO"
$GIT_SSL_CAINFO="C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO"
$env:GIT_SSL_CAINFO=$GIT_SSL_CAINFO
$CI_SERVER_TLS_CA_FILE=""
New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null
$CI_SERVER_TLS_CA_FILE | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE"
$CI_SERVER_TLS_CA_FILE="C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE"
$env:CI_SERVER_TLS_CA_FILE=$CI_SERVER_TLS_CA_FILE
cd "C:\GitLab-Runner\builds\0\project-1"
if(!$?) { Exit $LASTEXITCODE }
echo "Archiving cache..."
& "gitlab-runner-windows-amd64.exe" "archive" "--file" "..\..\..\cache\project-1\pages\main\cache.tgz" "--path" "vendor"
if(!$?) { Exit $LASTEXITCODE }
}
if(!$?) { Exit $LASTEXITCODE }
### Windows Batch 실행
이전에 PowerShell로 이식되지 않은 구 버전의 Batch 스크립트를 PowerShell에서 `Start-Process "cmd.exe" "/c C:\Path\file.bat"`를 사용하여 실행할 수 있습니다.
## Windows Batch
참고:
GitLab Runner의 Windows Batch 실행기(`cmd` 셸)는 [PowerShell](#powershell)을 선호하여 더 이상 사용되지 않습니다. 그러나 `cmd` 셸은 향후 버전에 포함되어 있지만, Windows용 새로운 기능은 PowerShell을 사용하기 위해 테스트되고 지원됩니다. `cmd` 셸에 대한 중요한 버그 및 회귀만이 조사되고 수정될 것입니다.
이전에 PowerShell로 이식되지 않은 구 버전의 Batch 스크립트를 PowerShell에서 `Start-Process "cmd.exe" "/c C:\Path\file.bat"`를 사용하여 실행할 수 있습니다.
Windows Batch는 [`shell`](../configuration/advanced-configuration.md#the-runners-section)이 지정되지 않은 경우 Windows에서 사용되는 기본 쉘입니다.
다른 사용자의 빌드 환경에서 빌드를 실행하는 것을 지원하지 않습니다.
생성된 Batch 스크립트는 해당 내용을 파일로 저장한 후, 파일명을 다음 명령에 전달하여 실행됩니다:
```batch
cmd /Q /C generated-windows-batch.cmd
다음은 Batch 스크립트의 예시입니다:
@echo off
setlocal enableextensions
setlocal enableDelayedExpansion
set nl=^
echo Running on %COMPUTERNAME%...
...
goto :EOF
기본 쉘로 PowerShell이 설정된 경우 CMD 쉘에 액세스하는 방법
프로젝트: GitLab CI에서 기본 PowerShell에서 CMD 호출은 실행중인 러너에서 PowerShell이 기본 쉘일 때 CMD 쉘에 액세스하는 방법을 보여줍니다.
작동하는 PowerShell 예제에 대한 비디오 안내
GitLab CI에서 PowerShell을 사용한 자르기 및 잘라내기 비디오는 GitLab CI의 PowerShell 파이프라인 Guided Exploration 프로젝트에 대한 안내입니다. 다음에서 테스트되었습니다.
- Windows PowerShell 및 GitLab의 PowerShell Core 7 Windows 공유 러너.
- Docker-Machine 러너에서 Linux 컨테이너의 PowerShell Core 7.
이 예제는 귀하의 그룹이나 인스턴스로 복사하여 테스트할 수 있습니다. 다른 GitLab CI 패턴들이 어떻게 시연되는지에 대한 자세한 내용은 프로젝트 페이지에서 확인할 수 있습니다.