极狐GitLab Runner 支持的 shell 类型
- Tier: 基础版, 专业版, 旗舰版
- Offering: JihuLab.com, 私有化部署
极狐GitLab Runner 实现了 shell 脚本生成器,允许在不同系统上执行构建。
这些 shell 脚本包含执行构建所有步骤的命令:
- git clone
- 恢复构建缓存
- 构建命令
- 更新构建缓存
- 生成并上传构建产物
这些 shell 没有任何配置选项。构建步骤是从 .gitlab-ci.yml 中的 script 指令定义的命令中接收的。
支持的 shell 有:
| Shell | Status | Description |
|---|---|---|
| bash | Fully Supported | Bash (Bourne Again Shell)。所有命令在 Bash 环境中执行(所有 Unix 系统的默认值) |
| sh | Fully Supported | Sh (Bourne shell)。所有命令在 Sh 环境中执行(所有 Unix 系统中 bash 的回退) |
| powershell | Fully Supported | PowerShell 脚本。所有命令在 PowerShell Desktop 环境中执行。 |
| pwsh | Fully Supported | PowerShell 脚本。所有命令在 PowerShell Core 环境中执行。在极狐GitLab Runner 14.0 及更高版本中,注册新 runner 时在 Windows 上默认使用此选项。 |
如果想要选择默认值以外的特定 shell 使用,必须在 config.toml 文件中指定 shell。
Sh/Bash shell
Sh/Bash 是所有基于 Unix 系统的默认 shell。在 .gitlab-ci.yml 中使用的 bash 脚本通过将 shell 脚本传递给以下命令之一来执行:
shell1# 如果构建应该在另一个用户的上下文中执行(shell executor),则使用此命令 2cat generated-bash-script | su --shell /bin/bash --login user 3 4# 如果构建应该使用当前用户执行,但在登录环境中,则使用此命令 5cat generated-bash-script | /bin/bash --login 6 7# 如果构建应该在 Docker 环境中执行,则使用此命令 8cat generated-bash-script | /bin/bash
Shell 配置文件加载
对于某些执行器,runner 会传递如上所示的 --login 标志,这也会加载 shell 配置文件。任何在 .bashrc、.bash_logout 或任何其他点文件中的内容,都会在您的作业中执行。
如果在准备环境 阶段作业失败,很可能是 shell 配置文件中的某些内容导致了失败。常见的失败是 .bash_logout 尝试清除控制台。
要排除此错误,请检查 /home/gitlab-runner/.bash_logout。例如,如果 .bash_logout 文件有如下面的脚本部分,将其注释掉并重新启动流水线:
shellif [ "$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 Edition 是在 Windows 上使用极狐GitLab Runner 12.0-13.12 注册新 runner 时的默认 shell。在 14.0 及更高版本中,默认是 PowerShell Core Edition。
PowerShell 不支持在另一个用户的上下文中执行构建。
生成的 PowerShell 脚本通过将其内容保存到文件并将文件名传递给以下命令来执行:
-
对于 PowerShell Desktop Edition:
batchpowershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command generated-windows-powershell.ps1 -
对于 PowerShell Core Edition:
batchpwsh -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command generated-windows-powershell.ps1
以下是一个示例 PowerShell 脚本:
powershell1$ErrorActionPreference = "Continue" # This will be set to 'Stop' when targetting PowerShell Core 2 3echo "Running on $([Environment]::MachineName)..." 4 5& { 6 $CI="true" 7 $env:CI=$CI 8 $CI_COMMIT_SHA="db45ad9af9d7af5e61b829442fd893d96e31250c" 9 $env:CI_COMMIT_SHA=$CI_COMMIT_SHA 10 $CI_COMMIT_BEFORE_SHA="d63117656af6ff57d99e50cc270f854691f335ad" 11 $env:CI_COMMIT_BEFORE_SHA=$CI_COMMIT_BEFORE_SHA 12 $CI_COMMIT_REF_NAME="main" 13 $env:CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME 14 $CI_JOB_ID="1" 15 $env:CI_JOB_ID=$CI_JOB_ID 16 $CI_REPOSITORY_URL="Z:\Gitlab\tests\test" 17 $env:CI_REPOSITORY_URL=$CI_REPOSITORY_URL 18 $CI_PROJECT_ID="1" 19 $env:CI_PROJECT_ID=$CI_PROJECT_ID 20 $CI_PROJECT_DIR="Z:\Gitlab\tests\test\builds\0\project-1" 21 $env:CI_PROJECT_DIR=$CI_PROJECT_DIR 22 $CI_SERVER="yes" 23 $env:CI_SERVER=$CI_SERVER 24 $CI_SERVER_NAME="GitLab CI" 25 $env:CI_SERVER_NAME=$CI_SERVER_NAME 26 $CI_SERVER_VERSION="" 27 $env:CI_SERVER_VERSION=$CI_SERVER_VERSION 28 $CI_SERVER_REVISION="" 29 $env:CI_SERVER_REVISION=$CI_SERVER_REVISION 30 $GITLAB_CI="true" 31 $env:GITLAB_CI=$GITLAB_CI 32 $GIT_SSL_CAINFO="" 33 New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null 34 $GIT_SSL_CAINFO | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO" 35 $GIT_SSL_CAINFO="C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO" 36 $env:GIT_SSL_CAINFO=$GIT_SSL_CAINFO 37 $CI_SERVER_TLS_CA_FILE="" 38 New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null 39 $CI_SERVER_TLS_CA_FILE | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE" 40 $CI_SERVER_TLS_CA_FILE="C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE" 41 $env:CI_SERVER_TLS_CA_FILE=$CI_SERVER_TLS_CA_FILE 42 echo "Cloning repository..." 43 if( (Get-Command -Name Remove-Item2 -Module NTFSSecurity -ErrorAction SilentlyContinue) -and (Test-Path "C:\GitLab-Runner\builds\0\project-1" -PathType Container) ) { 44 Remove-Item2 -Force -Recurse "C:\GitLab-Runner\builds\0\project-1" 45 } elseif(Test-Path "C:\GitLab-Runner\builds\0\project-1") { 46 Remove-Item -Force -Recurse "C:\GitLab-Runner\builds\0\project-1" 47 } 48 49 & "git" "clone" "https://gitlab.com/group/project.git" "Z:\Gitlab\tests\test\builds\0\project-1" 50 if(!$?) { Exit $LASTEXITCODE } 51 52 cd "C:\GitLab-Runner\builds\0\project-1" 53 if(!$?) { Exit $LASTEXITCODE } 54 55 echo "Checking out db45ad9a as main..." 56 & "git" "checkout" "db45ad9af9d7af5e61b829442fd893d96e31250c" 57 if(!$?) { Exit $LASTEXITCODE } 58 59 if(Test-Path "..\..\..\cache\project-1\pages\main\cache.tgz" -PathType Leaf) { 60 echo "Restoring cache..." 61 & "gitlab-runner-windows-amd64.exe" "extract" "--file" "..\..\..\cache\project-1\pages\main\cache.tgz" 62 if(!$?) { Exit $LASTEXITCODE } 63 64 } else { 65 if(Test-Path "..\..\..\cache\project-1\pages\main\cache.tgz" -PathType Leaf) { 66 echo "Restoring cache..." 67 & "gitlab-runner-windows-amd64.exe" "extract" "--file" "..\..\..\cache\project-1\pages\main\cache.tgz" 68 if(!$?) { Exit $LASTEXITCODE } 69 70 } 71 } 72} 73if(!$?) { Exit $LASTEXITCODE } 74 75& { 76 $CI="true" 77 $env:CI=$CI 78 $CI_COMMIT_SHA="db45ad9af9d7af5e61b829442fd893d96e31250c" 79 $env:CI_COMMIT_SHA=$CI_COMMIT_SHA 80 $CI_COMMIT_BEFORE_SHA="d63117656af6ff57d99e50cc270f854691f335ad" 81 $env:CI_COMMIT_BEFORE_SHA=$CI_COMMIT_BEFORE_SHA 82 $CI_COMMIT_REF_NAME="main" 83 $env:CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME 84 $CI_JOB_ID="1" 85 $env:CI_JOB_ID=$CI_JOB_ID 86 $CI_REPOSITORY_URL="Z:\Gitlab\tests\test" 87 $env:CI_REPOSITORY_URL=$CI_REPOSITORY_URL 88 $CI_PROJECT_ID="1" 89 $env:CI_PROJECT_ID=$CI_PROJECT_ID 90 $CI_PROJECT_DIR="Z:\Gitlab\tests\test\builds\0\project-1" 91 $env:CI_PROJECT_DIR=$CI_PROJECT_DIR 92 $CI_SERVER="yes" 93 $env:CI_SERVER=$CI_SERVER 94 $CI_SERVER_NAME="GitLab CI" 95 $env:CI_SERVER_NAME=$CI_SERVER_NAME 96 $CI_SERVER_VERSION="" 97 $env:CI_SERVER_VERSION=$CI_SERVER_VERSION 98 $CI_SERVER_REVISION="" 99 $env:CI_SERVER_REVISION=$CI_SERVER_REVISION 100 $GITLAB_CI="true" 101 $env:GITLAB_CI=$GITLAB_CI 102 $GIT_SSL_CAINFO="" 103 New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null 104 $GIT_SSL_CAINFO | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO" 105 $GIT_SSL_CAINFO="C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO" 106 $env:GIT_SSL_CAINFO=$GIT_SSL_CAINFO 107 $CI_SERVER_TLS_CA_FILE="" 108 New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null 109 $CI_SERVER_TLS_CA_FILE | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE" 110 $CI_SERVER_TLS_CA_FILE="C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE" 111 $env:CI_SERVER_TLS_CA_FILE=$CI_SERVER_TLS_CA_FILE 112 cd "C:\GitLab-Runner\builds\0\project-1" 113 if(!$?) { Exit $LASTEXITCODE } 114 115 echo "`$ echo true" 116 echo true 117} 118if(!$?) { Exit $LASTEXITCODE } 119 120& { 121 $CI="true" 122 $env:CI=$CI 123 $CI_COMMIT_SHA="db45ad9af9d7af5e61b829442fd893d96e31250c" 124 $env:CI_COMMIT_SHA=$CI_COMMIT_SHA 125 $CI_COMMIT_BEFORE_SHA="d63117656af6ff57d99e50cc270f854691f335ad" 126 $env:CI_COMMIT_BEFORE_SHA=$CI_COMMIT_BEFORE_SHA 127 $CI_COMMIT_REF_NAME="main" 128 $env:CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME 129 $CI_JOB_ID="1" 130 $env:CI_JOB_ID=$CI_JOB_ID 131 $CI_REPOSITORY_URL="Z:\Gitlab\tests\test" 132 $env:CI_REPOSITORY_URL=$CI_REPOSITORY_URL 133 $CI_PROJECT_ID="1" 134 $env:CI_PROJECT_ID=$CI_PROJECT_ID 135 $CI_PROJECT_DIR="Z:\Gitlab\tests\test\builds\0\project-1" 136 $env:CI_PROJECT_DIR=$CI_PROJECT_DIR 137 $CI_SERVER="yes" 138 $env:CI_SERVER=$CI_SERVER 139 $CI_SERVER_NAME="GitLab CI" 140 $env:CI_SERVER_NAME=$CI_SERVER_NAME 141 $CI_SERVER_VERSION="" 142 $env:CI_SERVER_VERSION=$CI_SERVER_VERSION 143 $CI_SERVER_REVISION="" 144 $env:CI_SERVER_REVISION=$CI_SERVER_REVISION 145 $GITLAB_CI="true" 146 $env:GITLAB_CI=$GITLAB_CI 147 $GIT_SSL_CAINFO="" 148 New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null 149 $GIT_SSL_CAINFO | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO" 150 $GIT_SSL_CAINFO="C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO" 151 $env:GIT_SSL_CAINFO=$GIT_SSL_CAINFO 152 $CI_SERVER_TLS_CA_FILE="" 153 New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null 154 $CI_SERVER_TLS_CA_FILE | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE" 155 $CI_SERVER_TLS_CA_FILE="C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE" 156 $env:CI_SERVER_TLS_CA_FILE=$CI_SERVER_TLS_CA_FILE 157 cd "C:\GitLab-Runner\builds\0\project-1" 158 if(!$?) { Exit $LASTEXITCODE } 159 160 echo "Archiving cache..." 161 & "gitlab-runner-windows-amd64.exe" "archive" "--file" "..\..\..\cache\project-1\pages\main\cache.tgz" "--path" "vendor" 162 if(!$?) { Exit $LASTEXITCODE } 163 164} 165if(!$?) { Exit $LASTEXITCODE }
运行 Windows Batch
可以使用 Start-Process "cmd.exe" "/c C:\Path\file.bat" 从 PowerShell 执行 Batch 脚本,以运行未移植到 PowerShell 的旧 Batch 脚本。