#!/usr/bin/env bash set -euo pipefail : "${CARGO_HOME:?需要设置 CARGO_HOME}" : "${CARGO_TARGET_DIR:?需要设置 CARGO_TARGET_DIR}" : "${SCCACHE_DIR:?需要设置 SCCACHE_DIR}" ORIGINAL_HOME="${HOME:-}" CARGO_BUILD_HOME="${CARGO_BUILD_HOME:-$(dirname "${CARGO_HOME}")/home}" USER_CARGO_CONFIG="" WORKSPACE_TMP_ROOT="${WORKSPACE_TMP:-}" if [[ -z "${WORKSPACE_TMP_ROOT}" && -n "${WORKSPACE:-}" ]]; then WORKSPACE_TMP_ROOT="${WORKSPACE}@tmp" fi if [[ -z "${WORKSPACE_TMP_ROOT}" ]]; then WORKSPACE_TMP_ROOT="${CARGO_BUILD_HOME}" fi SCCACHE_SERVER_UDS="${SCCACHE_SERVER_UDS:-${WORKSPACE_TMP_ROOT}/sccache.sock}" SCCACHE_IDLE_TIMEOUT="${SCCACHE_IDLE_TIMEOUT:-0}" mkdir -p "${CARGO_HOME}" "${CARGO_TARGET_DIR}" "${SCCACHE_DIR}" "${CARGO_BUILD_HOME}" # Jenkins agent 当前以 root 运行时,/root/.cargo/config 可能带有失效镜像配置。 # 生产构建使用组件级 HOME 与 CARGO_HOME,避免被全局 Cargo 配置污染。 if [[ -z "${RUSTUP_HOME:-}" && -n "${ORIGINAL_HOME}" && -d "${ORIGINAL_HOME}/.rustup" ]]; then export RUSTUP_HOME="${ORIGINAL_HOME}/.rustup" fi # HOME 会在下面切到组件级缓存目录,因此这里先把真实用户的 Rust 工具链目录补进 PATH。 # Server-Provision 通过 cargo install 安装的 sccache 通常会落在 /root/.cargo/bin。 for tool_dir in "${ORIGINAL_HOME}/.cargo/bin" /root/.cargo/bin /usr/local/cargo/bin; do if [[ -d "${tool_dir}" && ":${PATH}:" != *":${tool_dir}:"* ]]; then export PATH="${tool_dir}:${PATH}" fi done for candidate in \ "${ORIGINAL_HOME}/.cargo/config.toml" \ "${ORIGINAL_HOME}/.cargo/config" \ "/data/jenkins/.cargo/config.toml" \ "/data/jenkins/.cargo/config" \ "/etc/cargo/config.toml" \ "/etc/cargo/config" do if [[ -f "${candidate}" ]]; then USER_CARGO_CONFIG="${candidate}" break fi done export HOME="${CARGO_BUILD_HOME}" export CARGO_HOME export CARGO_TARGET_DIR export SCCACHE_DIR export SCCACHE_SERVER_UDS export SCCACHE_IDLE_TIMEOUT if [[ -n "${USER_CARGO_CONFIG}" ]]; then install -m 0644 "${USER_CARGO_CONFIG}" "${CARGO_HOME}/config.toml" else cat >"${CARGO_HOME}/config.toml" <<'CARGO_CONFIG' [registries.crates-io] protocol = "sparse" CARGO_CONFIG fi echo "[cargo-env] HOME=${HOME}" echo "[cargo-env] CARGO_HOME=${CARGO_HOME}" echo "[cargo-env] CARGO_TARGET_DIR=${CARGO_TARGET_DIR}" echo "[cargo-env] SCCACHE_DIR=${SCCACHE_DIR}" echo "[cargo-env] SCCACHE_SERVER_UDS=${SCCACHE_SERVER_UDS}" echo "[cargo-env] SCCACHE_IDLE_TIMEOUT=${SCCACHE_IDLE_TIMEOUT}" if [[ -n "${USER_CARGO_CONFIG}" ]]; then echo "[cargo-env] USER_CARGO_CONFIG=${USER_CARGO_CONFIG}" fi if [[ -n "${RUSTUP_HOME:-}" ]]; then echo "[cargo-env] RUSTUP_HOME=${RUSTUP_HOME}" fi