极狐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 时的默认值。 |
如果您不想使用默认 Shell 而想选择特定 Shell,您必须在您的 config.toml 文件中指定 Shell。
Sh/Bash Shell
这是所有基于 Unix 的系统上使用的默认 Shell。通过将 Shell 脚本传送到下列命令来执行 .gitlab-ci.yml 中使用的 Bash 脚本。
shell1# 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 文件有一个如下所示的脚本部分,请将其注释掉并重新启动流水线:
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 版本是使用极狐GitLab Runner 12.0-13.12 在 Windows 上注册新 Runner 时的默认 Shell。 在 14.0 及更高版本中,默认为 PowerShell Core 版本。
PowerShell 不支持在其他用户的上下文中执行构建。
生成的 PowerShell 脚本通过将其内容保存到文件并将文件名传递给以下命令来执行:
-
对于 PowerShell Desktop 版本:
batchpowershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command generated-windows-powershell.ps1
-
对于 PowerShell Core 版本:
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 脚本。