InfoGrab Docs

GitLab Runner가 지원하는 셸 유형

요약

GitLab Runner는 다양한 시스템에서 빌드를 실행할 수 있는 셸 스크립트 생성기를 구현합니다. 셸 스크립트에는 빌드의 모든 단계를 실행하는 명령이 포함됩니다: 셸에는 구성 옵션이 없습니다. 기본값이 아닌 특정 셸을 선택하려면 config.toml 파일에서 셸을 지정해야 합니다.

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 Desktop 컨텍스트에서 실행됩니다. Windows에서 kubernetes 및 docker-windows executor 작업의 기본 셸입니다.
pwsh 완전 지원 PowerShell 스크립트. 모든 명령이 PowerShell Core 컨텍스트에서 실행됩니다. Windows에서 새 러너 등록의 기본 셸이며 shell executor 작업의 기본 셸입니다.

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

Sh/Bash 셸#

Sh/Bash는 모든 Unix 기반 시스템에서 사용되는 기본 셸입니다. .gitlab-ci.yml에서 사용되는 bash 스크립트는 다음 명령 중 하나에 셸 스크립트를 파이핑하여 실행됩니다:

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

# 이 명령은 현재 사용자로 실행하지만 로그인 환경에서 실행해야 하는 경우 사용됩니다
cat generated-bash-script | /bin/bash --login

# 이 명령은 Docker 환경에서 실행해야 하는 경우 사용됩니다
cat generated-bash-script | /bin/bash

셸 프로파일 로딩#

특정 executor의 경우, 러너는 위와 같이 --login 플래그를 전달하며, 이는 셸 프로파일도 로드합니다. .bashrc, .bash_logout, 또는 다른 dotfile에 있는 모든 내용이 잡에서 실행됩니다.

잡이 Prepare environment 단계에서 실패하는 경우, 셸 프로파일의 무언가가 실패를 유발하고 있을 가능성이 높습니다. 일반적인 실패 원인은 콘솔을 지우려는 .bash_logout이 있는 경우입니다.

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

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

셸 프로파일을 로드하는 Executor:

  • shell
  • parallels (대상 가상 머신의 셸 프로파일이 로드됩니다)
  • virtualbox (대상 가상 머신의 셸 프로파일이 로드됩니다)
  • ssh (대상 머신의 셸 프로파일이 로드됩니다)

PowerShell#

PowerShell Core는 Windows에서 새 러너 등록의 기본 셸입니다. 그러나 이 등록 기본값은 config.toml에서 shell 값을 명시적으로 설정한 경우에만 적용됩니다. shell이 구성되지 않은 경우:

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" # This will be set to 'Stop' when targetting PowerShell Core

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 실행#

오래된 Batch 스크립트를 PowerShell로 포팅하지 않고 Start-Process "cmd.exe" "/c C:\Path\file.bat"을 사용하여 PowerShell에서 Batch 스크립트를 실행할 수 있습니다.

PowerShell이 기본값일 때 CMD 셸 접근#

GitLab CI에서 기본 PowerShell로부터 CMD 호출하기 프로젝트는 CMD 셸에 접근하는 방법을 보여줍니다. 이 접근 방식은 PowerShell이 러너의 기본 셸인 경우에 동작합니다.

PowerShell 예제 동영상 안내#

GitLab CI에서 PowerShell로 슬라이싱 및 다이싱 동영상은 GitLab CI의 PowerShell 파이프라인 Guided Exploration 프로젝트의 안내입니다. 다음 환경에서 테스트되었습니다:

이 예제는 테스트를 위해 자체 그룹이나 인스턴스에 복사할 수 있습니다. 다른 GitLab CI 패턴에 대한 자세한 내용은 프로젝트 페이지에서 확인할 수 있습니다.

GitLab Runner가 지원하는 셸 유형

Tier: Free, Premium, Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기
요약

GitLab Runner는 다양한 시스템에서 빌드를 실행할 수 있는 셸 스크립트 생성기를 구현합니다. 셸 스크립트에는 빌드의 모든 단계를 실행하는 명령이 포함됩니다: 셸에는 구성 옵션이 없습니다. 기본값이 아닌 특정 셸을 선택하려면 config.toml 파일에서 셸을 지정해야 합니다.

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 Desktop 컨텍스트에서 실행됩니다. Windows에서 kubernetes 및 docker-windows executor 작업의 기본 셸입니다.
pwsh 완전 지원 PowerShell 스크립트. 모든 명령이 PowerShell Core 컨텍스트에서 실행됩니다. Windows에서 새 러너 등록의 기본 셸이며 shell executor 작업의 기본 셸입니다.

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

Sh/Bash 셸#

Sh/Bash는 모든 Unix 기반 시스템에서 사용되는 기본 셸입니다. .gitlab-ci.yml에서 사용되는 bash 스크립트는 다음 명령 중 하나에 셸 스크립트를 파이핑하여 실행됩니다:

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

# 이 명령은 현재 사용자로 실행하지만 로그인 환경에서 실행해야 하는 경우 사용됩니다
cat generated-bash-script | /bin/bash --login

# 이 명령은 Docker 환경에서 실행해야 하는 경우 사용됩니다
cat generated-bash-script | /bin/bash

셸 프로파일 로딩#

특정 executor의 경우, 러너는 위와 같이 --login 플래그를 전달하며, 이는 셸 프로파일도 로드합니다. .bashrc, .bash_logout, 또는 다른 dotfile에 있는 모든 내용이 잡에서 실행됩니다.

잡이 Prepare environment 단계에서 실패하는 경우, 셸 프로파일의 무언가가 실패를 유발하고 있을 가능성이 높습니다. 일반적인 실패 원인은 콘솔을 지우려는 .bash_logout이 있는 경우입니다.

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

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

셸 프로파일을 로드하는 Executor:

  • shell
  • parallels (대상 가상 머신의 셸 프로파일이 로드됩니다)
  • virtualbox (대상 가상 머신의 셸 프로파일이 로드됩니다)
  • ssh (대상 머신의 셸 프로파일이 로드됩니다)

PowerShell#

PowerShell Core는 Windows에서 새 러너 등록의 기본 셸입니다. 그러나 이 등록 기본값은 config.toml에서 shell 값을 명시적으로 설정한 경우에만 적용됩니다. shell이 구성되지 않은 경우:

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" # This will be set to 'Stop' when targetting PowerShell Core

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 실행#

오래된 Batch 스크립트를 PowerShell로 포팅하지 않고 Start-Process "cmd.exe" "/c C:\Path\file.bat"을 사용하여 PowerShell에서 Batch 스크립트를 실행할 수 있습니다.

PowerShell이 기본값일 때 CMD 셸 접근#

GitLab CI에서 기본 PowerShell로부터 CMD 호출하기 프로젝트는 CMD 셸에 접근하는 방법을 보여줍니다. 이 접근 방식은 PowerShell이 러너의 기본 셸인 경우에 동작합니다.

PowerShell 예제 동영상 안내#

GitLab CI에서 PowerShell로 슬라이싱 및 다이싱 동영상은 GitLab CI의 PowerShell 파이프라인 Guided Exploration 프로젝트의 안내입니다. 다음 환경에서 테스트되었습니다:

이 예제는 테스트를 위해 자체 그룹이나 인스턴스에 복사할 수 있습니다. 다른 GitLab CI 패턴에 대한 자세한 내용은 프로젝트 페이지에서 확인할 수 있습니다.