GitLab RunnerでサポートされているShellの種類
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
GitLab Runnerは、さまざまなシステムでビルドを実行できるようにするShellスクリプトジェネレーターを実装しています。
Shellスクリプトには、ビルドのすべてのステップを実行するコマンドが含まれています:
git clone- ビルドキャッシュの復元
- ビルドコマンド
- ビルドキャッシュの更新
- ビルドアーティファクトの生成とアップロード
Shellには設定オプションはありません。scriptの.gitlab-ci.ymlディレクティブで定義されたコマンドからビルドのステップを受信します。
サポートされているShellは次のとおりです:
| Shell | 状態 | 説明 |
|---|---|---|
bash | 完全にサポート | Bash(Bourne Again Shell)。すべてのコマンドはBashコンテキストで実行されます(すべてのUnixシステムのデフォルト)。 |
sh | 完全にサポート | Sh(Bourne shell)。すべてのコマンドはShコンテキストで実行されます(すべてのUnixシステムのbashのフォールバック)。 |
powershell | 完全にサポート | PowerShellスクリプト。すべてのコマンドはPowerShell Desktopのコンテキストで実行されます。 |
pwsh | 完全にサポート | PowerShellスクリプト。すべてのコマンドはPowerShell Coreのコンテキストで実行されます。これは、Windowsで新しいRunnerを登録する際のデフォルトです。 |
デフォルト以外の特定のShellを使用する場合は、config.tomlファイルでShellを指定する必要があります。
Sh/Bash Shell
Sh/Bashは、すべてのUnixベースのシステムで使用されるデフォルトのShellです。.gitlab-ci.ymlで使用されているbashスクリプトは、Shellスクリプトを次のいずれかのコマンドにパイプすることで実行されます:
# 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/bashShellプロファイルの読み込み
特定のexecutorでは、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
fiShellプロファイルを読み込むexecutor:
shellparallels(ターゲット仮想マシンのShellプロファイルが読み込みまれます)virtualbox(ターゲット仮想マシンのShellプロファイルが読み込みまれます)ssh(ターゲットマシンのShellプロファイルが読み込みまれます)
PowerShell
PowerShell Desktop Editionは、GitLab Runner 12.0〜13.12を使用してWindowsに新しいRunnerを登録するときのデフォルトShellです。14.0以降では、デフォルトはPowerShell Core Editionです。
PowerShellは、別のユーザーのコンテキストでビルドを実行することをサポートしていません。
生成されたPowerShellスクリプトを実行するには、そのコンテンツをファイルに保存し、ファイル名を次のコマンドに渡します:
PowerShell Desktop Edition:
powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command generated-windows-powershell.ps1PowerShell Core Edition:
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の実行
PowerShellに移植されていない古いBatchスクリプトの場合は、Start-Process "cmd.exe" "/c C:\Path\file.bat"を使用してPowerShellからそのBatchスクリプトを実行できます。
PowerShellがデフォルトの場合のCMD Shellへのアクセス
Call CMD From Default PowerShell in GitLab CIプロジェクトは、CMD Shellへのアクセス権を取得する方法を示しています。このアプローチは、PowerShellがRunnerのデフォルトShellである場合に機能します。
PowerShellのサンプルの使い方を紹介するビデオチュートリアル
Slicing and Dicing with PowerShell on GitLab CIは、PowerShell Pipelines on GitLab CI Guided Explorationプロジェクトのチュートリアル動画です。これは以下の環境でテストされています:
- GitLab.com向けにWindows上でホストされるrunnerのWindows PowerShellおよびPowerShell Core 7。
- Docker-Machine Runnerを使用したLinux ContainersのPowerShell Core 7。
この例は、テスト用に自分のグループまたはインスタンスにコピーできます。他のGitLab CIパターンのデモについての詳細は、プロジェクトページをご覧ください。