极狐GitLab Runner 支持的 Shell 类型
极狐GitLab Runner 可以执行在不同系统上处理构建的 Shell 脚本生成器。
Shell 脚本包括执行构建的所有步骤的命令:
git clone
- 恢复构建缓存
- 构建命令
- 更新构建缓存
- 生成并上传构建产物
Shell 没有任何配置选项。构建步骤来自 .gitlab-ci.yml
中的 script
指令 中定义的命令。
支持的 Shell 为:
Shell | 状态 | 描述 |
---|---|---|
bash |
完全支持 | Bash(Bourne Again Shell)。所有命令都在 Bash 上下文中执行(所有 Unix 系统默认)。 |
sh |
完全支持 | Sh(Bourne shell)。所有命令都在 Sh 上下文中执行(所有 Unix 系统的 bash 回退)。 |
powershell |
完全支持 | PowerShell 脚本。所有命令都在 PowerShell Desktop 上下文中执行。在极狐GitLab Runner 12.0-13.12 中,这是注册新 Runner 时的默认值。 |
pwsh |
完全支持 | PowerShell 脚本。所有命令都在 PowerShell Core 上下文中执行。在极狐GitLab Runner 14.0 及更高版本中,这是注册新 Runner 时的默认值。 |
cmd |
废弃 | Windows Batch 脚本。所有命令都在 Batch 上下文中执行。被 PowerShell Core 取代,未指定 shell 时的默认值。
|
如果您不想使用默认 Shell 而想选择特定 Shell,您必须在您的 config.toml
文件中指定 Shell。
Sh/Bash Shell
这是所有基于 Unix 的系统上使用的默认 Shell。通过将 Shell 脚本传送到下列命令来执行 .gitlab-ci.yml
中使用的 Bash 脚本。
# This command is used if the build should be executed in context
# of another user (the shell executor)
cat generated-bash-script | su --shell /bin/bash --login user
# This command is used if the build should be executed using
# the current user, but in a login environment
cat generated-bash-script | /bin/bash --login
# This command is used if the build should be executed in
# a Docker environment
cat generated-bash-script | /bin/bash
Shell 配置文件加载
对于某些执行器,Runner 会如上图所示传递 --login
标记,还会加载 Shell 配置文件。 .bashrc
、.bash_logout
或任何其他点文件中的任何内容会在您的作业中执行。
如果作业在 Prepare environment
阶段中失败,很可能是由 Shell 配置文件中的某些内容导致的。
常见失败在您试图清除控制台执行 .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 配置文件的执行器为:
shell
-
parallels
(加载目标虚拟机的 Shell 配置文件) -
virtualbox
(加载目标虚拟机的 Shell 配置文件) -
ssh
(加载目标机的 Shell 配置文件)
PowerShell
PowerShell Desktop 版本是使用极狐GitLab Runner 12.0-13.12 在 Windows 上注册新 Runner 时的默认 Shell。 在 14.0 及更高版本中,默认为 PowerShell Core 版本。
PowerShell 不支持在其他用户的上下文中执行构建。
生成的 PowerShell 脚本通过将其内容保存到文件并将文件名传递给以下命令来执行:
-
对于 PowerShell Desktop 版本:
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" # 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
您可以使用 Start-Process "cmd.exe" "/c C:\Path\file.bat"
为未移植到 PowerShell 的旧 Batch 脚本执行 PowerShell 的 Batch 脚本。
Windows Batch
cmd
Shell,由 PowerShell 取代。
cmd
Shell 仍然包含在未来的极狐GitLab Runner 版本中。
然而,任何 Windows 的新功能都在仅使用 PowerShell 的基础上进行测试和支持。
只有 cmd
Shell 的严重错误和回归会被调查和修复。您可以使用 Start-Process
"cmd.exe" "/c C:\Path\file.bat"
为未移植到 PowerShell 的旧 Batch 脚本执行 PowerShell 的 Batch 脚本。
Windows Batch 是未指定 shell
时,Windows 上使用的默认 Shell。
不支持在另一个用户的上下文中执行构建。
生成的 Batch 脚本通过将其内容保存到文件并将文件名传递给以下命令来执行:
cmd /Q /C generated-windows-batch.cmd
Batch 脚本示例:
@echo off
setlocal enableextensions
setlocal enableDelayedExpansion
set nl=^
echo Running on %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 Cloning repository...
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 Checking out db45ad9a as main...
"git" "checkout" "db45ad9af9d7af5e61b829442fd893d96e31250c"
IF !errorlevel! NEQ 0 exit /b !errorlevel!
IF EXIST "..\..\..\cache\project-1\pages\main\cache.tgz" (
echo Restoring cache...
"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 Restoring cache...
"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 Archiving cache...
"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