183 lines
7.3 KiB
YAML
183 lines
7.3 KiB
YAML
name: Prepare Environment
|
|
description: A shared set of setup steps to prepare the runtime environment.
|
|
inputs:
|
|
target_os:
|
|
required: true
|
|
description: The target OS that we're building for ("macos", "linux", "windows", or "wasm").
|
|
is_self_hosted:
|
|
required: true
|
|
description: Whether or not the workflow is running on a self-hosted runner.
|
|
ref:
|
|
description: If set, the ref to checkout.
|
|
install_test_deps:
|
|
description: If true, dependencies needed for running tests will be installed.
|
|
install_release_deps:
|
|
description: If true, dependencies needed for building release artifacts will be installed (e.g., cargo-about for license generation).
|
|
cache_key:
|
|
description: If set, the cache key to use. If unset, the cache key will be derived from the target OS.
|
|
ssh_key:
|
|
description: SSH private key used to clone the private warp-channel-config repository. Only consumed when running in warpdotdev/warp-internal.
|
|
|
|
runs:
|
|
using: composite
|
|
steps:
|
|
- name: Make GitHub token available in the environment
|
|
shell: bash
|
|
run: echo "GH_TOKEN=${{ github.token }}" >> $GITHUB_ENV
|
|
|
|
- name: Set up git for Windows
|
|
if: ${{ inputs.target_os == 'windows' }}
|
|
shell: bash
|
|
run: git config --system core.longpaths true
|
|
|
|
- name: Set CARGO_HOME location
|
|
if: ${{ inputs.target_os == 'windows' }}
|
|
shell: bash
|
|
run: echo "CARGO_HOME=C:\cargo" >> $GITHUB_ENV
|
|
|
|
- name: Determine repository root
|
|
id: repo-root
|
|
shell: bash
|
|
run: |
|
|
# The action lives at <repo-root>/.github/actions/prepare_environment.
|
|
# Derive the repository root from the action path.
|
|
REPO_ROOT=$(cd "${{ github.action_path }}/../../.." && pwd)
|
|
echo "path=$REPO_ROOT" >> $GITHUB_OUTPUT
|
|
# Normalize $GITHUB_WORKSPACE through cd/pwd so that path formats
|
|
# match on Windows (where $GITHUB_WORKSPACE uses backslashes but
|
|
# pwd produces MSYS-style forward-slash paths).
|
|
WORKSPACE=$(cd "$GITHUB_WORKSPACE" && pwd)
|
|
if [ "$REPO_ROOT" = "$WORKSPACE" ]; then
|
|
echo "is-workspace-root=true" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "is-workspace-root=false" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
# Materialize Git LFS objects
|
|
- name: Fetch Git LFS objects
|
|
shell: bash
|
|
run: |
|
|
cd "${{ steps.repo-root.outputs.path }}"
|
|
git lfs install --local
|
|
git lfs pull
|
|
|
|
# Print a per-file listing of the LFS payloads in debug mode
|
|
- name: Verify LFS payloads
|
|
if: ${{ runner.debug == '1' }}
|
|
shell: bash
|
|
run: |
|
|
cd "${{ steps.repo-root.outputs.path }}"
|
|
git lfs ls-files --size
|
|
|
|
- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
|
|
if: ${{ inputs.is_self_hosted != 'true' && !startsWith(runner.name, 'nsc-runner') }}
|
|
with:
|
|
# Make sure x86_64-unknown-linux-gnu and wasm32-unknown-unknown builds
|
|
# don't share a cache, despite running on the same _host_ architecture.
|
|
key: ${{ inputs.cache_key != '' && inputs.cache_key || inputs.target_os }}
|
|
# Only cache runs on the master branch (caches on feature branches
|
|
# are not reusable).
|
|
save-if: ${{ github.ref == 'refs/heads/master' }}
|
|
|
|
- name: Set up Namespace cache
|
|
if: ${{ startsWith(runner.name, 'nsc-runner') }}
|
|
uses: namespacelabs/nscloud-cache-action@a90bb5d4b27522ce881c6e98eebd7d7e6d1653f9 # v1.4.2
|
|
with:
|
|
cache: |
|
|
rust
|
|
${{ inputs.target_os == 'macos' && 'brew' || '' }}
|
|
|
|
- name: Install cargo-binstall
|
|
uses: cargo-bins/cargo-binstall@dc19f1e48450eefe5a29b8da6c6b00a87d730b37 # v1.18.1
|
|
env:
|
|
BINSTALL_VERSION: 1.14.4
|
|
|
|
# Load the SSH key needed to clone the private warp-channel-config repo. Only
|
|
# run in warpdotdev/warp-internal; elsewhere (mirrors, fork PRs) this is a no-op
|
|
# and install_channel_config falls back gracefully.
|
|
- name: Setup SSH keys for warp-channel-config
|
|
if: ${{ github.repository == 'warpdotdev/warp-internal' && inputs.ssh_key != '' }}
|
|
uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555 # v0.10.0
|
|
with:
|
|
ssh-private-key: ${{ inputs.ssh_key }}
|
|
|
|
- uses: maxim-lobanov/setup-xcode@ed7a3b1fda3918c0306d1b724322adc0b8cc0a90 # v1.7.0
|
|
if: ${{ inputs.target_os == 'macos' && inputs.is_self_hosted != 'true' }}
|
|
with:
|
|
xcode-version: '26'
|
|
|
|
- name: Install dependencies
|
|
shell: bash
|
|
run: |
|
|
cd "${{ steps.repo-root.outputs.path }}"
|
|
if ${{ inputs.target_os == 'macos' }}; then
|
|
# Try to install warp-channel-config but don't complain if it cannot
|
|
# be installed.
|
|
./script/install_channel_config || true
|
|
if ${{ inputs.install_release_deps == 'true' }}; then
|
|
./script/install_cargo_release_deps
|
|
else
|
|
./script/install_cargo_build_deps
|
|
fi
|
|
elif ${{ inputs.target_os == 'linux' }}; then
|
|
# Update the apt cache before installing dependencies - it can be slow, so the install scripts
|
|
# don't do it.
|
|
sudo apt-get update -y
|
|
|
|
if ${{ inputs.install_test_deps == 'true' }}; then
|
|
./script/linux/install_test_deps
|
|
elif ${{ inputs.install_release_deps == 'true' }}; then
|
|
./script/linux/install_build_deps
|
|
./script/install_cargo_release_deps
|
|
else
|
|
./script/linux/install_build_deps
|
|
fi
|
|
elif ${{ inputs.target_os == 'windows' }}; then
|
|
./script/windows/install_build_deps.ps1
|
|
if ${{ inputs.install_release_deps == 'true' }}; then
|
|
./script/install_cargo_release_deps
|
|
fi
|
|
elif ${{ inputs.target_os == 'wasm' }}; then
|
|
# Update the apt cache before installing dependencies - it can be slow, so the install scripts
|
|
# don't do it (to avoid doing it more than once).
|
|
sudo apt update -y
|
|
./script/wasm/install_build_deps
|
|
else
|
|
echo "::error::Missing logic to install build dependencies for OS \"${{ inputs.target_os }}\""
|
|
exit 1
|
|
fi
|
|
|
|
- name: Install Node
|
|
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
with:
|
|
node-version: 20.9.0
|
|
|
|
- name: Enable Corepack
|
|
# Enables NodeJS's Corepack tool, which is necessary to use the right version of `yarn` to
|
|
# build TS command signatures.
|
|
shell: bash
|
|
run: corepack enable
|
|
|
|
- name: Install protoc for generating rust bindings of protobuf APIs
|
|
id: install_protoc
|
|
# Install protoc for generating rust bindings of protobuf APIs.
|
|
uses: ConorMacBride/install-package@3e7ad059e07782ee54fa35f827df52aae0626f30 # v1
|
|
# Don't fail the job here so the winget fallback below has a chance to run on Windows.
|
|
continue-on-error: true
|
|
with:
|
|
brew: protobuf
|
|
choco: protoc
|
|
|
|
- name: Install protoc via winget (fallback for Windows)
|
|
if: ${{ inputs.target_os == 'windows' && steps.install_protoc.outcome == 'failure' }}
|
|
shell: pwsh
|
|
run: winget install Google.Protobuf
|
|
|
|
- name: Fail if protoc install did not succeed
|
|
if: ${{ inputs.target_os != 'windows' && steps.install_protoc.outcome == 'failure' }}
|
|
shell: bash
|
|
run: |
|
|
echo "::error::protoc install step failed on ${{ inputs.target_os }}"
|
|
exit 1
|
|
|