GitLab Runner에서 지원하는 쉘의 종류

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

GitLab Runner은 쉘 스크립트 생성기를 구현하여 다른 시스템에서 빌드를 실행할 수 있습니다.

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

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

쉘에는 구성 옵션이 없습니다. 빌드 단계는 .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 프로젝트에 대한 안내입니다. 다음에서 테스트되었습니다.

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