From e7129688fa0ec434420b2f5c63097ac4d45d3516 Mon Sep 17 00:00:00 2001 From: Kevin Stillhammer Date: Wed, 18 Sep 2024 17:28:08 +0200 Subject: [PATCH] Set tool(-bin) dir and add to PATH Make sure the default tool bin dir or the user supplied is added to the PATH. On Windows the tool dir and tool bin dir is moved to the TMP dir to take advantage of the fact that on GitHub hosted Windows runners this is on the faster D: drive --- .github/workflows/test.yml | 18 ++++++++++++ README.md | 40 +++++++++++++++++++++++++++ action.yml | 6 ++++ dist/save-cache/index.js | 26 ++++++++++++++++-- dist/setup/index.js | 56 ++++++++++++++++++++++++++++++++++++-- src/setup-uv.ts | 31 +++++++++++++++++++++ src/utils/inputs.ts | 26 +++++++++++++++++- 7 files changed, 198 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0f33e20..04d540d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -105,3 +105,21 @@ jobs: - name: Install default version uses: ./ - run: uvx ruff --version + test-tool-install: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: + [ + ubuntu-latest, + macos-latest, + macos-14, + windows-latest, + oracle-aarch64, + ] + steps: + - uses: actions/checkout@v4 + - name: Install default version + uses: ./ + - run: uv tool install ruff + - run: ruff --version diff --git a/README.md b/README.md index af31171..8f2ded2 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,14 @@ Set up your GitHub Actions workflow with a specific version of [uv](https://docs - [Usage](#usage) - [Install the latest version (default)](#install-the-latest-version-default) - [Install a specific version](#install-a-specific-version) + - [Install a version by supplying a semver range](#install-a-version-by-supplying-a-semver-range) - [Validate checksum](#validate-checksum) - [Enable Caching](#enable-caching) - [Cache dependency glob](#cache-dependency-glob) - [Local cache path](#local-cache-path) - [GitHub authentication token](#github-authentication-token) + - [UV_TOOL_DIR](#uv_tool_dir) + - [UV_TOOL_BIN_DIR](#uv_tool_bin_dir) - [How it works](#how-it-works) - [FAQ](#faq) @@ -178,6 +181,43 @@ are not sufficient, you can provide a custom GitHub token with the necessary per github-token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} ``` +### UV_TOOL_DIR + +On Windows `UV_TOOL_DIR` is set to `uv-tool-dir` in the `TMP` dir (e.g. `D:\a\_temp\uv-tool-dir`). +On GitHub hosted runners this is on the much faster `D:` drive. + +On all other platforms the tool environments are placed in the +[default location](https://docs.astral.sh/uv/concepts/tools/#tools-directory). + +If you want to change this behaviour (especially on self-hosted runners) you can use the `tool-dir` +input: + +```yaml +- name: Install the latest version of uv with a custom tool dir + uses: astral-sh/setup-uv@v3 + with: + tool-dir: "/path/to/tool/dir" +``` + +### UV_TOOL_BIN_DIR + +On Windows `UV_TOOL_BIN_DIR` is set to `uv-tool-bin-dir` in the `TMP` dir (e.g. +`D:\a\_temp\uv-tool-bin-dir`). On GitHub hosted runners this is on the much faster `D:` drive. This +path is also automatically added to the PATH. + +On all other platforms the tool binaries get installed to the +[default location](https://docs.astral.sh/uv/concepts/tools/#the-bin-directory). + +If you want to change this behaviour (especially on self-hosted runners) you can use the +`tool-bin-dir` input: + +```yaml +- name: Install the latest version of uv with a custom tool bin dir + uses: astral-sh/setup-uv@v3 + with: + tool-bin-dir: "/path/to/tool-bin/dir" +``` + ## How it works This action downloads uv from the uv repo's official diff --git a/action.yml b/action.yml index d9d77a2..8cbe5b3 100644 --- a/action.yml +++ b/action.yml @@ -29,6 +29,12 @@ inputs: cache-local-path: description: "Local path to store the cache." default: "" + tool-dir: + description: "Custom path to set UV_TOOL_DIR to." + required: false + tool-bin-dir: + description: "Custom path to set UV_TOOL_BIN_DIR to." + required: false outputs: uv-version: description: "The installed uv version. Useful when using latest." diff --git a/dist/save-cache/index.js b/dist/save-cache/index.js index 2cf89c1..4d0d5f9 100644 --- a/dist/save-cache/index.js +++ b/dist/save-cache/index.js @@ -83008,7 +83008,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.cacheDependencyGlob = exports.githubToken = exports.cacheLocalPath = exports.cacheSuffix = exports.enableCache = exports.checkSum = exports.version = void 0; +exports.githubToken = exports.toolDir = exports.toolBinDir = exports.cacheDependencyGlob = exports.cacheLocalPath = exports.cacheSuffix = exports.enableCache = exports.checkSum = exports.version = void 0; const core = __importStar(__nccwpck_require__(2186)); const path_1 = __importDefault(__nccwpck_require__(1017)); exports.version = core.getInput("version"); @@ -83016,8 +83016,30 @@ exports.checkSum = core.getInput("checksum"); exports.enableCache = core.getInput("enable-cache") === "true"; exports.cacheSuffix = core.getInput("cache-suffix") || ""; exports.cacheLocalPath = getCacheLocalPath(); -exports.githubToken = core.getInput("github-token"); exports.cacheDependencyGlob = core.getInput("cache-dependency-glob"); +exports.toolBinDir = getToolBinDir(); +exports.toolDir = getToolDir(); +exports.githubToken = core.getInput("github-token"); +function getToolBinDir() { + const toolBinDirInput = core.getInput("tool-bin-dir"); + if (toolBinDirInput !== "") { + return toolBinDirInput; + } + if (process.platform === "win32") { + return "D:\\a\\_temp\\uv-tool-bin-dir"; + } + return undefined; +} +function getToolDir() { + const toolDirInput = core.getInput("tool-dir"); + if (toolDirInput !== "") { + return toolDirInput; + } + if (process.platform === "win32") { + return "D:\\a\\_temp\\uv-tool-dir"; + } + return undefined; +} function getCacheLocalPath() { const cacheLocalPathInput = core.getInput("cache-local-path"); if (cacheLocalPathInput !== "") { diff --git a/dist/setup/index.js b/dist/setup/index.js index 3b70965..5c4b549 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -90033,6 +90033,8 @@ function run() { } const setupResult = yield setupUv(platform, arch, inputs_1.version, inputs_1.checkSum, inputs_1.githubToken); addUvToPath(setupResult.uvDir); + addToolBinToPath(); + setToolDir(); core.setOutput("uv-version", setupResult.version); core.info(`Successfully installed uv version ${setupResult.version}`); addMatchers(); @@ -90076,6 +90078,34 @@ function addUvToPath(cachedPath) { core.addPath(cachedPath); core.info(`Added ${cachedPath} to the path`); } +function addToolBinToPath() { + if (inputs_1.toolBinDir !== undefined) { + core.exportVariable("UV_TOOL_BIN_DIR", inputs_1.toolBinDir); + core.info(`Set UV_TOOL_BIN_DIR to ${inputs_1.toolBinDir}`); + core.addPath(inputs_1.toolBinDir); + core.info(`Added ${inputs_1.toolBinDir} to the path`); + } + else { + if (process.env.XDG_BIN_HOME !== undefined) { + core.addPath(process.env.XDG_BIN_HOME); + core.info(`Added ${process.env.XDG_BIN_HOME} to the path`); + } + else if (process.env.XDG_DATA_HOME !== undefined) { + core.addPath(`${process.env.XDG_DATA_HOME}/../bin`); + core.info(`Added ${process.env.XDG_DATA_HOME}/../bin to the path`); + } + else { + core.addPath(`${process.env.HOME}/.local/bin`); + core.info(`Added ${process.env.HOME}/.local/bin to the path`); + } + } +} +function setToolDir() { + if (inputs_1.toolDir !== undefined) { + core.exportVariable("UV_TOOL_DIR", inputs_1.toolDir); + core.info(`Set UV_TOOL_DIR to ${inputs_1.toolDir}`); + } +} function setCacheDir(cacheLocalPath) { core.exportVariable("UV_CACHE_DIR", cacheLocalPath); core.info(`Set UV_CACHE_DIR to ${cacheLocalPath}`); @@ -90135,7 +90165,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.cacheDependencyGlob = exports.githubToken = exports.cacheLocalPath = exports.cacheSuffix = exports.enableCache = exports.checkSum = exports.version = void 0; +exports.githubToken = exports.toolDir = exports.toolBinDir = exports.cacheDependencyGlob = exports.cacheLocalPath = exports.cacheSuffix = exports.enableCache = exports.checkSum = exports.version = void 0; const core = __importStar(__nccwpck_require__(2186)); const path_1 = __importDefault(__nccwpck_require__(1017)); exports.version = core.getInput("version"); @@ -90143,8 +90173,30 @@ exports.checkSum = core.getInput("checksum"); exports.enableCache = core.getInput("enable-cache") === "true"; exports.cacheSuffix = core.getInput("cache-suffix") || ""; exports.cacheLocalPath = getCacheLocalPath(); -exports.githubToken = core.getInput("github-token"); exports.cacheDependencyGlob = core.getInput("cache-dependency-glob"); +exports.toolBinDir = getToolBinDir(); +exports.toolDir = getToolDir(); +exports.githubToken = core.getInput("github-token"); +function getToolBinDir() { + const toolBinDirInput = core.getInput("tool-bin-dir"); + if (toolBinDirInput !== "") { + return toolBinDirInput; + } + if (process.platform === "win32") { + return "D:\\a\\_temp\\uv-tool-bin-dir"; + } + return undefined; +} +function getToolDir() { + const toolDirInput = core.getInput("tool-dir"); + if (toolDirInput !== "") { + return toolDirInput; + } + if (process.platform === "win32") { + return "D:\\a\\_temp\\uv-tool-dir"; + } + return undefined; +} function getCacheLocalPath() { const cacheLocalPathInput = core.getInput("cache-local-path"); if (cacheLocalPathInput !== "") { diff --git a/src/setup-uv.ts b/src/setup-uv.ts index 6d9d7e5..685468d 100644 --- a/src/setup-uv.ts +++ b/src/setup-uv.ts @@ -18,6 +18,8 @@ import { checkSum, enableCache, githubToken, + toolBinDir, + toolDir, version, } from "./utils/inputs"; @@ -41,6 +43,8 @@ async function run(): Promise { ); addUvToPath(setupResult.uvDir); + addToolBinToPath(); + setToolDir(); core.setOutput("uv-version", setupResult.version); core.info(`Successfully installed uv version ${setupResult.version}`); @@ -102,6 +106,33 @@ function addUvToPath(cachedPath: string): void { core.info(`Added ${cachedPath} to the path`); } +function addToolBinToPath(): void { + if (toolBinDir !== undefined) { + core.exportVariable("UV_TOOL_BIN_DIR", toolBinDir); + core.info(`Set UV_TOOL_BIN_DIR to ${toolBinDir}`); + core.addPath(toolBinDir); + core.info(`Added ${toolBinDir} to the path`); + } else { + if (process.env.XDG_BIN_HOME !== undefined) { + core.addPath(process.env.XDG_BIN_HOME); + core.info(`Added ${process.env.XDG_BIN_HOME} to the path`); + } else if (process.env.XDG_DATA_HOME !== undefined) { + core.addPath(`${process.env.XDG_DATA_HOME}/../bin`); + core.info(`Added ${process.env.XDG_DATA_HOME}/../bin to the path`); + } else { + core.addPath(`${process.env.HOME}/.local/bin`); + core.info(`Added ${process.env.HOME}/.local/bin to the path`); + } + } +} + +function setToolDir(): void { + if (toolDir !== undefined) { + core.exportVariable("UV_TOOL_DIR", toolDir); + core.info(`Set UV_TOOL_DIR to ${toolDir}`); + } +} + function setCacheDir(cacheLocalPath: string): void { core.exportVariable("UV_CACHE_DIR", cacheLocalPath); core.info(`Set UV_CACHE_DIR to ${cacheLocalPath}`); diff --git a/src/utils/inputs.ts b/src/utils/inputs.ts index 66eec47..7d45ee6 100644 --- a/src/utils/inputs.ts +++ b/src/utils/inputs.ts @@ -6,8 +6,32 @@ export const checkSum = core.getInput("checksum"); export const enableCache = core.getInput("enable-cache") === "true"; export const cacheSuffix = core.getInput("cache-suffix") || ""; export const cacheLocalPath = getCacheLocalPath(); -export const githubToken = core.getInput("github-token"); export const cacheDependencyGlob = core.getInput("cache-dependency-glob"); +export const toolBinDir = getToolBinDir(); +export const toolDir = getToolDir(); +export const githubToken = core.getInput("github-token"); + +function getToolBinDir(): string | undefined { + const toolBinDirInput = core.getInput("tool-bin-dir"); + if (toolBinDirInput !== "") { + return toolBinDirInput; + } + if (process.platform === "win32") { + return "D:\\a\\_temp\\uv-tool-bin-dir"; + } + return undefined; +} + +function getToolDir(): string | undefined { + const toolDirInput = core.getInput("tool-dir"); + if (toolDirInput !== "") { + return toolDirInput; + } + if (process.platform === "win32") { + return "D:\\a\\_temp\\uv-tool-dir"; + } + return undefined; +} function getCacheLocalPath(): string { const cacheLocalPathInput = core.getInput("cache-local-path");