极狐 GitLab

极狐GitLab Runner 支持的 Shell 类型

Tier: 基础版,专业版,旗舰版

Offering: JihuLab.com,私有化部署

极狐GitLab Runner 实现了 Shell 脚本生成器,允许在不同系统上执行构建。

Shell 脚本包含执行构建所有步骤的命令:

  1. git clone
  2. 恢复构建缓存
  3. 构建命令
  4. 更新构建缓存
  5. 生成并上传构建产物

这些 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 上下文中执行。使用 kubernetes 和 docker-windows 执行器的 Windows 作业的默认 Shell。
pwsh完全支持PowerShell 脚本。所有命令在 PowerShell Core 上下文中执行。Windows 上新注册 Runner 以及使用 shell 执行器的作业的默认 Shell。

如果您想选择默认值以外的特定 Shell,必须在 config.toml 文件中指定 Shell。

Sh/Bash Shell#

Sh/Bash 是所有基于 Unix 的系统上使用的默认 Shell。.gitlab-ci.yml中使用的 Bash 脚本通过将 Shell 脚本管道传递给以下命令之一来执行:

shell
1# This command is used if the build should be executed in context 2# of another user (the shell executor) 3cat generated-bash-script | su --shell /bin/bash --login user 4 5# This command is used if the build should be executed using 6# the current user, but in a login environment 7cat generated-bash-script | /bin/bash --login 8 9# This command is used if the build should be executed in 10# a Docker environment 11cat generated-bash-script | /bin/bash

Shell 配置文件加载#

对于某些执行器,Runner 会如上所示传递 --login 标志,这也会加载 Shell 配置文件。您在 .bashrc、.bash_logout 或任何其他点文件中的任何内容都会在您的作业中执行。

如果作业在 Prepare environment 阶段失败,很可能是 Shell 配置文件中的某些内容导致了失败。常见的失败原因是存在试图清除控制台的 .bash_logout。

要排查此错误,请检查 /home/gitlab-runner/.bash_logout。例如,如果 .bash_logout 文件包含如下脚本部分,请将其注释掉并重新启动流水线:

shell
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 Core 是 Windows 上新注册 Runner 的默认 Shell。但是,此注册默认值仅在您在 config.toml中显式设置 shell 值时适用。 当未配置 shell 时:

  • docker-windows 和 kubernetes 执行器在运行时默认使用 PowerShell Desktop。
  • shell 执行器默认使用 PowerShell Core。

PowerShell 不支持以其他用户的身份执行构建。

生成的 PowerShell 脚本通过将其内容保存到文件并将文件名传递给以下命令来执行:

  • 对于 PowerShell Desktop Edition:

    batch
    powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command generated-windows-powershell.ps1
  • 对于 PowerShell Core Edition:

    batch
    pwsh -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command generated-windows-powershell.ps1

以下是一个 PowerShell 脚本示例:

