From aeb46491c743cadc4cba26bb752a065b9c7593be Mon Sep 17 00:00:00 2001 From: Kevin Stillhammer Date: Sat, 21 Sep 2024 10:14:36 +0200 Subject: [PATCH] Set tool(-bin) dir and add to PATH (#87) Fixes: #83 Fixes: #60 --- .github/workflows/test.yml | 18 ++++++++++ README.md | 46 ++++++++++++++++++++++++-- action.yml | 6 ++++ dist/save-cache/index.js | 37 +++++++++++++++++---- dist/setup/index.js | 67 ++++++++++++++++++++++++++++++++++---- src/setup-uv.ts | 31 ++++++++++++++++++ src/utils/inputs.ts | 43 +++++++++++++++++++++--- 7 files changed, 229 insertions(+), 19 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 248bc4a..b51ea0d 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) @@ -151,8 +154,10 @@ changes. The glob matches files relative to the repository root. ### Local cache path -This action controls where uv stores its cache on the runner's filesystem. You can change the -default (`/tmp/setup-uv-cache`) by specifying the path with the `cache-local-path` input. +This action controls where uv stores its cache on the runner's filesystem by setting `UV_CACHE_DIR`. +It defaults to `setup-uv-cache` in the `TMP` dir, `D:\a\_temp\uv-tool-dir` on Windows and +`/tmp/setup-uv-cache` on Linux/macOS. You can change the default by specifying the path with the +`cache-local-path` input. ```yaml - name: Define a custom uv cache path @@ -178,6 +183,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..6f96493 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,36 @@ 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") { + if (process.env.RUNNER_TEMP !== undefined) { + return `${process.env.RUNNER_TEMP}${path_1.default.sep}uv-tool-bin-dir`; + } + throw Error("Could not determine UV_TOOL_BIN_DIR. Please make sure RUNNER_TEMP is set or provide the tool-bin-dir input"); + } + return undefined; +} +function getToolDir() { + const toolDirInput = core.getInput("tool-dir"); + if (toolDirInput !== "") { + return toolDirInput; + } + if (process.platform === "win32") { + if (process.env.RUNNER_TEMP !== undefined) { + return `${process.env.RUNNER_TEMP}${path_1.default.sep}uv-tool-dir`; + } + throw Error("Could not determine UV_TOOL_DIR. Please make sure RUNNER_TEMP is set or provide the tool-dir input"); + } + return undefined; +} function getCacheLocalPath() { const cacheLocalPathInput = core.getInput("cache-local-path"); if (cacheLocalPathInput !== "") { @@ -83026,10 +83054,7 @@ function getCacheLocalPath() { if (process.env.RUNNER_TEMP !== undefined) { return `${process.env.RUNNER_TEMP}${path_1.default.sep}setup-uv-cache`; } - if (process.platform === "win32") { - return "D:\\a\\_temp\\setup-uv-cache"; - } - return "/tmp/setup-uv-cache"; + throw Error("Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input"); } diff --git a/dist/setup/index.js b/dist/setup/index.js index 45341f9..47b1a13 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -90087,6 +90087,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(); @@ -90130,6 +90132,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}`); @@ -90189,7 +90219,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"); @@ -90197,8 +90227,36 @@ 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") { + if (process.env.RUNNER_TEMP !== undefined) { + return `${process.env.RUNNER_TEMP}${path_1.default.sep}uv-tool-bin-dir`; + } + throw Error("Could not determine UV_TOOL_BIN_DIR. Please make sure RUNNER_TEMP is set or provide the tool-bin-dir input"); + } + return undefined; +} +function getToolDir() { + const toolDirInput = core.getInput("tool-dir"); + if (toolDirInput !== "") { + return toolDirInput; + } + if (process.platform === "win32") { + if (process.env.RUNNER_TEMP !== undefined) { + return `${process.env.RUNNER_TEMP}${path_1.default.sep}uv-tool-dir`; + } + throw Error("Could not determine UV_TOOL_DIR. Please make sure RUNNER_TEMP is set or provide the tool-dir input"); + } + return undefined; +} function getCacheLocalPath() { const cacheLocalPathInput = core.getInput("cache-local-path"); if (cacheLocalPathInput !== "") { @@ -90207,10 +90265,7 @@ function getCacheLocalPath() { if (process.env.RUNNER_TEMP !== undefined) { return `${process.env.RUNNER_TEMP}${path_1.default.sep}setup-uv-cache`; } - if (process.platform === "win32") { - return "D:\\a\\_temp\\setup-uv-cache"; - } - return "/tmp/setup-uv-cache"; + throw Error("Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input"); } 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..fb54953 100644 --- a/src/utils/inputs.ts +++ b/src/utils/inputs.ts @@ -6,8 +6,42 @@ 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") { + if (process.env.RUNNER_TEMP !== undefined) { + return `${process.env.RUNNER_TEMP}${path.sep}uv-tool-bin-dir`; + } + throw Error( + "Could not determine UV_TOOL_BIN_DIR. Please make sure RUNNER_TEMP is set or provide the tool-bin-dir input", + ); + } + return undefined; +} + +function getToolDir(): string | undefined { + const toolDirInput = core.getInput("tool-dir"); + if (toolDirInput !== "") { + return toolDirInput; + } + if (process.platform === "win32") { + if (process.env.RUNNER_TEMP !== undefined) { + return `${process.env.RUNNER_TEMP}${path.sep}uv-tool-dir`; + } + throw Error( + "Could not determine UV_TOOL_DIR. Please make sure RUNNER_TEMP is set or provide the tool-dir input", + ); + } + return undefined; +} function getCacheLocalPath(): string { const cacheLocalPathInput = core.getInput("cache-local-path"); @@ -17,8 +51,7 @@ function getCacheLocalPath(): string { if (process.env.RUNNER_TEMP !== undefined) { return `${process.env.RUNNER_TEMP}${path.sep}setup-uv-cache`; } - if (process.platform === "win32") { - return "D:\\a\\_temp\\setup-uv-cache"; - } - return "/tmp/setup-uv-cache"; + throw Error( + "Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input", + ); }