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: cache-hit: description: Whether the Bazel repository cache key was restored exactly. value: ${{ steps.cache_bazel_repository_restore.outputs.cache-hit }} 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 # Restore bazel repository cache so we don't have to redownload all the external dependencies # on every CI run. - name: Restore bazel repository cache id: cache_bazel_repository_restore uses: actions/cache/restore@v5 with: path: | ~/.cache/bazel-repo-cache key: bazel-cache-${{ inputs.target }}-${{ hashFiles('MODULE.bazel', 'codex-rs/Cargo.lock', 'codex-rs/Cargo.toml') }} restore-keys: | bazel-cache-${{ inputs.target }} - 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 if (-not $hasDDrive) { $repositoryCache = Join-Path $env:USERPROFILE '.cache\bazel-repo-cache' "BAZEL_REPOSITORY_CACHE=$repositoryCache" | 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