Compare commits

...
34 Commits
Author SHA1 Message Date
Andreas AlbertandPavel Zwerschke 5185adfbff feat: Add persist-credentials option (#266)
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2026-05-21 13:13:17 +02:00
dependabot[bot]andPavel Zwerschke 92596c33b0 chore(deps): bump the nodejs group with 6 updates (#264)
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
Signed-off-by: dependabot[bot] <support@github.com>
2026-05-21 13:04:19 +02:00
dependabot[bot] 68a459aa8a chore(deps): bump the gh-actions group with 5 updates (#263)
Signed-off-by: dependabot[bot] <support@github.com>
2026-05-21 12:54:08 +02:00
Pavel Zwerschke 8ce63489f8 add octo-sts (#262) 2026-04-24 09:08:08 +02:00
github-actions[bot] b92f01076d Reference latest Pixi version in README (#260) 2026-04-01 06:06:51 +00:00
dependabot[bot] 46d4c99b05 chore(deps): bump the gh-actions group with 4 updates (#261) 2026-04-01 07:57:58 +02:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Pavel Zwerschke
1b2de7f335 chore(deps): bump dependencies (#259)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2026-03-31 11:00:43 +02:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Ruben Arts
6ef69835bb chore(deps): bump the nodejs group with 10 dependencies (#257)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ruben Arts <ruben.arts@hotmail.com>
2026-03-30 14:23:16 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> e6477eb81d chore(deps): bump Quantco/ui-actions from 1.0.18 to 1.0.19 in the gh-actions group (#256)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-30 13:50:53 +02:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Pavel Zwerschke
33be5bafa6 chore(deps): bump the nodejs group with 7 updates (#250)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2026-02-01 19:18:18 +01:00
dependabot[bot] 72f90fea0c chore(deps): bump the gh-actions group across 1 directory with 3 updates (#253) 2026-02-01 11:36:06 +01:00
Copilot c0d7209ec3 Fix broken authentication documentation link (#252) 2026-01-29 13:38:47 +00:00
Pavel Zwerschke f1fb10f03b docs: Mention cooldown in dependabot config (#247) 2026-01-28 11:15:30 +01:00
a0af7a2287 Implement working directory setup (#236)
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 22:35:04 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 51b98037a9 chore(deps): bump the nodejs group with 10 updates (#244)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-10 19:23:16 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 54b8d30703 chore(deps): bump the gh-actions group with 5 updates (#243)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-10 11:46:39 +01:00
github-actions[bot] dce9fafa77 Reference latest Pixi version in README (#242) 2026-01-01 03:43:33 +00:00
Pavel Zwerschke ea732fd64a ci: Remove macos-13 tests (#240) 2025-12-09 22:25:24 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> fc696d768f chore(deps): bump the nodejs group with 9 updates (#239)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-02 10:55:48 +01:00
dependabot[bot] 71b46b9941 chore(deps): bump the gh-actions group with 3 updates (#238) 2025-12-01 07:55:46 +01:00
Pavel Zwerschke 82d477f15f feat: Switch order of pixi info and pixi install (#234) 2025-11-03 11:25:42 +01:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Pavel Zwerschke
a976380763 chore(deps): bump the nodejs group across 1 directory with 9 updates (#233)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2025-11-03 10:33:38 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> de110d6265 chore(deps): bump the gh-actions group with 4 updates (#232)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-01 06:47:05 +01:00
Ruben Arts 59d669bca0 Update documentation links to new pixi URLs (#230) 2025-10-20 06:26:01 +00:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 046c0f75f2 chore(deps): bump the gh-actions group with 3 updates (#228)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-19 17:30:41 +02:00
github-actions[bot] 34ef3cc298 docs: Reference latest Pixi version in README (#227) 2025-10-19 17:30:07 +02:00
Olivier Lacroix 28eb668aaf feat: Allow caching global environment(s) (#226) 2025-10-19 15:37:21 +02:00
Olivier LacroixandPavel Zwerschke 194d461b21 Add possibility to install global environments (#221)
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2025-09-22 11:51:37 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 40ab2611f4 chore(deps): bump the nodejs group with 7 updates (#223)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-01 11:47:19 +00:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 83ecca31f5 chore(deps): bump actions/checkout from 4.2.2 to 5.0.0 in the gh-actions group (#222)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-01 13:41:15 +02:00
Olivier Lacroix ba511d5090 Add pypi-keyring-provider option (#220) 2025-08-13 14:23:50 +02:00
Pavel Zwerschke fef5c9568c chore: Bump to node 24 (#219) 2025-08-11 23:29:05 +02:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Pavel Zwerschke
62618497c3 chore(deps): bump the nodejs group with 7 updates (#218)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2025-08-11 21:09:58 +00:00
Yannik Tausch 8ca4608ef7 feat: Replace pixi-url-bearer-token by pixi-url-headers (#217) 2025-07-25 15:46:30 +02:00
25 changed files with 85410 additions and 71771 deletions
+1
View File
@@ -1 +1,2 @@
dist/** merge=binary -diff linguist-generated=true dist/** merge=binary -diff linguist-generated=true
pnpm-lock.yaml merge=binary linguist-generated=true
+7
View File
@@ -0,0 +1,7 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/octo-sts/app/refs/heads/main/pkg/octosts/octosts.TrustPolicy.json
issuer: https://token.actions.githubusercontent.com
subject: repo:prefix-dev/setup-pixi:ref:refs/heads/main
permissions:
contents: write
pull_requests: write
+4
View File
@@ -8,6 +8,8 @@ updates:
gh-actions: gh-actions:
patterns: patterns:
- '*' - '*'
cooldown:
default-days: 7
- package-ecosystem: npm - package-ecosystem: npm
directory: / directory: /
schedule: schedule:
@@ -16,3 +18,5 @@ updates:
nodejs: nodejs:
patterns: patterns:
- '*' - '*'
cooldown:
default-days: 7
+20 -14
View File
@@ -15,15 +15,15 @@ jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Install pnpm - name: Install pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.4.0 uses: pnpm/action-setup@903f9c1a6ebcba6cf41d87230be49611ac97822e # v6.0.3
with: with:
version: 9 version: 9
- name: Install Node.js - name: Install Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: with:
node-version: 20 node-version: 20
cache: pnpm cache: pnpm
@@ -41,13 +41,13 @@ jobs:
name: Reference latest version in README name: Reference latest version in README
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Assert latest setup-pixi version is mentioned in README - name: Assert latest setup-pixi version is mentioned in README
run: | run: |
set -euo pipefail set -euo pipefail
latest_version="$(jq -r '.version' package.json)" latest_version="$(jq -r '.version' package.json)"
count_expected=19 count_expected=24
count_actual="$(grep -c "setup-pixi@v$latest_version" README.md || true)" count_actual="$(grep -c "setup-pixi@v$latest_version" README.md || true)"
if [ "$count_actual" -ne "$count_expected" ]; then if [ "$count_actual" -ne "$count_expected" ]; then
echo "::error file=README.md::Expected $count_expected mentions of \`setup-pixi@v$latest_version\` in README.md, but found $count_actual." echo "::error file=README.md::Expected $count_expected mentions of \`setup-pixi@v$latest_version\` in README.md, but found $count_actual."
@@ -59,10 +59,10 @@ jobs:
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: write contents: read
pull-requests: write id-token: write
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Assert latest pixi version is mentioned in README - name: Assert latest pixi version is mentioned in README
run: | run: |
@@ -78,11 +78,17 @@ jobs:
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: octo-sts/action@f603d3be9d8dd9871a265776e625a27b00effe05 # v1.1.1
id: octo-sts
with:
scope: ${{ github.repository }}
identity: write
- name: Create pull request - name: Create pull request
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
if: failure() && github.ref_name == 'main' if: failure() && github.ref_name == 'main'
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ steps.octo-sts.outputs.token }}
commit-message: Reference latest Pixi version in README commit-message: Reference latest Pixi version in README
title: Reference latest Pixi version in README title: Reference latest Pixi version in README
labels: ignore for release labels: ignore for release
@@ -90,15 +96,15 @@ jobs:
check-dist: check-dist:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Install pnpm - name: Install pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.4.0 uses: pnpm/action-setup@903f9c1a6ebcba6cf41d87230be49611ac97822e # v6.0.3
with: with:
version: 9 version: 9
- name: Install Node.js - name: Install Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: with:
node-version: 20 node-version: 20
cache: pnpm cache: pnpm
@@ -119,7 +125,7 @@ jobs:
id: diff id: diff
# If index.js or post.js are different than expected, upload the expected version as an artifact # If index.js or post.js are different than expected, upload the expected version as an artifact
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: ${{ failure() && steps.diff.conclusion == 'failure' }} if: ${{ failure() && steps.diff.conclusion == 'failure' }}
with: with:
name: dist name: dist
+3 -3
View File
@@ -12,8 +12,8 @@ jobs:
release: release:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: Quantco/ui-actions/version-metadata@cd71d2a0e30b25569f6d723e57acca83347e58fc # v1.0.18 - uses: Quantco/ui-actions/version-metadata@adeb1cf49655487534b4ddaab09c3b7bdfd1d628 # v1.0.19
id: version-metadata id: version-metadata
with: with:
file: ./package.json file: ./package.json
@@ -24,7 +24,7 @@ jobs:
TAG_NAME: v${{ steps.version-metadata.outputs.newVersion }} TAG_NAME: v${{ steps.version-metadata.outputs.newVersion }}
- name: Create release - name: Create release
if: steps.version-metadata.outputs.changed == 'true' if: steps.version-metadata.outputs.changed == 'true'
uses: softprops/action-gh-release@72f2c25fcb47643c292f7107632f7a47c1df5cd8 # v2.3.2 uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
with: with:
generate_release_notes: true generate_release_notes: true
tag_name: v${{ steps.version-metadata.outputs.newVersion }} tag_name: v${{ steps.version-metadata.outputs.newVersion }}
+250 -67
View File
@@ -17,12 +17,12 @@ jobs:
strategy: strategy:
matrix: matrix:
# TODO: add windows-11-arm: https://github.com/conda-forge/conda-forge.github.io/issues/1940 # TODO: add windows-11-arm: https://github.com/conda-forge/conda-forge.github.io/issues/1940
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest, macos-13] os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest]
cache: [true, false] cache: [true, false]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
name: default ${{ matrix.cache == true && 'with' || 'without' }} cache (${{ matrix.os }}) name: default ${{ matrix.cache == true && 'with' || 'without' }} cache (${{ matrix.os }})
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -47,13 +47,62 @@ jobs:
pixi run python --version | grep -q 3.11 pixi run python --version | grep -q 3.11
pixi run test | grep -q "Hello world" pixi run test | grep -q "Hello world"
global-environments:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
with:
global-environments: |
cowpy
- run: |
cowpy hello world
- run: |
set -o pipefail
pixi info
test -f ${{ matrix.os == 'windows-latest' && './.pixi/envs/default/python.exe' || './.pixi/envs/default/bin/python' }}
${{ matrix.os == 'windows-latest' && './.pixi/envs/default/python.exe' || './.pixi/envs/default/bin/python' }} --version | grep -q 3.11
shell: bash
- run: |
pixi run python --version | grep -q 3.11
pixi run test | grep -q "Hello world"
global-environments-with-project-install:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./
with:
run-install: false
global-environments: |
cowpy
keyring --with keyrings.google-artifactregistry-auth
- run: |
set -o pipefail
cowpy hello world
keyring --list-backends | grep "keyrings.gauth.GooglePythonAuth"
shell: bash
if: matrix.os != 'windows-latest'
- run: |
cowpy hello world
keyring --list-backends | findstr "keyrings.gauth.GooglePythonAuth"
if: matrix.os == 'windows-latest'
no-run-install: no-run-install:
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -70,7 +119,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./ - uses: ./
with: with:
run-install: false run-install: false
@@ -82,10 +131,10 @@ jobs:
custom-pixi-version: custom-pixi-version:
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest, macos-latest, windows-latest, macos-13] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* . run: mv test/old-pixi-lockfiles/* .
- uses: ./ - uses: ./
@@ -103,7 +152,7 @@ jobs:
locked: [true, false] locked: [true, false]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* . run: mv test/old-pixi-lockfiles/* .
- uses: ./ - uses: ./
@@ -119,10 +168,10 @@ jobs:
install-path: install-path:
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest, macos-latest, windows-latest, macos-13] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./ - uses: ./
with: with:
run-install: false run-install: false
@@ -132,10 +181,10 @@ jobs:
global-install: global-install:
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest, macos-latest, windows-latest, macos-13] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./ - uses: ./
with: with:
run-install: false run-install: false
@@ -154,7 +203,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -169,7 +218,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -181,7 +230,7 @@ jobs:
custom-pixi-url: custom-pixi-url:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* . run: mv test/old-pixi-lockfiles/* .
- uses: ./ - uses: ./
@@ -190,10 +239,10 @@ jobs:
pixi-url: https://github.com/prefix-dev/pixi/releases/download/v0.14.0/pixi-x86_64-unknown-linux-musl pixi-url: https://github.com/prefix-dev/pixi/releases/download/v0.14.0/pixi-x86_64-unknown-linux-musl
- run: pixi --version | grep -q "pixi 0.14.0" - run: pixi --version | grep -q "pixi 0.14.0"
pixi-url-bearer-token: pixi-url-headers-bearer:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* . run: mv test/old-pixi-lockfiles/* .
- name: Setup caddy - name: Setup caddy
@@ -216,7 +265,7 @@ jobs:
with: with:
cache: false cache: false
pixi-url: http://localhost:8080/pixi pixi-url: http://localhost:8080/pixi
pixi-url-bearer-token: wrongtoken pixi-url-headers: '{"Authorization": "Bearer wrongtoken"}'
continue-on-error: true continue-on-error: true
- name: Fail if wrong token did not fail - name: Fail if wrong token did not fail
run: | run: |
@@ -228,13 +277,13 @@ jobs:
with: with:
cache: false cache: false
pixi-url: http://localhost:8080/pixi pixi-url: http://localhost:8080/pixi
pixi-url-bearer-token: s3cr3tT0k3nABC123 pixi-url-headers: '{"Authorization": "Bearer s3cr3tT0k3nABC123"}'
- run: pixi --version | grep -q "pixi 0.14.0" - run: pixi --version | grep -q "pixi 0.14.0"
pixi-url-custom-template-no-version: pixi-url-custom-template-no-version:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./ - uses: ./
with: with:
pixi-url: | pixi-url: |
@@ -249,7 +298,7 @@ jobs:
pixi-url-custom-template-version: pixi-url-custom-template-version:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./ - uses: ./
with: with:
pixi-url: | pixi-url: |
@@ -265,7 +314,7 @@ jobs:
pixi-url-custom-template-version-latest: pixi-url-custom-template-version-latest:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./ - uses: ./
with: with:
pixi-url: | pixi-url: |
@@ -278,13 +327,101 @@ jobs:
pixi-version: latest pixi-version: latest
- run: pixi --version | grep -q "pixi 0.14.0" - run: pixi --version | grep -q "pixi 0.14.0"
working-directory:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./
with:
cache: false
working-directory: test/default
- run: |
set -o pipefail
pixi info
test -f .pixi/envs/default/bin/python
.pixi/envs/default/bin/python --version | grep -q 3.11
shell: bash
working-directory: test/default
if: matrix.os != 'windows-latest'
- run: |
set -o pipefail
pixi info
test -f .pixi/envs/default/python.exe
.pixi/envs/default/python.exe --version | grep -q 3.11
shell: bash
working-directory: test/default
if: matrix.os == 'windows-latest'
- run: pixi run python --version | grep -q 3.11
working-directory: test/default
working-directory-with-manifest-path:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./
with:
cache: false
working-directory: test
manifest-path: default/pixi.toml
- run: |
set -o pipefail
pixi info
test -f .pixi/envs/default/bin/python
shell: bash
working-directory: test/default
if: matrix.os != 'windows-latest'
- run: |
set -o pipefail
pixi info
test -f .pixi/envs/default/python.exe
shell: bash
working-directory: test/default
if: matrix.os == 'windows-latest'
- run: pixi run python --version | grep -q 3.11
working-directory: test/default
working-directory-with-absolute-manifest-path:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./
with:
cache: false
working-directory: test/default
manifest-path: ${{ github.workspace }}/test/default/pixi.toml
- run: |
set -o pipefail
pixi info
test -f .pixi/envs/default/bin/python
shell: bash
working-directory: test/default
if: matrix.os != 'windows-latest'
- run: |
set -o pipefail
pixi info
test -f .pixi/envs/default/python.exe
shell: bash
working-directory: test/default
if: matrix.os == 'windows-latest'
- run: pixi run python --version | grep -q 3.11
working-directory: test/default
custom-manifest-path: custom-manifest-path:
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest, windows-11-arm] os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest, windows-11-arm]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./ - uses: ./
with: with:
cache: false cache: false
@@ -296,7 +433,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -310,7 +447,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -331,7 +468,7 @@ jobs:
ignore-reason: [none, version, version-latest, url, bin-path] ignore-reason: [none, version, version-latest, url, bin-path]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- name: Create pixi directory and add to PATH - name: Create pixi directory and add to PATH
@@ -450,7 +587,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -471,7 +608,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -494,7 +631,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -509,6 +646,52 @@ jobs:
# https://github.com/prefix-dev/pixi/issues/330 # https://github.com/prefix-dev/pixi/issues/330
if: matrix.os == 'ubuntu-latest' if: matrix.os == 'ubuntu-latest'
persist-credentials-false:
env:
# We must set this environment variable explicitly to force all
# operating systems to use the same storage mechanism.
# Otherwise, windows and mac will use the keychain, which is more cumbersome to test.
RATTLER_AUTH_FILE: .rattler-credentials.json
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml
run: mv test/default/* .
# Sanity check: Login with default persist-credentials behavior
- uses: ./
with:
cache: false
auth-host: https://custom-conda-registry.com
auth-token: custom-token
- name: Assert that the credentials are stored
run: |
# For human log readers
cat "${RATTLER_AUTH_FILE}"
# Actual test
[ $(jq '."*.custom-conda-registry.com".BearerToken' -r "${RATTLER_AUTH_FILE}") = "custom-token" ]
- name: Clean up credentials file
run: rm "${RATTLER_AUTH_FILE}"
# Actual test: Login with persist-credentials: false
- uses: ./
with:
cache: false
auth-host: https://custom-conda-registry.com
auth-token: custom-token
persist-credentials: false
- name: Assert that the credentials are not stored anymore
run: |
# For human log readers
cat "${RATTLER_AUTH_FILE}"
# Actual test
! grep -q '"*.custom-conda-registry.com"' "${RATTLER_AUTH_FILE}"
auth-token-install: auth-token-install:
strategy: strategy:
matrix: matrix:
@@ -516,7 +699,7 @@ jobs:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/auth/* . run: mv test/auth/* .
- uses: ./ - uses: ./
@@ -535,7 +718,7 @@ jobs:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/auth-s3/* . run: mv test/auth-s3/* .
- uses: ./ - uses: ./
@@ -555,7 +738,7 @@ jobs:
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest] os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -582,7 +765,7 @@ jobs:
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest] os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./ - uses: ./
with: with:
run-install: false run-install: false
@@ -604,7 +787,7 @@ jobs:
matrix: matrix:
post-cleanup: ['true', 'false'] post-cleanup: ['true', 'false']
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: lisanna-dettwyler/action-post-run@d053b9b43d788b87a409f6cdb3b6fc87c6c8a4fe # v3.1.0 - uses: lisanna-dettwyler/action-post-run@d053b9b43d788b87a409f6cdb3b6fc87c6c8a4fe # v3.1.0
@@ -629,7 +812,7 @@ jobs:
matrix: matrix:
post-cleanup: ['true', 'false'] post-cleanup: ['true', 'false']
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: lisanna-dettwyler/action-post-run@d053b9b43d788b87a409f6cdb3b6fc87c6c8a4fe # v3.1.0 - uses: lisanna-dettwyler/action-post-run@d053b9b43d788b87a409f6cdb3b6fc87c6c8a4fe # v3.1.0
@@ -651,7 +834,7 @@ jobs:
matrix: matrix:
post-cleanup: ['true', 'false'] post-cleanup: ['true', 'false']
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: lisanna-dettwyler/action-post-run@d053b9b43d788b87a409f6cdb3b6fc87c6c8a4fe # v3.1.0 - uses: lisanna-dettwyler/action-post-run@d053b9b43d788b87a409f6cdb3b6fc87c6c8a4fe # v3.1.0
@@ -672,7 +855,7 @@ jobs:
matrix: matrix:
post-cleanup: ['true', 'false'] post-cleanup: ['true', 'false']
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: lisanna-dettwyler/action-post-run@d053b9b43d788b87a409f6cdb3b6fc87c6c8a4fe # v3.1.0 - uses: lisanna-dettwyler/action-post-run@d053b9b43d788b87a409f6cdb3b6fc87c6c8a4fe # v3.1.0
@@ -693,7 +876,7 @@ jobs:
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest] os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/no-lockfile/* . run: mv test/no-lockfile/* .
- uses: ./ - uses: ./
@@ -721,11 +904,11 @@ jobs:
name: multiple-environments (${{ matrix.os }}, cache=${{ matrix.cache }}) name: multiple-environments (${{ matrix.os }}, cache=${{ matrix.cache }})
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest, macos-latest, windows-latest, macos-13] os: [ubuntu-latest, macos-latest, windows-latest]
cache: ['true', 'false'] cache: ['true', 'false']
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/multiple-environments/* . run: mv test/multiple-environments/* .
- uses: ./ - uses: ./
@@ -759,9 +942,9 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-latest, macos-13] os: [windows-latest, ubuntu-latest, macos-latest]
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi files - name: Move pixi files
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -775,9 +958,9 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-latest, macos-13] os: [windows-latest, ubuntu-latest, macos-latest]
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi files - name: Move pixi files
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -800,9 +983,9 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-latest, macos-13] os: [windows-latest, ubuntu-latest, macos-latest]
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi files - name: Move pixi files
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -824,9 +1007,9 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-latest, macos-13] os: [windows-latest, ubuntu-latest, macos-latest]
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi files - name: Move pixi files
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -843,7 +1026,7 @@ jobs:
os: [windows-latest, ubuntu-latest, macos-latest] os: [windows-latest, ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi files - name: Move pixi files
run: mv test/pyproject-manifest/* . run: mv test/pyproject-manifest/* .
- uses: ./ - uses: ./
@@ -861,7 +1044,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./ - uses: ./
with: with:
cache: true cache: true
@@ -873,7 +1056,7 @@ jobs:
os: [ubuntu-latest, macos-latest] os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -889,7 +1072,7 @@ jobs:
run: run:
shell: bash shell: bash
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -905,7 +1088,7 @@ jobs:
run: run:
shell: pwsh shell: pwsh
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -921,7 +1104,7 @@ jobs:
run: run:
shell: cmd shell: cmd
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -939,7 +1122,7 @@ jobs:
environment-activation-false: environment-activation-false:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -950,7 +1133,7 @@ jobs:
environment-activation-explicit-env: environment-activation-explicit-env:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/multiple-environments/* . run: mv test/multiple-environments/* .
- uses: ./ - uses: ./
@@ -963,7 +1146,7 @@ jobs:
environment-activation-multiple-env: environment-activation-multiple-env:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/multiple-environments/* . run: mv test/multiple-environments/* .
- uses: ./ - uses: ./
@@ -980,7 +1163,7 @@ jobs:
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-latest] os: [windows-latest, ubuntu-latest, macos-latest]
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/multiple-environments/* . run: mv test/multiple-environments/* .
- uses: ./ - uses: ./
@@ -998,7 +1181,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -1016,7 +1199,7 @@ jobs:
env-variable-input-custom-pixi-url: env-variable-input-custom-pixi-url:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* . run: mv test/old-pixi-lockfiles/* .
- uses: ./ - uses: ./
@@ -1029,7 +1212,7 @@ jobs:
env-variable-input-precendence: env-variable-input-precendence:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi.toml - name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* . run: mv test/old-pixi-lockfiles/* .
- uses: ./ - uses: ./
@@ -1047,7 +1230,7 @@ jobs:
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-latest] os: [windows-latest, ubuntu-latest, macos-latest]
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi files - name: Move pixi files
run: mv test/no-lockfile/* . run: mv test/no-lockfile/* .
- uses: ./ - uses: ./
@@ -1069,7 +1252,7 @@ jobs:
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-latest] os: [windows-latest, ubuntu-latest, macos-latest]
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi files - name: Move pixi files
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -1090,7 +1273,7 @@ jobs:
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-latest] os: [windows-latest, ubuntu-latest, macos-latest]
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi files - name: Move pixi files
run: mv test/default/* . run: mv test/default/* .
- uses: ./ - uses: ./
@@ -1113,7 +1296,7 @@ jobs:
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-latest] os: [windows-latest, ubuntu-latest, macos-latest]
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi files - name: Move pixi files
run: mv test/no-lockfile/* . run: mv test/no-lockfile/* .
- uses: ./ - uses: ./
@@ -1134,7 +1317,7 @@ jobs:
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-latest] os: [windows-latest, ubuntu-latest, macos-latest]
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi files - name: Move pixi files
run: mv test/no-lockfile/* . run: mv test/no-lockfile/* .
- uses: ./ - uses: ./
@@ -1155,7 +1338,7 @@ jobs:
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-latest] os: [windows-latest, ubuntu-latest, macos-latest]
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi files - name: Move pixi files
run: mv test/lockfile-not-up-to-date/* . run: mv test/lockfile-not-up-to-date/* .
- uses: ./ - uses: ./
@@ -1176,7 +1359,7 @@ jobs:
matrix: matrix:
os: [windows-latest, ubuntu-latest, macos-latest] os: [windows-latest, ubuntu-latest, macos-latest]
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Move pixi files - name: Move pixi files
run: mv test/no-lockfile/* . run: mv test/no-lockfile/* .
- uses: ./ - uses: ./
+111 -29
View File
@@ -23,9 +23,9 @@ GitHub Action to set up the [pixi](https://github.com/prefix-dev/pixi) package m
## Usage ## Usage
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
pixi-version: v0.49.0 pixi-version: v0.66.0
cache: true cache: true
auth-host: prefix.dev auth-host: prefix.dev
@@ -35,7 +35,7 @@ GitHub Action to set up the [pixi](https://github.com/prefix-dev/pixi) package m
> [!WARNING] > [!WARNING]
> Since pixi is not yet stable, the API of this action may change between minor versions. > Since pixi is not yet stable, the API of this action may change between minor versions.
> Please pin the versions of this action to a specific version (i.e., `prefix-dev/setup-pixi@v0.8.13`) to avoid breaking changes. > Please pin the versions of this action to a specific version (i.e., `prefix-dev/setup-pixi@v0.9.6`) to avoid breaking changes.
> You can automatically update the version of this action by using [Dependabot](https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot). > You can automatically update the version of this action by using [Dependabot](https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot).
> >
> Put the following in your `.github/dependabot.yml` file to enable Dependabot for your GitHub Actions: > Put the following in your `.github/dependabot.yml` file to enable Dependabot for your GitHub Actions:
@@ -51,6 +51,8 @@ GitHub Action to set up the [pixi](https://github.com/prefix-dev/pixi) package m
> dependencies: > dependencies:
> patterns: > patterns:
> - '*' > - '*'
> cooldown:
> default-days: 7
> ``` > ```
## Features ## Features
@@ -59,14 +61,17 @@ To see all available input arguments, see the [`action.yml`](action.yml) file.
### Caching ### Caching
The action supports caching of the pixi environment. The action supports caching of the project and global pixi environments.
By default, caching is enabled if a `pixi.lock` file is present. By default, project environment caching is enabled if a `pixi.lock` file is present.
It will then use the `pixi.lock` file to generate a hash of the environment and cache it. It will then use the `pixi.lock` file to generate a hash of the environment and cache it.
If the cache is hit, the action will skip the installation and use the cached environment. If the cache is hit, the action will skip the installation and use the cached environment.
You can specify the behavior by setting the `cache` input argument. You can specify the behavior by setting the `cache` input argument.
If you need to customize your cache-key, you can use the `cache-key` input argument. Global environment caching is disabled by default and can be enabled by setting the `global-cache` input to `true`.
This will be the prefix of the cache key. The full cache key will be `<cache-key><conda-arch>-<hash>`. As there is no lockfile for global environments, the cache will expire at the end of every month to ensure it does not go stale.
If you need to customize your cache-key, you can use the `cache-key` and `global-cache-key` input arguments.
These will be the prefixes of the cache keys. The full cache keys will be `<cache-key><conda-arch>-<hash>` and `<global-cache-key><conda-arch>-<YYYY-MM>-<hash>` respectively.
#### Only save caches on `main` #### Only save caches on `main`
@@ -74,7 +79,7 @@ In order to not exceed the [10 GB cache size limit](https://docs.github.com/en/a
This can be done by setting the `cache-write` argument. This can be done by setting the `cache-write` argument.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
cache: true cache: true
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
@@ -119,7 +124,7 @@ test:
environment: [py311, py312] environment: [py311, py312]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
environments: ${{ matrix.environment }} environments: ${{ matrix.environment }}
``` ```
@@ -129,7 +134,7 @@ test:
The following example will install both the `py311` and the `py312` environment on the runner. The following example will install both the `py311` and the `py312` environment on the runner.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
# separated by spaces # separated by spaces
environments: >- environments: >-
@@ -143,16 +148,36 @@ The following example will install both the `py311` and the `py312` environment
> [!WARNING] > [!WARNING]
> If you don't specify any environment, the `default` environment will be installed and cached, even if you use other environments. > If you don't specify any environment, the `default` environment will be installed and cached, even if you use other environments.
### Global Environments
You can specify `pixi global install` commands by setting the `global-environments` input argument.
This will create one environment per line, and install them.
This is useful in particular to install executables that are needed for `pixi install` to work properly.
For instance, the `keyring`, or `gcloud` executables. The following example shows how to install both in separate global environments.
By default, global environments are not cached. You can enable caching by setting the `global-cache` input to `true`.
```yml
- uses: prefix-dev/setup-pixi@v0.9.6
with:
global-environments: |
google-cloud-sdk
keyring --with keyrings.google-artifactregistry-auth
- run: |
gcloud --version
keyring --list-backends
```
### Authentication ### Authentication
There are currently three ways to authenticate with pixi: There are currently five ways to authenticate with pixi:
- using a token - using a token
- using a username and password - using a username and password
- using a conda-token - using a conda-token
- using an S3 key pair - using an S3 key pair
- using keyring for PyPI registries
For more information, see the [pixi documentation](https://prefix.dev/docs/pixi/authentication). For more information, see the [pixi documentation](https://pixi.sh/latest/deployment/authentication/).
> [!WARNING] > [!WARNING]
> Please only store sensitive information using [GitHub secrets](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions). Do not store them in your repository. > Please only store sensitive information using [GitHub secrets](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions). Do not store them in your repository.
@@ -165,7 +190,7 @@ Specify the token using the `auth-token` input argument.
This form of authentication (bearer token in the request headers) is mainly used at [prefix.dev](https://prefix.dev). This form of authentication (bearer token in the request headers) is mainly used at [prefix.dev](https://prefix.dev).
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
auth-host: prefix.dev auth-host: prefix.dev
auth-token: ${{ secrets.PREFIX_DEV_TOKEN }} auth-token: ${{ secrets.PREFIX_DEV_TOKEN }}
@@ -177,7 +202,7 @@ Specify the username and password using the `auth-username` and `auth-password`
This form of authentication (HTTP Basic Auth) is used in some enterprise environments with [artifactory](https://jfrog.com/artifactory) for example. This form of authentication (HTTP Basic Auth) is used in some enterprise environments with [artifactory](https://jfrog.com/artifactory) for example.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
auth-host: custom-artifactory.com auth-host: custom-artifactory.com
auth-username: ${{ secrets.PIXI_USERNAME }} auth-username: ${{ secrets.PIXI_USERNAME }}
@@ -190,7 +215,7 @@ Specify the conda-token using the `auth-conda-token` input argument.
This form of authentication (token is encoded in URL: `https://my-quetz-instance.com/t/<token>/get/custom-channel`) is used at [anaconda.org](https://anaconda.org) or with [quetz instances](https://github.com/mamba-org/quetz). This form of authentication (token is encoded in URL: `https://my-quetz-instance.com/t/<token>/get/custom-channel`) is used at [anaconda.org](https://anaconda.org) or with [quetz instances](https://github.com/mamba-org/quetz).
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
auth-host: anaconda.org # or my-quetz-instance.com auth-host: anaconda.org # or my-quetz-instance.com
auth-conda-token: ${{ secrets.CONDA_TOKEN }} auth-conda-token: ${{ secrets.CONDA_TOKEN }}
@@ -202,7 +227,7 @@ Specify the S3 key pair using the `auth-access-key-id` and `auth-secret-access-k
You can also specify the session token using the `auth-session-token` input argument. You can also specify the session token using the `auth-session-token` input argument.
```yaml ```yaml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
auth-host: s3://my-s3-bucket auth-host: s3://my-s3-bucket
auth-s3-access-key-id: ${{ secrets.ACCESS_KEY_ID }} auth-s3-access-key-id: ${{ secrets.ACCESS_KEY_ID }}
@@ -213,6 +238,33 @@ You can also specify the session token using the `auth-session-token` input argu
See the [pixi documentation](https://pixi.sh/latest/advanced/s3) for more information about S3 authentication. See the [pixi documentation](https://pixi.sh/latest/advanced/s3) for more information about S3 authentication.
#### Restricting credentials to the install step
If you only want pixi to use the authenticated remote channel during the action's own install step
(and not in any subsequent step of the workflow), set `persist-credentials: false`. The action will
then run `pixi auth logout <auth-host>` after `pixi install` has completed but before the action
returns, so that later steps cannot reach the private channel anymore.
```yml
- uses: prefix-dev/setup-pixi@v0.9.6
with:
auth-host: prefix.dev
auth-token: ${{ secrets.PREFIX_DEV_TOKEN }}
persist-credentials: false
```
#### PyPI keyring provider
You can specify whether to use keyring to look up credentials for PyPI.
```yml
- uses: prefix-dev/setup-pixi@v0.9.6
with:
pypi-keyring-provider: subprocess # one of 'subprocess', 'disabled'
```
You can use the [`global-environments`](#global-environments) input to install `keyring` and its backends.
### Custom shell wrapper ### Custom shell wrapper
`setup-pixi` allows you to run command inside of the pixi environment by specifying a custom shell wrapper with `shell: pixi run bash -e {0}`. `setup-pixi` allows you to run command inside of the pixi environment by specifying a custom shell wrapper with `shell: pixi run bash -e {0}`.
@@ -274,7 +326,7 @@ To this end, `setup-pixi` adds all environment variables set when executing `pix
As a result, all installed binaries can be accessed without having to call `pixi run`. As a result, all installed binaries can be accessed without having to call `pixi run`.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
activate-environment: true activate-environment: true
``` ```
@@ -282,7 +334,7 @@ As a result, all installed binaries can be accessed without having to call `pixi
If you are installing multiple environments, you will need to specify the name of the environment that you want to be activated. If you are installing multiple environments, you will need to specify the name of the environment that you want to be activated.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
environments: >- environments: >-
py311 py311
@@ -296,10 +348,10 @@ However, be aware that this option augments the environment of your job.
### `--frozen` and `--locked` ### `--frozen` and `--locked`
You can specify whether `setup-pixi` should run `pixi install --frozen` or `pixi install --locked` depending on the `frozen` or the `locked` input argument. You can specify whether `setup-pixi` should run `pixi install --frozen` or `pixi install --locked` depending on the `frozen` or the `locked` input argument.
See the [official documentation](https://prefix.dev/docs/pixi/cli#install) for more information about the `--frozen` and `--locked` flags. See the [official documentation](https://pixi.sh/latest/reference/cli/pixi/install/#update-options) for more information about the `--frozen` and `--locked` flags.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
locked: true locked: true
# or # or
@@ -318,7 +370,7 @@ The first one is the debug logging of the action itself.
This can be enabled by running the action with the `RUNNER_DEBUG` environment variable set to `true`. This can be enabled by running the action with the `RUNNER_DEBUG` environment variable set to `true`.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
env: env:
RUNNER_DEBUG: true RUNNER_DEBUG: true
``` ```
@@ -336,7 +388,7 @@ The second type is the debug logging of the pixi executable.
This can be specified by setting the `log-level` input. This can be specified by setting the `log-level` input.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
# one of `q`, `default`, `v`, `vv`, or `vvv`. # one of `q`, `default`, `v`, `vv`, or `vvv`.
log-level: vvv log-level: vvv
@@ -362,7 +414,7 @@ If nothing is specified, `post-cleanup` will default to `true`.
On self-hosted runners, you also might want to alter the default pixi install location to a temporary location. You can use `pixi-bin-path: ${{ runner.temp }}/bin/pixi` to do this. On self-hosted runners, you also might want to alter the default pixi install location to a temporary location. You can use `pixi-bin-path: ${{ runner.temp }}/bin/pixi` to do this.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
post-cleanup: true post-cleanup: true
# ${{ runner.temp }}\Scripts\pixi.exe on Windows # ${{ runner.temp }}\Scripts\pixi.exe on Windows
@@ -378,17 +430,47 @@ You can also use a preinstalled local version of pixi on the runner by not setti
This can be overwritten by setting the `manifest-path` input argument. This can be overwritten by setting the `manifest-path` input argument.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
manifest-path: pyproject.toml manifest-path: pyproject.toml
``` ```
### Working directory for monorepos
If you're working with a monorepo where your pixi project is in a subdirectory, you can use the `working-directory` input to specify where pixi should look for manifest files (`pixi.toml` or `pyproject.toml`).
```yml
- uses: prefix-dev/setup-pixi@v0.9.6
with:
working-directory: ./packages/my-project
```
This will make pixi look for `pixi.toml` or `pyproject.toml` in the `./packages/my-project` directory instead of the repository root. All pixi commands will be executed from this working directory.
> [!NOTE]
> The `working-directory` input only affects commands run by `setup-pixi` itself.
> For subsequent `run:` steps, you need to set the working directory separately:
>
> ```yml
> - run: pixi run test
> working-directory: ./packages/my-project
> ```
You can combine `working-directory` with `manifest-path` if needed:
```yml
- uses: prefix-dev/setup-pixi@v0.9.6
with:
working-directory: ./packages/my-project
manifest-path: custom-pixi.toml
```
### Only install pixi ### Only install pixi
If you only want to install pixi and not install the current project, you can use the `run-install` option. If you only want to install pixi and not install the current project, you can use the `run-install` option.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
run-install: false run-install: false
``` ```
@@ -396,13 +478,13 @@ If you only want to install pixi and not install the current project, you can us
### Download pixi from a custom URL ### Download pixi from a custom URL
You can also download pixi from a custom URL by setting the `pixi-url` input argument. You can also download pixi from a custom URL by setting the `pixi-url` input argument.
Optionally, you can combine this with the `pixi-url-bearer-token` input argument to authenticate the download request. Optionally, you can combine this with the `pixi-url-headers` input argument to supply additional headers for the download request, such as a bearer token.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
pixi-url: https://pixi-mirror.example.com/releases/download/v0.48.0/pixi-x86_64-unknown-linux-musl pixi-url: https://pixi-mirror.example.com/releases/download/v0.48.0/pixi-x86_64-unknown-linux-musl
pixi-url-bearer-token: ${{ secrets.PIXI_MIRROR_BEARER_TOKEN }} pixi-url-headers: '{"Authorization": "Bearer ${{ secrets.PIXI_MIRROR_BEARER_TOKEN }}"}'
``` ```
The `pixi-url` input argument can also be a [Handlebars](https://handlebarsjs.com/) template string. The `pixi-url` input argument can also be a [Handlebars](https://handlebarsjs.com/) template string.
@@ -415,7 +497,7 @@ It will be rendered with the following variables:
By default, `pixi-url` is equivalent to the following template: By default, `pixi-url` is equivalent to the following template:
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.13 - uses: prefix-dev/setup-pixi@v0.9.6
with: with:
pixi-url: | pixi-url: |
{{#if latest~}} {{#if latest~}}
+30 -5
View File
@@ -10,19 +10,26 @@ inputs:
description: Version of pixi to install description: Version of pixi to install
pixi-url: pixi-url:
description: URL of pixi to install. Can be a Handlebars template receiving `version`, `latest`, and `pixiFile` as variables. description: URL of pixi to install. Can be a Handlebars template receiving `version`, `latest`, and `pixiFile` as variables.
pixi-url-bearer-token: pixi-url-headers:
description: Bearer token to use for authentication when downloading pixi from a URL. description: Headers to use when fetching the pixi binary from `pixi-url`. Should be a JSON string.
log-level: log-level:
description: | description: |
Log level for the pixi CLI. Log level for the pixi CLI.
One of `q`, `default`, `v`, `vv`, or `vvv`. One of `q`, `default`, `v`, `vv`, or `vvv`.
manifest-path: manifest-path:
description: Path to the manifest file (i.e., `pixi.toml`) to use for the pixi CLI. Defaults to `pixi.toml`. description: Path to the manifest file (i.e., `pixi.toml`) to use for the pixi CLI. Defaults to `pixi.toml`.
working-directory:
description: |
Working directory to use for pixi commands. If specified, pixi will look for manifest files (pixi.toml or pyproject.toml)
in this directory instead of the repository root. Useful for monorepos where pixi projects are in subdirectories.
run-install: run-install:
description: Whether to run `pixi install` after installing pixi. Defaults to `true`. description: Whether to run `pixi install` after installing pixi. Defaults to `true`.
environments: environments:
description: | description: |
A space-separated list of environments to install. If not specified, only the default environment is installed. A space-separated list of environments to install. If not specified, only the default environment is installed.
global-environments:
description: |
A newline-separated list of packages to install globally with `pixi global install`.
activate-environment: activate-environment:
description: | description: |
If the installed environment should be "activated" for the current job, modifying `$GITHUB_ENV` and If the installed environment should be "activated" for the current job, modifying `$GITHUB_ENV` and
@@ -34,13 +41,21 @@ inputs:
description: Whether to use `pixi install --frozen`. Defaults to `false`. description: Whether to use `pixi install --frozen`. Defaults to `false`.
cache: cache:
description: Whether to cache the pixi environment. Defaults to `true`. Only works if `pixi.lock` is present. description: Whether to cache the pixi environment. Defaults to `true`. Only works if `pixi.lock` is present.
global-cache:
description: |
Whether to cache the global environment(s). Defaults to `false`. As there is no lockfile for global environment,
the global cache will expire at the end of every month, to ensure it does not go stale.
cache-key: cache-key:
description: | description: |
Cache key prefix to use for caching the pixi environment. Cache key prefix to use for caching the pixi environment.
Defaults to `pixi-`. The full cache key is `<cache-key><conda-arch>-<sha-256-of-pixi-lock>`. Defaults to `pixi-`. The full cache key is `<cache-key><conda-arch>-<sha-256-of-pixi-lock>`.
global-cache-key:
description: |
Cache key prefix to use for caching the global environments.
Defaults to `pixi-global-`. The full cache key is `<global-cache-key><conda-arch>-<sha-256-of-global-environments>`.
cache-write: cache-write:
description: | description: |
Whether to write to the cache or only read from it. Defaults to `true`. Whether to write to the cache or only read from it. Defaults to `true`. Applies to both project and global caches as the case may be.
pixi-bin-path: pixi-bin-path:
description: | description: |
Path to the pixi binary to use. Defaults to `~/.pixi/bin/pixi`. Path to the pixi binary to use. Defaults to `~/.pixi/bin/pixi`.
@@ -48,7 +63,7 @@ inputs:
description: | description: |
Host to use for authentication. If not set, pixi is not authenticating. Host to use for authentication. If not set, pixi is not authenticating.
Requires `auth-token` or `auth-conda-token` or `auth-username` and `auth-password` to be set. Requires `auth-token` or `auth-conda-token` or `auth-username` and `auth-password` to be set.
See https://prefix.dev/docs/pixi/authentication See https://pixi.prefix.dev/latest/deployment/authentication/
auth-token: auth-token:
description: Token to use for authentication. description: Token to use for authentication.
auth-username: auth-username:
@@ -63,12 +78,22 @@ inputs:
description: Secret access key to use for S3 authentication. description: Secret access key to use for S3 authentication.
auth-s3-session-token: auth-s3-session-token:
description: Session token to use for S3 authentication. description: Session token to use for S3 authentication.
persist-credentials:
description: |
Whether to keep the credentials configured by `auth-host` available to subsequent workflow
steps. Defaults to `true`. If set to `false`, the action runs `pixi auth logout <auth-host>`
after install, so that later steps cannot reach the private channel anymore. Requires
`auth-host`.
pypi-keyring-provider:
description: |
Specifies whether to use keyring to look up credentials for PyPI.
options: disabled, subprocess
post-cleanup: post-cleanup:
description: | description: |
If the action should clean up after itself. Defaults to `true`. If the action should clean up after itself. Defaults to `true`.
If `true`, the pixi environment, the pixi binary and the rattler files in ~/.rattler and ~/.cache/rattler are removed. If `true`, the pixi environment, the pixi binary and the rattler files in ~/.rattler and ~/.cache/rattler are removed.
runs: runs:
using: node20 using: node24
main: dist/index.js main: dist/index.js
post: dist/post.js post: dist/post.js
Generated Vendored
+68825 -54331
View File
File diff suppressed because one or more lines are too long
Generated Vendored
+14769 -15488
View File
File diff suppressed because one or more lines are too long
+18 -18
View File
@@ -1,6 +1,6 @@
{ {
"name": "setup-pixi", "name": "setup-pixi",
"version": "0.8.13", "version": "0.9.6",
"private": true, "private": true,
"description": "Action to set up the pixi package manager.", "description": "Action to set up the pixi package manager.",
"scripts": { "scripts": {
@@ -22,25 +22,25 @@
"author": "Pavel Zwerschke <pavelzw@gmail.com>", "author": "Pavel Zwerschke <pavelzw@gmail.com>",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"dependencies": { "dependencies": {
"@actions/cache": "^4.0.3", "@actions/cache": "^6.0.0",
"@actions/core": "^1.11.1", "@actions/core": "^3.0.1",
"@actions/exec": "^1.1.1", "@actions/exec": "^3.0.0",
"@actions/io": "^1.1.3", "@actions/io": "^3.0.2",
"@actions/tool-cache": "^2.0.2", "@actions/tool-cache": "^4.0.0",
"handlebars": "^4.7.8", "handlebars": "^4.7.9",
"smol-toml": "^1.4.0", "smol-toml": "^1.6.1",
"untildify": "^5.0.0", "untildify": "^6.0.0",
"which": "^5.0.0", "which": "^6.0.1",
"zod": "^3.25.67" "zod": "^4.3.6"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.30.0", "@eslint/js": "^10.0.1",
"@types/node": "^24.0.8", "@types/node": "^25.6.0",
"@types/which": "^3.0.4", "@types/which": "^3.0.4",
"eslint": "^9.30.0", "eslint": "^10.2.1",
"prettier": "^3.6.2", "prettier": "^3.8.3",
"tsup": "^8.4.0", "tsup": "^8.5.1",
"typescript": "^5.8.2", "typescript": "^6.0.3",
"typescript-eslint": "^8.35.1" "typescript-eslint": "^8.59.0"
} }
} }
+993 -1652
View File
File diff suppressed because it is too large Load Diff
+146 -66
View File
@@ -5,79 +5,159 @@ import * as cache from '@actions/cache'
import { options } from './options' import { options } from './options'
import { getCondaArch, sha256 } from './util' import { getCondaArch, sha256 } from './util'
export const generateCacheKey = async (cacheKeyPrefix: string) => const getYearMonth = () => {
Promise.all([fs.readFile(options.pixiLockFile), fs.readFile(options.pixiBinPath)]) // this gets us the current month formatted as YYYY-MM
.then(([lockfileContent, pixiBinary]) => { return new Date().toLocaleDateString('en-CA', { year: 'numeric', month: '2-digit' })
const lockfileSha = sha256(lockfileContent) }
core.debug(`lockfileSha: ${lockfileSha}`)
const pixiSha = sha256(pixiBinary) let pixiSha: string | undefined
core.debug(`pixiSha: ${pixiSha}`) const getPixiSha = async () => {
// the path to the lock file decides where the pixi env is created (../.pixi/env) if (pixiSha) {
// since conda envs are not relocatable, we need to include the path in the cache key return pixiSha
const lockfilePathSha = sha256(options.pixiLockFile) }
core.debug(`lockfilePathSha: ${lockfilePathSha}`) const pixiBinary = await fs.readFile(options.pixiBinPath)
const environments = sha256(options.environments?.join(' ') ?? '') pixiSha = sha256(pixiBinary)
core.debug(`environments: ${environments}`) return pixiSha
// since the lockfile path is not necessarily absolute, we need to include the cwd in the cache key }
const cwdSha = sha256(process.cwd())
core.debug(`cwdSha: ${cwdSha}`) export const generateProjectCacheKey = async (cacheKeyPrefix: string) => {
const sha = sha256(lockfileSha + environments + pixiSha + lockfilePathSha + cwdSha) try {
core.debug(`sha: ${sha}`) const [lockfileContent, pixiSha] = await Promise.all([fs.readFile(options.pixiLockFile), getPixiSha()])
return `${cacheKeyPrefix}${getCondaArch()}-${sha}` const lockfileSha = sha256(lockfileContent)
}) core.debug(`lockfileSha: ${lockfileSha}`)
.catch((err: unknown) => { core.debug(`pixiSha: ${pixiSha}`)
// the path to the lock file decides where the pixi env is created (../.pixi/env)
// since conda envs are not relocatable, we need to include the path in the cache key
const lockfilePathSha = sha256(options.pixiLockFile)
core.debug(`lockfilePathSha: ${lockfilePathSha}`)
const environments = sha256(options.environments?.join(' ') ?? '')
core.debug(`environments: ${environments}`)
// since the lockfile path is not necessarily absolute, we need to include the working directory in the cache key
const cwdSha = sha256(options.workingDirectory)
core.debug(`cwdSha: ${cwdSha}`)
const sha = sha256(lockfileSha + environments + pixiSha + lockfilePathSha + cwdSha)
core.debug(`sha: ${sha}`)
return `${cacheKeyPrefix}${getCondaArch()}-${sha}`
} catch (err: unknown) {
throw new Error(`Failed to generate cache key`, { cause: err })
}
}
export const generateGlobalCacheKey = async (cacheKeyPrefix: string) => {
try {
const pixiSha = await getPixiSha()
core.debug(`pixiSha: ${pixiSha}`)
const globalEnvironments = sha256(options.globalEnvironments?.join(' ') ?? '')
core.debug(`globalEnvironments: ${globalEnvironments}`)
const sha = sha256(globalEnvironments + pixiSha + getGlobalCachePath())
core.debug(`sha: ${sha}`)
return `${cacheKeyPrefix}${getCondaArch()}-${getYearMonth()}-${sha}`
} catch (err: unknown) {
throw new Error(`Failed to generate cache key`, { cause: err })
}
}
const projectCachePath = path.join(path.dirname(options.pixiLockFile), '.pixi')
const getGlobalCachePath = () => {
const pixiHome = process.env.PIXI_HOME
if (pixiHome) {
return path.join(pixiHome, 'envs')
}
const home = process.env.HOME
if (home) {
return path.join(home, '.pixi', 'envs')
}
throw new Error('Neither PIXI_HOME nor HOME environment variables are set.')
}
let projectCacheHit = false
let globalCacheHit = false
async function _tryRestoreCache(
type: 'project' | 'global',
keyPrefix: string,
generateKey: (prefix: string) => Promise<string>,
cachePath: string,
onHit: () => void
): Promise<string | undefined> {
return core.group(`Restoring ${type} cache`, async () => {
const cacheKey = await generateKey(keyPrefix)
core.debug(`Cache key: ${cacheKey}`)
core.debug(`Cache path: ${cachePath}`)
const key = await cache.restoreCache([cachePath], cacheKey, undefined, undefined, false)
if (key) {
core.info(`Restored cache with key \`${key}\``)
onHit()
} else {
core.info(`Cache miss`)
}
return key
})
}
async function _saveCache(
type: 'project' | 'global',
wasHit: boolean,
keyPrefix: string,
generateKey: (prefix: string) => Promise<string>,
cachePath: string
) {
if (wasHit) {
core.debug(`Skipping ${type} cache save because cache was restored.`)
return
}
await core.group(`Saving ${type.toLowerCase()} cache`, async () => {
const cacheKey = await generateKey(keyPrefix)
try {
const cacheId = await cache.saveCache([cachePath], cacheKey, undefined, false)
core.info(`Saved cache with ID "${cacheId.toString()}"`)
} catch (err: unknown) {
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
throw new Error(`Failed to generate cache key: ${err}`) core.error(`Error saving ${type} cache: ${err}`)
}) }
})
}
const cachePath = path.join(path.dirname(options.pixiLockFile), '.pixi') export const tryRestoreProjectCache = async (): Promise<string | undefined> => {
let cacheHit = false
export const tryRestoreCache = (): Promise<string | undefined> => {
const cache_ = options.cache const cache_ = options.cache
if (!cache_) { if (!cache_) {
core.debug('Skipping pixi cache restore.') core.debug('Skipping project cache restore.')
return Promise.resolve(undefined) return undefined
} }
return core.group('Restoring pixi cache', () => return _tryRestoreCache('project', cache_.cacheKeyPrefix, generateProjectCacheKey, projectCachePath, () => {
generateCacheKey(cache_.cacheKeyPrefix).then((cacheKey) => { projectCacheHit = true
core.debug(`Cache key: ${cacheKey}`) })
core.debug(`Cache path: ${cachePath}`)
return cache.restoreCache([cachePath], cacheKey, undefined, undefined, false).then((key) => {
if (key) {
core.info(`Restored cache with key \`${key}\``)
cacheHit = true
} else {
core.info(`Cache miss`)
}
return key
})
})
)
} }
export const saveCache = () => { export const tryRestoreGlobalCache = async (): Promise<string | undefined> => {
const cache_ = options.cache const cache_ = options.globalCache
if (!cache_?.cacheWrite) { if (!cache_ || !options.globalEnvironments || options.globalEnvironments.length === 0) {
core.debug('Skipping pixi cache save.') core.debug('Skipping global cache restore.')
return Promise.resolve(undefined) return undefined
} }
if (cacheHit) { return _tryRestoreCache('global', cache_.cacheKeyPrefix, generateGlobalCacheKey, getGlobalCachePath(), () => {
core.debug('Skipping pixi cache save because cache was restored.') globalCacheHit = true
return Promise.resolve(undefined) })
}
export const saveProjectCache = async () => {
const cache_ = options.cache
if (!cache_?.cacheWrite || !options.runInstall) {
core.debug('Skipping project cache save.')
return
} }
return core.group('Saving pixi cache', () => await _saveCache('project', projectCacheHit, cache_.cacheKeyPrefix, generateProjectCacheKey, projectCachePath)
generateCacheKey(cache_.cacheKeyPrefix).then((cacheKey) => }
cache
.saveCache([cachePath], cacheKey, undefined, false) export const saveGlobalCache = async () => {
.then((cacheId) => { const cache_ = options.globalCache
core.info(`Saved cache with ID "${cacheId.toString()}"`) if (!cache_?.cacheWrite || !options.globalEnvironments || options.globalEnvironments.length === 0) {
}) core.debug('Skipping global cache save.')
.catch((err: unknown) => { return
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions }
core.error(`Error saving cache: ${err}`) await _saveCache('global', globalCacheHit, cache_.cacheKeyPrefix, generateGlobalCacheKey, getGlobalCachePath())
})
)
)
} }
+99 -54
View File
@@ -7,52 +7,59 @@ import { downloadTool } from '@actions/tool-cache'
import type { PixiSource } from './options' import type { PixiSource } from './options'
import { options } from './options' import { options } from './options'
import { execute, pixiCmd, renderPixiUrl } from './util' import { execute, pixiCmd, renderPixiUrl } from './util'
import { saveCache, tryRestoreCache } from './cache' import { tryRestoreGlobalCache, tryRestoreProjectCache, saveGlobalCache, saveProjectCache } from './cache'
import { activateEnvironment } from './activate' import { activateEnvironment } from './activate'
const downloadPixi = (source: PixiSource) => { const downloadPixi = async (source: PixiSource) => {
const url = renderPixiUrl(source.urlTemplate, source.version) const url = renderPixiUrl(source.urlTemplate, source.version)
const auth = 'bearerToken' in source && source.bearerToken ? `Bearer ${source.bearerToken}` : '' await core.group('Downloading Pixi', async () => {
return core.group('Downloading Pixi', () => {
core.debug('Installing pixi') core.debug('Installing pixi')
core.debug(`Downloading pixi from ${url}`) core.debug(`Downloading pixi from ${url}`)
core.debug(`Using Bearer auth: ${auth ? 'yes' : 'no'}`) core.debug(`Using headers: ${JSON.stringify(source.headers)}`)
return fs await fs.mkdir(path.dirname(options.pixiBinPath), { recursive: true })
.mkdir(path.dirname(options.pixiBinPath), { recursive: true }) await downloadTool(url, options.pixiBinPath, undefined, source.headers)
.then(() => downloadTool(url, options.pixiBinPath, auth)) await fs.chmod(options.pixiBinPath, 0o755)
.then((_downloadPath) => fs.chmod(options.pixiBinPath, 0o755)) core.info(`Pixi installed to ${options.pixiBinPath}`)
.then(() => {
core.info(`Pixi installed to ${options.pixiBinPath}`)
})
}) })
} }
const pixiLogin = () => { const pixiLogin = async () => {
const auth = options.auth const auth = options.auth
if (!auth) { if (!auth) {
core.debug('Skipping pixi login.') core.debug('Skipping pixi login.')
return Promise.resolve(0) return
} }
core.debug(`auth keys: ${Object.keys(auth).toString()}`) core.debug(`auth keys: ${Object.keys(auth).toString()}`)
return core.group('Logging in to private channel', () => { await core.group('Logging in to private channel', async () => {
// tokens get censored in the logs as long as they are a github secret // tokens get censored in the logs as long as they are a github secret
if ('token' in auth) { if ('token' in auth) {
core.debug(`Logging in to ${auth.host} with token`) core.debug(`Logging in to ${auth.host} with token`)
return execute(pixiCmd(`auth login --token ${auth.token} ${auth.host}`, false)) await execute(pixiCmd(`auth login --token ${auth.token} ${auth.host}`, false))
} } else if ('username' in auth) {
if ('username' in auth) {
core.debug(`Logging in to ${auth.host} with username and password`) core.debug(`Logging in to ${auth.host} with username and password`)
return execute(pixiCmd(`auth login --username ${auth.username} --password ${auth.password} ${auth.host}`, false)) await execute(pixiCmd(`auth login --username ${auth.username} --password ${auth.password} ${auth.host}`, false))
} } else if ('s3AccessKeyId' in auth) {
if ('s3AccessKeyId' in auth) {
core.debug(`Logging in to ${auth.host} with s3 credentials`) core.debug(`Logging in to ${auth.host} with s3 credentials`)
const command = auth.s3SessionToken const command = auth.s3SessionToken
? `auth login --s3-access-key-id ${auth.s3AccessKeyId} --s3-secret-access-key ${auth.s3SecretAccessKey} --s3-session-token ${auth.s3SessionToken} ${auth.host}` ? `auth login --s3-access-key-id ${auth.s3AccessKeyId} --s3-secret-access-key ${auth.s3SecretAccessKey} --s3-session-token ${auth.s3SessionToken} ${auth.host}`
: `auth login --s3-access-key-id ${auth.s3AccessKeyId} --s3-secret-access-key ${auth.s3SecretAccessKey} ${auth.host}` : `auth login --s3-access-key-id ${auth.s3AccessKeyId} --s3-secret-access-key ${auth.s3SecretAccessKey} ${auth.host}`
return execute(pixiCmd(command, false)) await execute(pixiCmd(command, false))
} else if ('condaToken' in auth) {
core.debug(`Logging in to ${auth.host} with conda token`)
await execute(pixiCmd(`auth login --conda-token ${auth.condaToken} ${auth.host}`, false))
} }
core.debug(`Logging in to ${auth.host} with conda token`) })
return execute(pixiCmd(`auth login --conda-token ${auth.condaToken} ${auth.host}`, false)) }
const pixiLogout = async () => {
const auth = options.auth
if (!auth || auth.persistCredentials) {
core.debug('Skipping pixi logout.')
return
}
await core.group('Logging out of private channel', async () => {
core.debug(`Logging out of ${auth.host}`)
await execute(pixiCmd(`auth logout ${auth.host}`, false))
}) })
} }
@@ -60,33 +67,58 @@ const addPixiToPath = () => {
core.addPath(path.dirname(options.pixiBinPath)) core.addPath(path.dirname(options.pixiBinPath))
} }
const pixiGlobalInstall = async () => {
const { globalEnvironments } = options
if (!globalEnvironments) {
core.debug('Skipping pixi global install.')
return
}
await tryRestoreGlobalCache()
core.debug('Installing global environments')
for (const env of globalEnvironments) {
const command = `global install ${env}`
await core.group(`pixi ${command}`, () => execute(pixiCmd(command, false)))
}
await saveGlobalCache()
}
const pixiInstall = async () => { const pixiInstall = async () => {
if (!options.runInstall) { if (!options.runInstall) {
core.debug('Skipping pixi install.') core.debug('Skipping pixi install.')
return Promise.resolve() return
} }
return tryRestoreCache()
.then(async (_cacheKey) => { await tryRestoreProjectCache()
if (options.environments) {
for (const environment of options.environments) { const environments = options.environments ?? [undefined]
core.debug(`Installing environment ${environment}`) for (const environment of environments) {
const command = `install -e ${environment}${options.frozen ? ' --frozen' : ''}${ core.debug(`Installing environment ${environment ?? 'default'}`)
options.locked ? ' --locked' : '' let command = `install`
}` if (environment) {
await core.group(`pixi ${command}`, () => execute(pixiCmd(command))) command += ` -e ${environment}`
} }
} else { if (options.frozen) {
const command = `install${options.frozen ? ' --frozen' : ''}${options.locked ? ' --locked' : ''}` command += ' --frozen'
return core.group(`pixi ${command}`, () => execute(pixiCmd(command))) }
} if (options.locked) {
}) command += ' --locked'
.then(saveCache) }
if (options.pypiKeyringProvider) {
command += ` --pypi-keyring-provider ${options.pypiKeyringProvider}`
}
await core.group(`pixi ${command}`, () => execute(pixiCmd(command)))
}
await saveProjectCache()
} }
const generateList = async () => { const generateList = async () => {
if (!options.runInstall) { if (!options.runInstall) {
core.debug('Skipping pixi list.') core.debug('Skipping pixi list.')
return Promise.resolve() return
} }
if ( if (
'version' in options.pixiSource && 'version' in options.pixiSource &&
@@ -96,7 +128,7 @@ const generateList = async () => {
core.warning( core.warning(
'pixi list is not supported for pixi versions < `v0.13.0`. Please set `pixi-version` to `v0.13.0` or later.' 'pixi list is not supported for pixi versions < `v0.13.0`. Please set `pixi-version` to `v0.13.0` or later.'
) )
return Promise.resolve() return
} }
let command = 'list' let command = 'list'
if ( if (
@@ -112,17 +144,21 @@ const generateList = async () => {
if (options.environments) { if (options.environments) {
for (const environment of options.environments) { for (const environment of options.environments) {
core.debug(`Listing environment ${environment}`) core.debug(`Listing environment ${environment}`)
await core.group(`pixi ${command} -e ${environment}`, () => execute(pixiCmd(`${command} -e ${environment}`))) const cmd = `${command} -e ${environment}`
await core.group(`pixi ${cmd}`, () => execute(pixiCmd(cmd)))
} }
return Promise.resolve()
} else { } else {
return core.group(`pixi ${command}`, () => execute(pixiCmd(command))) await core.group(`pixi ${command}`, () => execute(pixiCmd(command)))
} }
} }
const generateInfo = () => core.group('pixi info', () => execute(pixiCmd('info'))) const generateInfo = async () => {
await core.group('pixi info', () => execute(pixiCmd('info')))
}
const activateEnv = (environment: string) => core.group('Activate environment', () => activateEnvironment(environment)) const activateEnv = async (environment: string) => {
await core.group('Activate environment', () => activateEnvironment(environment))
}
const run = async () => { const run = async () => {
core.debug(`process.env.HOME: ${process.env.HOME ?? '-'}`) core.debug(`process.env.HOME: ${process.env.HOME ?? '-'}`)
@@ -132,17 +168,22 @@ const run = async () => {
} }
addPixiToPath() addPixiToPath()
await pixiLogin() await pixiLogin()
await pixiInstall() await pixiGlobalInstall()
await generateInfo() await generateInfo()
await pixiInstall()
await generateList() await generateList()
if (options.activatedEnvironment) { if (options.activatedEnvironment) {
await activateEnv(options.activatedEnvironment) await activateEnv(options.activatedEnvironment)
} }
await pixiLogout()
} }
run() const main = async () => {
.then(() => exit(0)) // workaround for https://github.com/actions/toolkit/issues/1578 try {
.catch((error: unknown) => { await run()
// workaround for https://github.com/actions/toolkit/issues/1578
exit(0)
} catch (error: unknown) {
if (core.isDebug()) { if (core.isDebug()) {
throw error throw error
} }
@@ -152,6 +193,10 @@ run()
} else if (typeof error === 'string') { } else if (typeof error === 'string') {
core.setFailed(error) core.setFailed(error)
exit(1) exit(1)
} else {
throw error
} }
throw error }
}) }
void main()
+116 -29
View File
@@ -12,16 +12,19 @@ import { DEFAULT_PIXI_URL_TEMPLATE } from './util'
type Inputs = Readonly<{ type Inputs = Readonly<{
pixiVersion?: string pixiVersion?: string
pixiUrl?: string pixiUrl?: string
pixiUrlBearerToken?: string pixiUrlHeaders?: NodeJS.Dict<string>
logLevel?: LogLevel logLevel?: LogLevel
manifestPath?: string manifestPath?: string
workingDirectory?: string
runInstall?: boolean runInstall?: boolean
environments?: string[] environments?: string[]
activateEnvironment?: string activateEnvironment?: string
frozen?: boolean frozen?: boolean
locked?: boolean locked?: boolean
cache?: boolean cache?: boolean
globalCache?: boolean
cacheKey?: string cacheKey?: string
globalCacheKey?: string
cacheWrite?: boolean cacheWrite?: boolean
pixiBinPath?: string pixiBinPath?: string
authHost?: string authHost?: string
@@ -32,17 +35,21 @@ type Inputs = Readonly<{
authS3AccessKeyId?: string authS3AccessKeyId?: string
authS3SecretAccessKey?: string authS3SecretAccessKey?: string
authS3SessionToken?: string authS3SessionToken?: string
persistCredentials?: boolean
pypiKeyringProvider?: 'disabled' | 'subprocess'
postCleanup?: boolean postCleanup?: boolean
globalEnvironments?: string[]
}> }>
export interface PixiSource { export interface PixiSource {
urlTemplate: string urlTemplate: string
bearerToken?: string headers?: NodeJS.Dict<string>
version: string version: string
} }
type Auth = { type Auth = {
host: string host: string
persistCredentials: boolean
} & ( } & (
| { | {
token: string token: string
@@ -66,21 +73,31 @@ interface Cache {
cacheWrite: boolean cacheWrite: boolean
} }
interface GlobalCache {
cacheKeyPrefix: string
cacheWrite: boolean
}
export type Options = Readonly<{ export type Options = Readonly<{
pixiSource: PixiSource pixiSource: PixiSource
downloadPixi: boolean downloadPixi: boolean
logLevel: LogLevel logLevel: LogLevel
manifestPath: string manifestPath: string
workingDirectory: string
pixiLockFile: string pixiLockFile: string
runInstall: boolean runInstall: boolean
environments?: string[] environments?: string[]
frozen: boolean frozen: boolean
locked: boolean locked: boolean
cache?: Cache cache?: Cache
globalCache?: GlobalCache
pixiBinPath: string pixiBinPath: string
auth?: Auth auth?: Auth
persistCredentials: boolean
pypiKeyringProvider?: 'disabled' | 'subprocess'
postCleanup: boolean postCleanup: boolean
activatedEnvironment?: string activatedEnvironment?: string
globalEnvironments?: string[]
}> }>
const pixiPath = 'pixi.toml' const pixiPath = 'pixi.toml'
const pyprojectPath = 'pyproject.toml' const pyprojectPath = 'pyproject.toml'
@@ -88,6 +105,9 @@ const pyprojectPath = 'pyproject.toml'
const logLevelSchema = z.enum(['q', 'default', 'v', 'vv', 'vvv']) const logLevelSchema = z.enum(['q', 'default', 'v', 'vv', 'vvv'])
export type LogLevel = z.infer<typeof logLevelSchema> export type LogLevel = z.infer<typeof logLevelSchema>
const pypiKeyringProviderSchema = z.enum(['disabled', 'subprocess'])
export type PypiKeyringProvider = z.infer<typeof pypiKeyringProviderSchema>
export const PATHS = { export const PATHS = {
pixiBin: path.join(os.homedir(), '.pixi', 'bin', `pixi${os.platform() === 'win32' ? '.exe' : ''}`) pixiBin: path.join(os.homedir(), '.pixi', 'bin', `pixi${os.platform() === 'win32' ? '.exe' : ''}`)
} }
@@ -113,7 +133,7 @@ const inputOrEnvironmentVariable = (key: string): string | undefined => {
return undefined return undefined
} }
const parseOrUndefined = <T>(key: string, schema: z.ZodSchema<T>, errorMessage?: string): T | undefined => { const parseOrUndefined = <T>(key: string, schema: z.ZodType<T>, errorMessage?: string): T | undefined => {
const input = inputOrEnvironmentVariable(key) const input = inputOrEnvironmentVariable(key)
if (input === undefined) { if (input === undefined) {
return undefined return undefined
@@ -128,7 +148,7 @@ const parseOrUndefined = <T>(key: string, schema: z.ZodSchema<T>, errorMessage?:
return maybeResult.data return maybeResult.data
} }
const parseOrUndefinedJSON = <T>(key: string, schema: z.ZodSchema<T>): T | undefined => { const parseOrUndefinedJSON = <T>(key: string, schema: z.ZodType<T>): T | undefined => {
const input = inputOrEnvironmentVariable(key) const input = inputOrEnvironmentVariable(key)
if (input === undefined) { if (input === undefined) {
return undefined return undefined
@@ -136,7 +156,7 @@ const parseOrUndefinedJSON = <T>(key: string, schema: z.ZodSchema<T>): T | undef
return schema.parse(JSON.parse(input)) return schema.parse(JSON.parse(input))
} }
const parseOrUndefinedList = <T>(key: string, schema: z.ZodSchema<T>): T[] | undefined => { const parseOrUndefinedList = <T>(key: string, schema: z.ZodType<T>): T[] | undefined => {
const input = inputOrEnvironmentVariable(key) const input = inputOrEnvironmentVariable(key)
if (input === undefined) { if (input === undefined) {
return undefined return undefined
@@ -147,16 +167,33 @@ const parseOrUndefinedList = <T>(key: string, schema: z.ZodSchema<T>): T[] | und
.filter((s) => s !== '') .filter((s) => s !== '')
} }
const parseOrUndefinedMultilineList = <T>(key: string, schema: z.ZodType<T>): T[] | undefined => {
const input = inputOrEnvironmentVariable(key)
if (input === undefined) {
return undefined
}
return input
.split('\n')
.map((s) => schema.parse(s.trim()))
.filter((s) => s !== '')
}
const validateInputs = (inputs: Inputs): void => { const validateInputs = (inputs: Inputs): void => {
if (inputs.pixiUrlBearerToken && !inputs.pixiUrl) { if (inputs.pixiUrlHeaders && !inputs.pixiUrl) {
throw new Error('You need to specify pixi-url when using pixi-url-bearer-token') throw new Error('You need to specify pixi-url when using pixi-url-headers')
} }
if (inputs.cacheKey !== undefined && inputs.cache === false) { if (inputs.cacheKey !== undefined && inputs.cache === false) {
throw new Error('Cannot specify cache key without caching') throw new Error('Cannot specify project cache key without project caching')
}
if (inputs.globalCacheKey !== undefined && inputs.globalCache === false) {
throw new Error('Cannot specify global cache key without global caching')
} }
if (inputs.runInstall === false && inputs.cache === true) { if (inputs.runInstall === false && inputs.cache === true) {
throw new Error('Cannot cache without running install') throw new Error('Cannot cache without running install')
} }
if (inputs.globalCache === true && (!inputs.globalEnvironments || inputs.globalEnvironments.length === 0)) {
throw new Error('Cannot use global-cache without specifying global-environments')
}
if (inputs.runInstall === false && inputs.frozen === true) { if (inputs.runInstall === false && inputs.frozen === true) {
throw new Error('Cannot use `frozen: true` when not running install') throw new Error('Cannot use `frozen: true` when not running install')
} }
@@ -206,6 +243,9 @@ const validateInputs = (inputs: Inputs): void => {
if (inputs.authToken || inputs.authUsername || inputs.authCondaToken || inputs.authS3AccessKeyId) { if (inputs.authToken || inputs.authUsername || inputs.authCondaToken || inputs.authS3AccessKeyId) {
throw new Error('You need to specify auth-host') throw new Error('You need to specify auth-host')
} }
if (inputs.persistCredentials === false) {
throw new Error('Cannot use persist-credentials without specifying auth-host')
}
} }
if (inputs.runInstall === false && inputs.environments) { if (inputs.runInstall === false && inputs.environments) {
throw new Error('Cannot specify environments without running install') throw new Error('Cannot specify environments without running install')
@@ -240,7 +280,7 @@ const inferOptions = (inputs: Inputs): Options => {
const runInstall = inputs.runInstall ?? true const runInstall = inputs.runInstall ?? true
const pixiSource: PixiSource = { const pixiSource: PixiSource = {
urlTemplate: inputs.pixiUrl ?? DEFAULT_PIXI_URL_TEMPLATE, urlTemplate: inputs.pixiUrl ?? DEFAULT_PIXI_URL_TEMPLATE,
bearerToken: inputs.pixiUrlBearerToken, headers: inputs.pixiUrlHeaders,
version: inputs.pixiVersion ?? 'latest' version: inputs.pixiVersion ?? 'latest'
} }
@@ -249,29 +289,43 @@ const inferOptions = (inputs: Inputs): Options => {
inputs.pixiBinPath inputs.pixiBinPath
) )
const logLevel = inputs.logLevel ?? (core.isDebug() ? 'vv' : 'default') const logLevel = inputs.logLevel ?? (core.isDebug() ? 'vv' : 'default')
// infer manifest path from inputs or default to pixi.toml or pyproject.toml depending on what is present in the repo.
let manifestPath = pixiPath // default // Determine the working directory - resolve to absolute path if provided
const workingDirectory = inputs.workingDirectory ? path.resolve(untildify(inputs.workingDirectory)) : process.cwd()
core.debug(`Working directory: ${workingDirectory}`)
// infer manifest path from inputs or default to pixi.toml or pyproject.toml depending on what is present in the working directory.
const pixiTomlPathInWorkingDir = path.join(workingDirectory, pixiPath)
const pyprojectTomlPathInWorkingDir = path.join(workingDirectory, pyprojectPath)
let manifestPath = pixiTomlPathInWorkingDir // default
if (inputs.manifestPath) { if (inputs.manifestPath) {
manifestPath = path.resolve(untildify(inputs.manifestPath)) // If manifest path is provided, resolve it relative to working directory if it's not absolute
manifestPath = path.isAbsolute(inputs.manifestPath)
? path.resolve(untildify(inputs.manifestPath))
: path.resolve(workingDirectory, inputs.manifestPath)
} else { } else {
if (existsSync(pixiPath)) { if (existsSync(pixiTomlPathInWorkingDir)) {
manifestPath = pixiPath manifestPath = pixiTomlPathInWorkingDir
} else if (existsSync(pyprojectPath)) { core.debug(`Found pixi.toml at: ${manifestPath}`)
} else if (existsSync(pyprojectTomlPathInWorkingDir)) {
try { try {
const fileContent = readFileSync(pyprojectPath, 'utf-8') const fileContent = readFileSync(pyprojectTomlPathInWorkingDir, 'utf-8')
const parsedContent: Record<string, unknown> = parse(fileContent) const parsedContent: Record<string, unknown> = parse(fileContent)
// Test if the tool.pixi table is present in the pyproject.toml file, if so, use it as the manifest file. // Test if the tool.pixi table is present in the pyproject.toml file, if so, use it as the manifest file.
if (parsedContent.tool && typeof parsedContent.tool === 'object' && 'pixi' in parsedContent.tool) { if (parsedContent.tool && typeof parsedContent.tool === 'object' && 'pixi' in parsedContent.tool) {
core.debug(`The tool.pixi table found, using ${pyprojectPath} as manifest file.`) core.debug(`The tool.pixi table found, using ${pyprojectTomlPathInWorkingDir} as manifest file.`)
manifestPath = pyprojectPath manifestPath = pyprojectTomlPathInWorkingDir
} }
} catch (error) { } catch (error) {
core.error(`Error while trying to read ${pyprojectPath} file.`) core.error(`Error while trying to read ${pyprojectTomlPathInWorkingDir} file.`)
core.error(error as Error) core.error(error as Error)
} }
} else if (runInstall) { } else if (runInstall) {
core.warning(`Could not find any manifest file. Defaulting to ${pixiPath}.`) core.warning(
`Could not find any manifest file in ${workingDirectory}. Defaulting to ${pixiTomlPathInWorkingDir}.`
)
} }
} }
@@ -291,43 +345,61 @@ const inferOptions = (inputs: Inputs): Options => {
} else if (inputs.activateEnvironment && inputs.activateEnvironment !== 'false') { } else if (inputs.activateEnvironment && inputs.activateEnvironment !== 'false') {
activatedEnvironment = inputs.activateEnvironment activatedEnvironment = inputs.activateEnvironment
} }
const cache = inputs.cacheKey const cache =
? { cacheKeyPrefix: inputs.cacheKey, cacheWrite: inputs.cacheWrite ?? true } inputs.cache === true || (lockFileAvailable && inputs.cache !== false)
: inputs.cache === true || (lockFileAvailable && inputs.cache !== false) ? {
? { cacheKeyPrefix: 'pixi-', cacheWrite: inputs.cacheWrite ?? true } cacheKeyPrefix: inputs.cacheKey ?? 'pixi-',
cacheWrite: inputs.cacheWrite ?? true
}
: undefined
const globalCache =
inputs.globalCache === true && inputs.globalEnvironments && inputs.globalEnvironments.length > 0
? {
cacheKeyPrefix: inputs.globalCacheKey ?? 'pixi-global-',
cacheWrite: inputs.cacheWrite ?? true
}
: undefined : undefined
const frozen = inputs.frozen ?? false const frozen = inputs.frozen ?? false
const locked = inputs.locked ?? (lockFileAvailable && !frozen) const locked = inputs.locked ?? (lockFileAvailable && !frozen)
const persistCredentials = inputs.persistCredentials ?? true
const auth = !inputs.authHost const auth = !inputs.authHost
? undefined ? undefined
: ((inputs.authToken : ((inputs.authToken
? { ? {
host: inputs.authHost, host: inputs.authHost,
token: inputs.authToken token: inputs.authToken,
persistCredentials: persistCredentials
} }
: inputs.authCondaToken : inputs.authCondaToken
? { ? {
host: inputs.authHost, host: inputs.authHost,
condaToken: inputs.authCondaToken condaToken: inputs.authCondaToken,
persistCredentials: persistCredentials
} }
: inputs.authUsername : inputs.authUsername
? { ? {
host: inputs.authHost, host: inputs.authHost,
username: inputs.authUsername, username: inputs.authUsername,
password: inputs.authPassword password: inputs.authPassword,
persistCredentials: persistCredentials
} }
: { : {
host: inputs.authHost, host: inputs.authHost,
s3AccessKeyId: inputs.authS3AccessKeyId, s3AccessKeyId: inputs.authS3AccessKeyId,
s3SecretAccessKey: inputs.authS3SecretAccessKey, s3SecretAccessKey: inputs.authS3SecretAccessKey,
s3SessionToken: inputs.authS3SessionToken s3SessionToken: inputs.authS3SessionToken,
persistCredentials: persistCredentials
}) as Auth) }) as Auth)
const postCleanup = inputs.postCleanup ?? true const postCleanup = inputs.postCleanup ?? true
const pypiKeyringProvider = inputs.pypiKeyringProvider
return { return {
globalEnvironments: inputs.globalEnvironments,
pixiSource, pixiSource,
pypiKeyringProvider,
downloadPixi, downloadPixi,
logLevel, logLevel,
manifestPath, manifestPath,
workingDirectory,
pixiLockFile, pixiLockFile,
runInstall, runInstall,
environments: inputs.environments, environments: inputs.environments,
@@ -335,8 +407,10 @@ const inferOptions = (inputs: Inputs): Options => {
frozen, frozen,
locked, locked,
cache, cache,
globalCache,
pixiBinPath, pixiBinPath,
auth, auth,
persistCredentials,
postCleanup postCleanup
} }
} }
@@ -358,20 +432,23 @@ const getOptions = () => {
'pixi-version must either be `latest` or a version string matching `vX.Y.Z`.' 'pixi-version must either be `latest` or a version string matching `vX.Y.Z`.'
), ),
pixiUrl: parseOrUndefined('pixi-url', z.string()), pixiUrl: parseOrUndefined('pixi-url', z.string()),
pixiUrlBearerToken: parseOrUndefined('pixi-url-bearer-token', z.string()), pixiUrlHeaders: parseOrUndefinedJSON('pixi-url-headers', z.record(z.string(), z.string())),
logLevel: parseOrUndefined( logLevel: parseOrUndefined(
'log-level', 'log-level',
logLevelSchema, logLevelSchema,
'log-level must be one of `q`, `default`, `v`, `vv`, `vvv`.' 'log-level must be one of `q`, `default`, `v`, `vv`, `vvv`.'
), ),
manifestPath: parseOrUndefined('manifest-path', z.string()), manifestPath: parseOrUndefined('manifest-path', z.string()),
workingDirectory: parseOrUndefined('working-directory', z.string()),
runInstall: parseOrUndefinedJSON('run-install', z.boolean()), runInstall: parseOrUndefinedJSON('run-install', z.boolean()),
environments: parseOrUndefinedList('environments', z.string()), environments: parseOrUndefinedList('environments', z.string()),
activateEnvironment: parseOrUndefined('activate-environment', z.string()), activateEnvironment: parseOrUndefined('activate-environment', z.string()),
locked: parseOrUndefinedJSON('locked', z.boolean()), locked: parseOrUndefinedJSON('locked', z.boolean()),
frozen: parseOrUndefinedJSON('frozen', z.boolean()), frozen: parseOrUndefinedJSON('frozen', z.boolean()),
cache: parseOrUndefinedJSON('cache', z.boolean()), cache: parseOrUndefinedJSON('cache', z.boolean()),
globalCache: parseOrUndefinedJSON('global-cache', z.boolean()),
cacheKey: parseOrUndefined('cache-key', z.string()), cacheKey: parseOrUndefined('cache-key', z.string()),
globalCacheKey: parseOrUndefined('global-cache-key', z.string()),
cacheWrite: parseOrUndefinedJSON('cache-write', z.boolean()), cacheWrite: parseOrUndefinedJSON('cache-write', z.boolean()),
pixiBinPath: parseOrUndefined('pixi-bin-path', z.string()), pixiBinPath: parseOrUndefined('pixi-bin-path', z.string()),
authHost: parseOrUndefined('auth-host', z.string()), authHost: parseOrUndefined('auth-host', z.string()),
@@ -382,6 +459,9 @@ const getOptions = () => {
authS3AccessKeyId: parseOrUndefined('auth-s3-access-key-id', z.string()), authS3AccessKeyId: parseOrUndefined('auth-s3-access-key-id', z.string()),
authS3SecretAccessKey: parseOrUndefined('auth-s3-secret-access-key', z.string()), authS3SecretAccessKey: parseOrUndefined('auth-s3-secret-access-key', z.string()),
authS3SessionToken: parseOrUndefined('auth-s3-session-token', z.string()), authS3SessionToken: parseOrUndefined('auth-s3-session-token', z.string()),
persistCredentials: parseOrUndefinedJSON('persist-credentials', z.boolean()),
pypiKeyringProvider: parseOrUndefined('pypi-keyring-provider', pypiKeyringProviderSchema),
globalEnvironments: parseOrUndefinedMultilineList('global-environments', z.string()),
postCleanup: parseOrUndefinedJSON('post-cleanup', z.boolean()) postCleanup: parseOrUndefinedJSON('post-cleanup', z.boolean())
} }
core.debug(`Inputs: ${JSON.stringify(inputs)}`) core.debug(`Inputs: ${JSON.stringify(inputs)}`)
@@ -410,3 +490,10 @@ try {
} }
export const options = _options export const options = _options
export const assertAuth = () => {
const auth = options.auth
if (!auth) {
throw new Error('Authentication configuration is missing.')
}
return auth
}
+4 -3
View File
@@ -82,14 +82,15 @@ export const execute = (cmd: string[]) => {
core.debug(`Executing: \`${cmd.toString()}\``) core.debug(`Executing: \`${cmd.toString()}\``)
// needs escaping if cmd[0] contains spaces // needs escaping if cmd[0] contains spaces
// https://github.com/prefix-dev/setup-pixi/issues/184#issuecomment-2765724843 // https://github.com/prefix-dev/setup-pixi/issues/184#issuecomment-2765724843
return exec(`"${cmd[0]}"`, cmd.slice(1)) return exec(`"${cmd[0]}"`, cmd.slice(1), { cwd: options.workingDirectory })
} }
export const executeGetOutput = (cmd: string[], options?: ExecOptions) => { export const executeGetOutput = (cmd: string[], execOptions: ExecOptions) => {
core.debug(`Executing: \`${cmd.toString()}\``) core.debug(`Executing: \`${cmd.toString()}\``)
// needs escaping if cmd[0] contains spaces // needs escaping if cmd[0] contains spaces
// https://github.com/prefix-dev/setup-pixi/issues/184#issuecomment-2765724843 // https://github.com/prefix-dev/setup-pixi/issues/184#issuecomment-2765724843
return getExecOutput(`"${cmd[0]}"`, cmd.slice(1), options) const defaultOptions = { cwd: options.workingDirectory }
return getExecOutput(`"${cmd[0]}"`, cmd.slice(1), { ...defaultOptions, ...execOptions })
} }
export const pixiCmd = (command: string, withManifestPath = true) => { export const pixiCmd = (command: string, withManifestPath = true) => {
+2 -2
View File
@@ -1,9 +1,9 @@
[project] [workspace]
name = "test-auth-s3" name = "test-auth-s3"
channels = ["s3://rattler-s3-testing/channel", "conda-forge"] channels = ["s3://rattler-s3-testing/channel", "conda-forge"]
platforms = ["osx-arm64", "osx-64", "linux-64", "linux-aarch64", "win-64"] platforms = ["osx-arm64", "osx-64", "linux-64", "linux-aarch64", "win-64"]
[project.s3-options.rattler-s3-testing] [workspace.s3-options.rattler-s3-testing]
endpoint-url = "https://e1a7cde76f1780ec06bac859036dbaf7.eu.r2.cloudflarestorage.com" endpoint-url = "https://e1a7cde76f1780ec06bac859036dbaf7.eu.r2.cloudflarestorage.com"
force-path-style = true force-path-style = true
region = "auto" region = "auto"
+1 -1
View File
@@ -1,4 +1,4 @@
[project] [workspace]
name = "test-auth" name = "test-auth"
channels = ["conda-forge", "https://repo.prefix.dev/setup-pixi-test"] channels = ["conda-forge", "https://repo.prefix.dev/setup-pixi-test"]
platforms = ["osx-arm64", "osx-64", "linux-64", "linux-aarch64", "win-64"] platforms = ["osx-arm64", "osx-64", "linux-64", "linux-aarch64", "win-64"]
+1 -1
View File
@@ -1,4 +1,4 @@
[project] [workspace]
name = "test-win-arm64" name = "test-win-arm64"
channels = ["conda-forge"] channels = ["conda-forge"]
platforms = [ platforms = [
+1 -1
View File
@@ -1,4 +1,4 @@
[project] [workspace]
name = "test-default" name = "test-default"
channels = ["conda-forge"] channels = ["conda-forge"]
platforms = ["linux-64", "linux-aarch64", "osx-64", "osx-arm64", "win-64"] platforms = ["linux-64", "linux-aarch64", "osx-64", "osx-arm64", "win-64"]
+1 -1
View File
@@ -1,4 +1,4 @@
[project] [workspace]
name = "test-default" name = "test-default"
version = "0.1.0" version = "0.1.0"
description = "Add a short description here" description = "Add a short description here"
+1 -1
View File
@@ -1,4 +1,4 @@
[project] [workspace]
name = "test-package" name = "test-package"
channels = ["conda-forge"] channels = ["conda-forge"]
platforms = ["linux-64", "osx-arm64", "osx-64", "win-64"] platforms = ["linux-64", "osx-arm64", "osx-64", "win-64"]
+1 -1
View File
@@ -1,4 +1,4 @@
[project] [workspace]
name = "test-no-lockfile" name = "test-no-lockfile"
channels = ["conda-forge"] channels = ["conda-forge"]
platforms = ["linux-64", "linux-aarch64", "osx-64", "osx-arm64", "win-64"] platforms = ["linux-64", "linux-aarch64", "osx-64", "osx-arm64", "win-64"]
+2 -2
View File
@@ -19,7 +19,7 @@ lint = ["ruff>=0.1.14"]
[tool.ruff] [tool.ruff]
target-version = "py310" target-version = "py310"
line-length = 100 line-length = 100
exclude = [ ".pixi", "__pycache__" ] exclude = [".pixi", "__pycache__"]
# the TOML parser should also support comments in lists # the TOML parser should also support comments in lists
lint.select = [ lint.select = [
# flake8-bugbear # flake8-bugbear
@@ -34,7 +34,7 @@ lint.select = [
"F", "F",
] ]
[tool.pixi.project] [tool.pixi.workspace]
name = "pyproject-manifest" name = "pyproject-manifest"
channels = ["conda-forge"] channels = ["conda-forge"]
platforms = ["linux-64", "osx-arm64", "osx-64", "win-64"] platforms = ["linux-64", "osx-arm64", "osx-64", "win-64"]
+4 -2
View File
@@ -1,12 +1,14 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, "target": "ES2022" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */,
"module": "CommonJS" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, "module": "CommonJS" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
"outDir": "./lib" /* Redirect output structure to the directory. */, "outDir": "./lib" /* Redirect output structure to the directory. */,
"rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */,
"strict": true /* Enable all strict type-checking options. */, "strict": true /* Enable all strict type-checking options. */,
"noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */,
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
"types": ["node"],
"skipLibCheck": true
}, },
"exclude": ["node_modules", "**/*.test.ts"] "exclude": ["node_modules", "**/*.test.ts"]
} }