powershell
1$ErrorActionPreference = "Continue" # This will be set to 'Stop' when targeting 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 $item = Get-Item -Force "C:\GitLab-Runner\builds\0\project-1" 47 if ($item.LinkType -or -not $item.PSIsContainer) { 48 Remove-Item -Force "C:\GitLab-Runner\builds\0\project-1" -ErrorAction Stop 49 } else { 50 Get-ChildItem -Path "C:\GitLab-Runner\builds\0\project-1" -Force -Recurse -ErrorAction Stop | Sort-Object { $_.FullName.Length } -Descending | Remove-Item -Force -ErrorAction Stop 51 Remove-Item -Force "C:\GitLab-Runner\builds\0\project-1" -ErrorAction Stop 52 } 53 } 54 55 & "git" "clone" "https://gitlab.com/group/project.git" "Z:\Gitlab\tests\test\builds\0\project-1" 56 if(!$?) { Exit $LASTEXITCODE } 57 58 cd "C:\GitLab-Runner\builds\0\project-1" 59 if(!$?) { Exit $LASTEXITCODE } 60 61 echo "Checking out db45ad9a as main..." 62 & "git" "checkout" "db45ad9af9d7af5e61b829442fd893d96e31250c" 63 if(!$?) { Exit $LASTEXITCODE } 64 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 } else { 71 if(Test-Path "..\..\..\cache\project-1\pages\main\cache.tgz" -PathType Leaf) { 72 echo "Restoring cache..." 73 & "gitlab-runner-windows-amd64.exe" "extract" "--file" "..\..\..\cache\project-1\pages\main\cache.tgz" 74 if(!$?) { Exit $LASTEXITCODE } 75 76 } 77 } 78} 79if(!$?) { Exit $LASTEXITCODE } 80 81& { 82 $CI="true" 83 $env:CI=$CI 84 $CI_COMMIT_SHA="db45ad9af9d7af5e61b829442fd893d96e31250c" 85 $env:CI_COMMIT_SHA=$CI_COMMIT_SHA 86 $CI_COMMIT_BEFORE_SHA="d63117656af6ff57d99e50cc270f854691f335ad" 87 $env:CI_COMMIT_BEFORE_SHA=$CI_COMMIT_BEFORE_SHA 88 $CI_COMMIT_REF_NAME="main" 89 $env:CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME 90 $CI_JOB_ID="1" 91 $env:CI_JOB_ID=$CI_JOB_ID 92 $CI_REPOSITORY_URL="Z:\Gitlab\tests\test" 93 $env:CI_REPOSITORY_URL=$CI_REPOSITORY_URL 94 $CI_PROJECT_ID="1" 95 $env:CI_PROJECT_ID=$CI_PROJECT_ID 96 $CI_PROJECT_DIR="Z:\Gitlab\tests\test\builds\0\project-1" 97 $env:CI_PROJECT_DIR=$CI_PROJECT_DIR 98 $CI_SERVER="yes" 99 $env:CI_SERVER=$CI_SERVER 100 $CI_SERVER_NAME="GitLab CI" 101 $env:CI_SERVER_NAME=$CI_SERVER_NAME 102 $CI_SERVER_VERSION="" 103 $env:CI_SERVER_VERSION=$CI_SERVER_VERSION 104 $CI_SERVER_REVISION="" 105 $env:CI_SERVER_REVISION=$CI_SERVER_REVISION 106 $GITLAB_CI="true" 107 $env:GITLAB_CI=$GITLAB_CI 108 $GIT_SSL_CAINFO="" 109 New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null 110 $GIT_SSL_CAINFO | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO" 111 $GIT_SSL_CAINFO="C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO" 112 $env:GIT_SSL_CAINFO=$GIT_SSL_CAINFO 113 $CI_SERVER_TLS_CA_FILE="" 114 New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null 115 $CI_SERVER_TLS_CA_FILE | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE" 116 $CI_SERVER_TLS_CA_FILE="C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE" 117 $env:CI_SERVER_TLS_CA_FILE=$CI_SERVER_TLS_CA_FILE 118 cd "C:\GitLab-Runner\builds\0\project-1" 119 if(!$?) { Exit $LASTEXITCODE } 120 121 echo "`$ echo true" 122 echo true 123} 124if(!$?) { Exit $LASTEXITCODE } 125 126& { 127 $CI="true" 128 $env:CI=$CI 129 $CI_COMMIT_SHA="db45ad9af9d7af5e61b829442fd893d96e31250c" 130 $env:CI_COMMIT_SHA=$CI_COMMIT_SHA 131 $CI_COMMIT_BEFORE_SHA="d63117656af6ff57d99e50cc270f854691f335ad" 132 $env:CI_COMMIT_BEFORE_SHA=$CI_COMMIT_BEFORE_SHA 133 $CI_COMMIT_REF_NAME="main" 134 $env:CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME 135 $CI_JOB_ID="1" 136 $env:CI_JOB_ID=$CI_JOB_ID 137 $CI_REPOSITORY_URL="Z:\Gitlab\tests\test" 138 $env:CI_REPOSITORY_URL=$CI_REPOSITORY_URL 139 $CI_PROJECT_ID="1" 140 $env:CI_PROJECT_ID=$CI_PROJECT_ID 141 $CI_PROJECT_DIR="Z:\Gitlab\tests\test\builds\0\project-1" 142 $env:CI_PROJECT_DIR=$CI_PROJECT_DIR 143 $CI_SERVER="yes" 144 $env:CI_SERVER=$CI_SERVER 145 $CI_SERVER_NAME="GitLab CI" 146 $env:CI_SERVER_NAME=$CI_SERVER_NAME 147 $CI_SERVER_VERSION="" 148 $env:CI_SERVER_VERSION=$CI_SERVER_VERSION 149 $CI_SERVER_REVISION="" 150 $env:CI_SERVER_REVISION=$CI_SERVER_REVISION 151 $GITLAB_CI="true" 152 $env:GITLAB_CI=$GITLAB_CI 153 $GIT_SSL_CAINFO="" 154 New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null 155 $GIT_SSL_CAINFO | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO" 156 $GIT_SSL_CAINFO="C:\GitLab-Runner\builds\0\project-1.tmp\GIT_SSL_CAINFO" 157 $env:GIT_SSL_CAINFO=$GIT_SSL_CAINFO 158 $CI_SERVER_TLS_CA_FILE="" 159 New-Item -ItemType directory -Force -Path "C:\GitLab-Runner\builds\0\project-1.tmp" | out-null 160 $CI_SERVER_TLS_CA_FILE | Out-File "C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE" 161 $CI_SERVER_TLS_CA_FILE="C:\GitLab-Runner\builds\0\project-1.tmp\CI_SERVER_TLS_CA_FILE" 162 $env:CI_SERVER_TLS_CA_FILE=$CI_SERVER_TLS_CA_FILE 163 cd "C:\GitLab-Runner\builds\0\project-1" 164 if(!$?) { Exit $LASTEXITCODE } 165 166 echo "Archiving cache..." 167 & "gitlab-runner-windows-amd64.exe" "archive" "--file" "..\..\..\cache\project-1\pages\main\cache.tgz" "--path" "vendor" 168 if(!$?) { Exit $LASTEXITCODE } 169 170} 171if(!$?) { Exit $LASTEXITCODE }

运行 Windows Batch#

对于尚未移植到 PowerShell 的旧 Batch 脚本,您可以使用 Start-Process "cmd.exe" "/c C:\Path\file.bat" 从 PowerShell 执行 Batch 脚本。

当 PowerShell 为默认 Shell 时访问 CMD Shell#

在极狐GitLab CI 中从默认 PowerShell 调用 CMD 项目演示了如何访问 CMD Shell。当 PowerShell 是 Runner 上的默认 Shell 时,此方法有效。