极狐GitLab Runner 支持的 shell 类型

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: JihuLab.com, 私有化部署

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

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

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

这些 shell 没有任何配置选项。构建步骤是从 .gitlab-ci.yml 中的 script 指令定义的命令中接收的。

支持的 shell 有:

ShellStatusDescription
bashFully SupportedBash (Bourne Again Shell)。所有命令在 Bash 环境中执行(所有 Unix 系统的默认值)
shFully SupportedSh (Bourne shell)。所有命令在 Sh 环境中执行(所有 Unix 系统中 bash 的回退)
powershellFully SupportedPowerShell 脚本。所有命令在 PowerShell Desktop 环境中执行。
pwshFully SupportedPowerShell 脚本。所有命令在 PowerShell Core 环境中执行。在极狐GitLab Runner 14.0 及更高版本中,注册新 runner 时在 Windows 上默认使用此选项。

如果想要选择默认值以外的特定 shell 使用,必须在 config.toml 文件中指定 shell

Sh/Bash shell#

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

shell
1# 如果构建应该在另一个用户的上下文中执行(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 文件有如下面的脚本部分,将其注释掉并重新启动流水线:

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 Desktop Edition 是在 Windows 上使用极狐GitLab Runner 12.0-13.12 注册新 runner 时的默认 shell。在 14.0 及更高版本中,默认是 PowerShell Core Edition。

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 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 脚本。