name: setup-bazel-ci description: Prepare a Bazel CI runner with shared caches and optional test prerequisites. inputs: target: description: Target triple used for cache namespacing. required: true install-test-prereqs: description: Install Node.js and DotSlash for Bazel-backed test jobs. required: false default: "false" outputs: repository-cache-path: description: Filesystem path used for the Bazel repository cache. value: ${{ steps.configure_bazel_repository_cache.outputs.repository-cache-path }} runs: using: composite steps: - name: Set up Node.js for js_repl tests if: inputs.install-test-prereqs == 'true' uses: actions/setup-node@v6 with: node-version-file: codex-rs/node-version.txt # Some integration tests rely on DotSlash being installed. # See https://github.com/openai/codex/pull/7617. - name: Install DotSlash if: inputs.install-test-prereqs == 'true' uses: facebook/install-dotslash@v2 - name: Make DotSlash available in PATH (Unix) if: inputs.install-test-prereqs == 'true' && runner.os != 'Windows' shell: bash run: cp "$(which dotslash)" /usr/local/bin - name: Make DotSlash available in PATH (Windows) if: inputs.install-test-prereqs == 'true' && runner.os == 'Windows' shell: pwsh run: Copy-Item (Get-Command dotslash).Source -Destination "$env:LOCALAPPDATA\Microsoft\WindowsApps\dotslash.exe" - name: Set up Bazel uses: bazelbuild/setup-bazelisk@v3 - name: Configure Bazel repository cache id: configure_bazel_repository_cache shell: pwsh run: | # Keep the repository cache under HOME on all runners. Windows `D:\a` # cache paths match `.bazelrc`, but `actions/cache/restore` currently # returns HTTP 400 for that path in the Windows clippy job. $repositoryCachePath = Join-Path $HOME '.cache/bazel-repo-cache' "repository-cache-path=$repositoryCachePath" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append "BAZEL_REPOSITORY_CACHE=$repositoryCachePath" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - name: Configure Bazel output root (Windows) if: runner.os == 'Windows' shell: pwsh run: | # Use the shortest available drive to reduce argv/path length issues, # but avoid the drive root because some Windows test launchers mis-handle # MANIFEST paths there. $hasDDrive = Test-Path 'D:\' $bazelOutputUserRoot = if ($hasDDrive) { 'D:\b' } else { 'C:\b' } $repoContentsCache = Join-Path $env:RUNNER_TEMP "bazel-repo-contents-cache-$env:GITHUB_RUN_ID-$env:GITHUB_JOB" "BAZEL_OUTPUT_USER_ROOT=$bazelOutputUserRoot" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append "BAZEL_REPO_CONTENTS_CACHE=$repoContentsCache" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - name: Expose MSVC SDK environment (Windows) if: runner.os == 'Windows' shell: pwsh run: | # Bazel exec-side Rust build scripts do not reliably inherit the MSVC developer # shell on GitHub-hosted Windows runners, so discover the latest VS install and # ask `VsDevCmd.bat` to materialize the x64/x64 compiler + SDK environment. $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" if (-not (Test-Path $vswhere)) { throw "vswhere.exe not found" } $installPath = & $vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath 2>$null if (-not $installPath) { throw "Could not locate a Visual Studio installation with VC tools" } $vsDevCmd = Join-Path $installPath 'Common7\Tools\VsDevCmd.bat' if (-not (Test-Path $vsDevCmd)) { throw "VsDevCmd.bat not found at $vsDevCmd" } # Keep the export surface explicit: these are the paths and SDK roots that the # MSVC toolchain probes need later when Bazel runs Windows exec-platform build # scripts such as `aws-lc-sys`. $varsToExport = @( 'INCLUDE', 'LIB', 'LIBPATH', 'PATH', 'UCRTVersion', 'UniversalCRTSdkDir', 'VCINSTALLDIR', 'VCToolsInstallDir', 'WindowsLibPath', 'WindowsSdkBinPath', 'WindowsSdkDir', 'WindowsSDKLibVersion', 'WindowsSDKVersion' ) # `VsDevCmd.bat` is a batch file, so invoke it under `cmd.exe`, suppress its # banner, then dump the resulting environment with `set`. Re-export only the # approved keys into `GITHUB_ENV` so later steps inherit the same MSVC context. $envLines = & cmd.exe /c ('"{0}" -no_logo -arch=x64 -host_arch=x64 >nul && set' -f $vsDevCmd) foreach ($line in $envLines) { if ($line -notmatch '^(.*?)=(.*)$') { continue } $name = $matches[1] $value = $matches[2] if ($varsToExport -contains $name) { "$name=$value" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append } } - name: Enable Git long paths (Windows) if: runner.os == 'Windows' shell: pwsh run: git config --global core.longpaths true