Compare commits

..
11 Commits
Author SHA1 Message Date
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
Yannik Tausch b1ab8f237b feat: Add Support for Handlebars Templates in pixi-url (#213) 2025-07-23 11:58:57 +02:00
Yannik Tausch d7951c27cd test: Skip tests with secrets on fork PRs (#216) 2025-07-22 17:39:23 +02:00
Yannik Tausch 4522f6409d feat: Allow specifying inputs as environment variables (#214) 2025-07-22 12:53:59 +02:00
Yannik Tausch a8c5cac0eb test: Enable failure tests (#215) 2025-07-22 11:14:53 +02:00
13 changed files with 40200 additions and 23780 deletions
+5 -5
View File
@@ -15,7 +15,7 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Install pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.4.0
@@ -41,13 +41,13 @@ jobs:
name: Reference latest version in README
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Assert latest setup-pixi version is mentioned in README
run: |
set -euo pipefail
latest_version="$(jq -r '.version' package.json)"
count_expected=18
count_expected=21
count_actual="$(grep -c "setup-pixi@v$latest_version" README.md || true)"
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."
@@ -62,7 +62,7 @@ jobs:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Assert latest pixi version is mentioned in README
run: |
@@ -90,7 +90,7 @@ jobs:
check-dist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Install pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.4.0
+1 -1
View File
@@ -12,7 +12,7 @@ jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: Quantco/ui-actions/version-metadata@cd71d2a0e30b25569f6d723e57acca83347e58fc # v1.0.18
id: version-metadata
with:
+334 -154
View File
@@ -22,7 +22,7 @@ jobs:
runs-on: ${{ matrix.os }}
name: default ${{ matrix.cache == true && 'with' || 'without' }} cache (${{ matrix.os }})
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -47,13 +47,62 @@ jobs:
pixi run python --version | grep -q 3.11
pixi run test | grep -q "Hello world"
no-run-install:
global-environments:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.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@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.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:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -70,7 +119,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: ./
with:
run-install: false
@@ -85,7 +134,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest, macos-13]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* .
- uses: ./
@@ -103,7 +152,7 @@ jobs:
locked: [true, false]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* .
- uses: ./
@@ -122,7 +171,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest, macos-13]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: ./
with:
run-install: false
@@ -135,7 +184,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest, macos-13]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: ./
with:
run-install: false
@@ -154,7 +203,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -169,7 +218,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -181,7 +230,7 @@ jobs:
custom-pixi-url:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* .
- 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
- run: pixi --version | grep -q "pixi 0.14.0"
pixi-url-bearer-token:
pixi-url-headers-bearer:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* .
- name: Setup caddy
@@ -216,7 +265,7 @@ jobs:
with:
cache: false
pixi-url: http://localhost:8080/pixi
pixi-url-bearer-token: wrongtoken
pixi-url-headers: '{"Authorization": "Bearer wrongtoken"}'
continue-on-error: true
- name: Fail if wrong token did not fail
run: |
@@ -228,7 +277,54 @@ jobs:
with:
cache: false
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"
pixi-url-custom-template-no-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: ./
with:
pixi-url: |
{{#if latest ~}}
https://github.com/prefix-dev/pixi/releases/download/v0.14.0/{{pixiFile}}
{{~else~}}
https://github.com/prefix-dev/pixi/releases/download/{{version}}/{{pixiFile}}
{{~/if}}
run-install: false
- run: pixi --version | grep -q "pixi 0.14.0"
pixi-url-custom-template-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: ./
with:
pixi-url: |
{{#if latest ~}}
https://github.com/prefix-dev/pixi/releases/download/v0.14.0/{{pixiFile}}
{{~else~}}
https://github.com/prefix-dev/pixi/releases/download/{{version}}/{{pixiFile}}
{{~/if}}
run-install: false
pixi-version: v0.15.1
- run: pixi --version | grep -q "pixi 0.15.1"
pixi-url-custom-template-version-latest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: ./
with:
pixi-url: |
{{#if latest ~}}
https://github.com/prefix-dev/pixi/releases/download/v0.14.0/{{pixiFile}}
{{~else~}}
https://github.com/prefix-dev/pixi/releases/download/{{version}}/{{pixiFile}}
{{~/if}}
run-install: false
pixi-version: latest
- run: pixi --version | grep -q "pixi 0.14.0"
custom-manifest-path:
@@ -237,7 +333,7 @@ jobs:
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest, windows-11-arm]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: ./
with:
cache: false
@@ -249,7 +345,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -263,7 +359,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -284,7 +380,7 @@ jobs:
ignore-reason: [none, version, version-latest, url, bin-path]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- name: Create pixi directory and add to PATH
@@ -403,7 +499,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -424,7 +520,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -447,7 +543,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -467,8 +563,9 @@ jobs:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/auth/* .
- uses: ./
@@ -485,8 +582,9 @@ jobs:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/auth-s3/* .
- uses: ./
@@ -506,7 +604,7 @@ jobs:
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -533,7 +631,7 @@ jobs:
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: ./
with:
run-install: false
@@ -555,7 +653,7 @@ jobs:
matrix:
post-cleanup: ['true', 'false']
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: lisanna-dettwyler/action-post-run@d053b9b43d788b87a409f6cdb3b6fc87c6c8a4fe # v3.1.0
@@ -580,7 +678,7 @@ jobs:
matrix:
post-cleanup: ['true', 'false']
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: lisanna-dettwyler/action-post-run@d053b9b43d788b87a409f6cdb3b6fc87c6c8a4fe # v3.1.0
@@ -602,7 +700,7 @@ jobs:
matrix:
post-cleanup: ['true', 'false']
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: lisanna-dettwyler/action-post-run@d053b9b43d788b87a409f6cdb3b6fc87c6c8a4fe # v3.1.0
@@ -623,7 +721,7 @@ jobs:
matrix:
post-cleanup: ['true', 'false']
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: lisanna-dettwyler/action-post-run@d053b9b43d788b87a409f6cdb3b6fc87c6c8a4fe # v3.1.0
@@ -644,7 +742,7 @@ jobs:
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/no-lockfile/* .
- uses: ./
@@ -676,7 +774,7 @@ jobs:
cache: ['true', 'false']
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/multiple-environments/* .
- uses: ./
@@ -712,7 +810,7 @@ jobs:
matrix:
os: [windows-latest, ubuntu-latest, macos-latest, macos-13]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi files
run: mv test/default/* .
- uses: ./
@@ -728,7 +826,7 @@ jobs:
matrix:
os: [windows-latest, ubuntu-latest, macos-latest, macos-13]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi files
run: mv test/default/* .
- uses: ./
@@ -753,7 +851,7 @@ jobs:
matrix:
os: [windows-latest, ubuntu-latest, macos-latest, macos-13]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi files
run: mv test/default/* .
- uses: ./
@@ -777,7 +875,7 @@ jobs:
matrix:
os: [windows-latest, ubuntu-latest, macos-latest, macos-13]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi files
run: mv test/default/* .
- uses: ./
@@ -794,7 +892,7 @@ jobs:
os: [windows-latest, ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi files
run: mv test/pyproject-manifest/* .
- uses: ./
@@ -812,7 +910,7 @@ jobs:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: ./
with:
cache: true
@@ -824,7 +922,7 @@ jobs:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -840,7 +938,7 @@ jobs:
run:
shell: bash
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -856,7 +954,7 @@ jobs:
run:
shell: pwsh
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -872,7 +970,7 @@ jobs:
run:
shell: cmd
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -890,7 +988,7 @@ jobs:
environment-activation-false:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
@@ -901,7 +999,7 @@ jobs:
environment-activation-explicit-env:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/multiple-environments/* .
- uses: ./
@@ -914,7 +1012,7 @@ jobs:
environment-activation-multiple-env:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/multiple-environments/* .
- uses: ./
@@ -931,7 +1029,7 @@ jobs:
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/multiple-environments/* .
- uses: ./
@@ -943,118 +1041,200 @@ jobs:
py311 py312
activate-environment: py311
# not properly testable
# https://github.com/actions/runner/issues/2347
# https://github.com/orgs/community/discussions/15452
# test-cache-fail-no-lockfile:
# runs-on: ${{ matrix.os }}
# strategy:
# fail-fast: false
# matrix:
# os: [windows-latest, ubuntu-latest, macos-latest]
# steps:
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# - name: Move pixi files
# run: mv test/no-lockfile/* .
# - uses: ./
# with:
# cache: true
# cache-key: test-cache-no-lockfile-${{ github.sha }}-${{ github.run_attempt }}-
# - run: exit 1
# if: success()
env-variable-input-custom-bin-path:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/default/* .
- uses: ./
env:
SETUP_PIXI_PIXI_BIN_PATH: custom-bin/pixi${{ matrix.os == 'windows-latest' && '.exe' || '' }}
with:
cache: false
- run: |
test -f custom-bin/pixi${{ matrix.os == 'windows-latest' && '.exe' || '' }}
pixi --help
which pixi | grep -q custom-bin/pixi
# which pixi should be absolute
which pixi | grep -q "^/"
# test-incorrect-version:
# runs-on: ${{ matrix.os }}
# strategy:
# fail-fast: false
# matrix:
# os: [windows-latest, ubuntu-latest, macos-latest]
# steps:
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# - name: Move pixi files
# run: mv test/default/* .
# - uses: ./
# with:
# pixi-version: 0.1.0
# - run: exit 1
# if: success()
env-variable-input-custom-pixi-url:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* .
- uses: ./
env:
SETUP_PIXI_PIXI_URL: https://github.com/prefix-dev/pixi/releases/download/v0.14.0/pixi-x86_64-unknown-linux-musl
with:
cache: false
- run: pixi --version | grep -q "pixi 0.14.0"
# test-frozen-and-locked:
# runs-on: ${{ matrix.os }}
# strategy:
# fail-fast: false
# matrix:
# os: [windows-latest, ubuntu-latest, macos-latest]
# steps:
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# - name: Move pixi files
# run: mv test/default/* .
# - uses: ./
# with:
# pixi-version: v0.5.0
# frozen: true
# locked: true
# - run: exit 1
# if: success()
env-variable-input-precendence:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* .
- uses: ./
env:
SETUP_PIXI_PIXI_URL: https://github.com/prefix-dev/pixi/releases/download/v0.14.0/pixi-x86_64-unknown-linux-musl
with:
cache: false
pixi-url: https://github.com/prefix-dev/pixi/releases/download/v0.49.0/pixi-x86_64-unknown-linux-musl
- run: pixi --version | grep -q "pixi 0.49.0"
# test-frozen-no-lockfile:
# runs-on: ${{ matrix.os }}
# strategy:
# fail-fast: false
# matrix:
# os: [windows-latest, ubuntu-latest, macos-latest]
# steps:
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# - name: Move pixi files
# run: mv test/no-lockfile/* .
# - uses: ./
# with:
# frozen: true
# - run: exit 1
# if: success()
test-cache-fail-no-lockfile:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi files
run: mv test/no-lockfile/* .
- uses: ./
id: test
with:
cache: true
cache-key: test-cache-no-lockfile-${{ github.sha }}-${{ github.run_attempt }}-
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
# test-locked-no-lockfile:
# runs-on: ${{ matrix.os }}
# strategy:
# fail-fast: false
# matrix:
# os: [windows-latest, ubuntu-latest, macos-latest]
# steps:
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# - name: Move pixi files
# run: mv test/no-lockfile/* .
# - uses: ./
# with:
# locked: true
# - run: exit 1
# if: success()
test-incorrect-version:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi files
run: mv test/default/* .
- uses: ./
id: test
with:
pixi-version: 0.1.0
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
# test-lockfile-not-up-to-date:
# runs-on: ${{ matrix.os }}
# strategy:
# fail-fast: false
# matrix:
# os: [windows-latest, ubuntu-latest, macos-latest]
# steps:
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# - name: Move pixi files
# run: mv test/lockfile-not-up-to-date/* .
# - uses: ./
# # locked: true is implicit
# - run: exit 1
# if: success()
test-frozen-and-locked:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi files
run: mv test/default/* .
- uses: ./
id: test
with:
pixi-version: v0.5.0
frozen: true
locked: true
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
# cache-write-true-no-lockfile:
# timeout-minutes: 10
# runs-on: ${{ matrix.os }}
# strategy:
# fail-fast: false
# matrix:
# os: [windows-latest, ubuntu-latest, macos-latest]
# steps:
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# - name: Move pixi files
# run: mv test/no-lockfile/* .
# - uses: ./
# with:
# cache-write: true
test-frozen-no-lockfile:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi files
run: mv test/no-lockfile/* .
- uses: ./
id: test
with:
frozen: true
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
test-locked-no-lockfile:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi files
run: mv test/no-lockfile/* .
- uses: ./
id: test
with:
locked: true
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
test-lockfile-not-up-to-date:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi files
run: mv test/lockfile-not-up-to-date/* .
- uses: ./
id: test
# locked: true is implicit
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
cache-write-true-no-lockfile:
timeout-minutes: 10
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Move pixi files
run: mv test/no-lockfile/* .
- uses: ./
id: test
with:
cache-write: true
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
+84 -21
View File
@@ -23,7 +23,7 @@ GitHub Action to set up the [pixi](https://github.com/prefix-dev/pixi) package m
## Usage
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
pixi-version: v0.49.0
@@ -35,7 +35,7 @@ GitHub Action to set up the [pixi](https://github.com/prefix-dev/pixi) package m
> [!WARNING]
> 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.12`) to avoid breaking changes.
> Please pin the versions of this action to a specific version (i.e., `prefix-dev/setup-pixi@v0.9.1`) 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).
>
> Put the following in your `.github/dependabot.yml` file to enable Dependabot for your GitHub Actions:
@@ -74,7 +74,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.
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
cache: true
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
@@ -119,7 +119,7 @@ test:
environment: [py311, py312]
steps:
- uses: actions/checkout@v4
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
environments: ${{ matrix.environment }}
```
@@ -129,7 +129,7 @@ test:
The following example will install both the `py311` and the `py312` environment on the runner.
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
# separated by spaces
environments: >-
@@ -143,14 +143,34 @@ The following example will install both the `py311` and the `py312` environment
> [!WARNING]
> 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.
Note that global environments are not cached.
```yml
- uses: prefix-dev/setup-pixi@v0.9.1
with:
global-environments: |
google-cloud-sdk
keyring --with keyrings.google-artifactregistry-auth
- run: |
gcloud --version
keyring --list-backends
```
### Authentication
There are currently three ways to authenticate with pixi:
There are currently five ways to authenticate with pixi:
- using a token
- using a username and password
- using a conda-token
- using an S3 key pair
- using keyring for PyPI registries
For more information, see the [pixi documentation](https://prefix.dev/docs/pixi/authentication).
@@ -165,7 +185,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).
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
auth-host: prefix.dev
auth-token: ${{ secrets.PREFIX_DEV_TOKEN }}
@@ -177,7 +197,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.
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
auth-host: custom-artifactory.com
auth-username: ${{ secrets.PIXI_USERNAME }}
@@ -190,7 +210,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).
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
auth-host: anaconda.org # or my-quetz-instance.com
auth-conda-token: ${{ secrets.CONDA_TOKEN }}
@@ -202,7 +222,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.
```yaml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
auth-host: s3://my-s3-bucket
auth-s3-access-key-id: ${{ secrets.ACCESS_KEY_ID }}
@@ -213,6 +233,18 @@ 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.
#### PyPI keyring provider
You can specify whether to use keyring to look up credentials for PyPI.
```yml
- uses: prefix-dev/setup-pixi@v0.9.1
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
`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 +306,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`.
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
activate-environment: true
```
@@ -282,7 +314,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.
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
environments: >-
py311
@@ -299,7 +331,7 @@ You can specify whether `setup-pixi` should run `pixi install --frozen` or `pixi
See the [official documentation](https://prefix.dev/docs/pixi/cli#install) for more information about the `--frozen` and `--locked` flags.
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
locked: true
# or
@@ -318,7 +350,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`.
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
env:
RUNNER_DEBUG: true
```
@@ -336,7 +368,7 @@ The second type is the debug logging of the pixi executable.
This can be specified by setting the `log-level` input.
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
# one of `q`, `default`, `v`, `vv`, or `vvv`.
log-level: vvv
@@ -362,7 +394,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.
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
post-cleanup: true
# ${{ runner.temp }}\Scripts\pixi.exe on Windows
@@ -378,7 +410,7 @@ 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.
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
manifest-path: pyproject.toml
```
@@ -388,7 +420,7 @@ This can be overwritten by setting the `manifest-path` input argument.
If you only want to install pixi and not install the current project, you can use the `run-install` option.
```yml
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
run-install: false
```
@@ -396,15 +428,46 @@ If you only want to install pixi and not install the current project, you can us
### Download pixi from a custom URL
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
- uses: prefix-dev/setup-pixi@v0.8.12
- uses: prefix-dev/setup-pixi@v0.9.1
with:
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.
It will be rendered with the following variables:
- `version`: The version of pixi that is being installed (`latest` or a version like `v0.48.0`).
- `latest`: A boolean indicating if the version is `latest`.
- `pixiFile`: The name of the pixi binary to download, as determined by the system of the runner (e.g., `pixi-x86_64-unknown-linux-musl`).
By default, `pixi-url` is equivalent to the following template:
```yml
- uses: prefix-dev/setup-pixi@v0.9.1
with:
pixi-url: |
{{#if latest~}}
https://github.com/prefix-dev/pixi/releases/latest/download/{{pixiFile}}
{{~else~}}
https://github.com/prefix-dev/pixi/releases/download/{{version}}/{{pixiFile}}
{{~/if}}
```
### Setting inputs from environment variables
Alternatively to setting the inputs in the `with` section, you can also set each of them using environment variables.
The corresponding environment variable names are derived from the input names by converting them to uppercase, replacing hyphens with underscores, and prefixing them with `SETUP_PIXI_`.
For example, the `pixi-bin-path` input can be set using the `SETUP_PIXI_PIXI_BIN_PATH` environment variable.
This is particularly useful if executing the action on a self-hosted runner.
Inputs always take precedence over environment variables.
## More examples
If you want to see more examples, you can take a look at the [GitHub Workflows of this repository](.github/workflows/test.yml).
+11 -4
View File
@@ -9,9 +9,9 @@ inputs:
pixi-version:
description: Version of pixi to install
pixi-url:
description: URL of pixi to install
pixi-url-bearer-token:
description: Bearer token to use for authentication when downloading pixi from a URL.
description: URL of pixi to install. Can be a Handlebars template receiving `version`, `latest`, and `pixiFile` as variables.
pixi-url-headers:
description: Headers to use when fetching the pixi binary from `pixi-url`. Should be a JSON string.
log-level:
description: |
Log level for the pixi CLI.
@@ -23,6 +23,9 @@ inputs:
environments:
description: |
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:
description: |
If the installed environment should be "activated" for the current job, modifying `$GITHUB_ENV` and
@@ -63,12 +66,16 @@ inputs:
description: Secret access key to use for S3 authentication.
auth-s3-session-token:
description: Session token to use for S3 authentication.
pypi-keyring-provider:
description: |
Specifies whether to use keyring to look up credentials for PyPI.
options: disabled, subprocess
post-cleanup:
description: |
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.
runs:
using: node20
using: node24
main: dist/index.js
post: dist/post.js
Generated Vendored
+29872 -18979
View File
File diff suppressed because one or more lines are too long
Generated Vendored
+9384 -4221
View File
File diff suppressed because one or more lines are too long
+10 -10
View File
@@ -1,6 +1,6 @@
{
"name": "setup-pixi",
"version": "0.8.12",
"version": "0.9.1",
"private": true,
"description": "Action to set up the pixi package manager.",
"scripts": {
@@ -22,25 +22,25 @@
"author": "Pavel Zwerschke <pavelzw@gmail.com>",
"license": "BSD-3-Clause",
"dependencies": {
"@actions/cache": "^4.0.3",
"@actions/cache": "^4.0.5",
"@actions/core": "^1.11.1",
"@actions/exec": "^1.1.1",
"@actions/io": "^1.1.3",
"@actions/tool-cache": "^2.0.2",
"smol-toml": "^1.4.0",
"handlebars": "^4.7.8",
"smol-toml": "^1.4.2",
"untildify": "^5.0.0",
"which": "^5.0.0",
"zod": "^3.25.67"
"zod": "^4.1.5"
},
"devDependencies": {
"@eslint/js": "^9.30.0",
"@types/eslint__js": "^9.14.0",
"@types/node": "^24.0.8",
"@eslint/js": "^9.34.0",
"@types/node": "^24.3.0",
"@types/which": "^3.0.4",
"eslint": "^9.30.0",
"eslint": "^9.34.0",
"prettier": "^3.6.2",
"tsup": "^8.4.0",
"typescript": "^5.8.2",
"typescript-eslint": "^8.35.1"
"typescript": "^5.9.2",
"typescript-eslint": "^8.41.0"
}
}
+332 -293
View File
File diff suppressed because it is too large Load Diff
+81 -54
View File
@@ -6,53 +6,48 @@ import * as core from '@actions/core'
import { downloadTool } from '@actions/tool-cache'
import type { PixiSource } from './options'
import { options } from './options'
import { execute, getPixiUrlFromVersion, pixiCmd } from './util'
import { execute, pixiCmd, renderPixiUrl } from './util'
import { saveCache, tryRestoreCache } from './cache'
import { activateEnvironment } from './activate'
const downloadPixi = (source: PixiSource) => {
const url = 'version' in source ? getPixiUrlFromVersion(source.version) : source.url
const auth = 'bearerToken' in source && source.bearerToken ? `Bearer ${source.bearerToken}` : ''
return core.group('Downloading Pixi', () => {
const downloadPixi = async (source: PixiSource) => {
const url = renderPixiUrl(source.urlTemplate, source.version)
await core.group('Downloading Pixi', async () => {
core.debug('Installing pixi')
core.debug(`Downloading pixi from ${url}`)
core.debug(`Using Bearer auth: ${auth ? 'yes' : 'no'}`)
return fs
.mkdir(path.dirname(options.pixiBinPath), { recursive: true })
.then(() => downloadTool(url, options.pixiBinPath, auth))
.then((_downloadPath) => fs.chmod(options.pixiBinPath, 0o755))
.then(() => {
core.info(`Pixi installed to ${options.pixiBinPath}`)
})
core.debug(`Using headers: ${JSON.stringify(source.headers)}`)
await fs.mkdir(path.dirname(options.pixiBinPath), { recursive: true })
await downloadTool(url, options.pixiBinPath, undefined, source.headers)
await fs.chmod(options.pixiBinPath, 0o755)
core.info(`Pixi installed to ${options.pixiBinPath}`)
})
}
const pixiLogin = () => {
const pixiLogin = async () => {
const auth = options.auth
if (!auth) {
core.debug('Skipping pixi login.')
return Promise.resolve(0)
return
}
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
if ('token' in auth) {
core.debug(`Logging in to ${auth.host} with token`)
return execute(pixiCmd(`auth login --token ${auth.token} ${auth.host}`, false))
}
if ('username' in auth) {
await execute(pixiCmd(`auth login --token ${auth.token} ${auth.host}`, false))
} else if ('username' in auth) {
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))
}
if ('s3AccessKeyId' in auth) {
await execute(pixiCmd(`auth login --username ${auth.username} --password ${auth.password} ${auth.host}`, false))
} else if ('s3AccessKeyId' in auth) {
core.debug(`Logging in to ${auth.host} with s3 credentials`)
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} ${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))
})
}
@@ -60,33 +55,53 @@ const addPixiToPath = () => {
core.addPath(path.dirname(options.pixiBinPath))
}
const pixiGlobalInstall = async () => {
const { globalEnvironments } = options
if (!globalEnvironments) {
core.debug('Skipping pixi global install.')
return
}
core.debug('Installing global environments')
for (const env of globalEnvironments) {
const command = `global install ${env}`
await core.group(`pixi ${command}`, () => execute(pixiCmd(command, false)))
}
}
const pixiInstall = async () => {
if (!options.runInstall) {
core.debug('Skipping pixi install.')
return Promise.resolve()
return
}
return tryRestoreCache()
.then(async (_cacheKey) => {
if (options.environments) {
for (const environment of options.environments) {
core.debug(`Installing environment ${environment}`)
const command = `install -e ${environment}${options.frozen ? ' --frozen' : ''}${
options.locked ? ' --locked' : ''
}`
await core.group(`pixi ${command}`, () => execute(pixiCmd(command)))
}
} else {
const command = `install${options.frozen ? ' --frozen' : ''}${options.locked ? ' --locked' : ''}`
return core.group(`pixi ${command}`, () => execute(pixiCmd(command)))
}
})
.then(saveCache)
await tryRestoreCache()
const environments = options.environments ?? [undefined]
for (const environment of environments) {
core.debug(`Installing environment ${environment ?? 'default'}`)
let command = `install`
if (environment) {
command += ` -e ${environment}`
}
if (options.frozen) {
command += ' --frozen'
}
if (options.locked) {
command += ' --locked'
}
if (options.pypiKeyringProvider) {
command += ` --pypi-keyring-provider ${options.pypiKeyringProvider}`
}
await core.group(`pixi ${command}`, () => execute(pixiCmd(command)))
}
await saveCache()
}
const generateList = async () => {
if (!options.runInstall) {
core.debug('Skipping pixi list.')
return Promise.resolve()
return
}
if (
'version' in options.pixiSource &&
@@ -96,7 +111,7 @@ const generateList = async () => {
core.warning(
'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'
if (
@@ -112,17 +127,21 @@ const generateList = async () => {
if (options.environments) {
for (const environment of options.environments) {
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 {
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 () => {
core.debug(`process.env.HOME: ${process.env.HOME ?? '-'}`)
@@ -132,6 +151,7 @@ const run = async () => {
}
addPixiToPath()
await pixiLogin()
await pixiGlobalInstall()
await pixiInstall()
await generateInfo()
await generateList()
@@ -140,9 +160,12 @@ const run = async () => {
}
}
run()
.then(() => exit(0)) // workaround for https://github.com/actions/toolkit/issues/1578
.catch((error: unknown) => {
const main = async () => {
try {
await run()
// workaround for https://github.com/actions/toolkit/issues/1578
exit(0)
} catch (error: unknown) {
if (core.isDebug()) {
throw error
}
@@ -152,6 +175,10 @@ run()
} else if (typeof error === 'string') {
core.setFailed(error)
exit(1)
} else {
throw error
}
throw error
})
}
}
void main()
+69 -33
View File
@@ -7,11 +7,12 @@ import * as z from 'zod'
import untildify from 'untildify'
import { parse } from 'smol-toml'
import which from 'which'
import { DEFAULT_PIXI_URL_TEMPLATE } from './util'
type Inputs = Readonly<{
pixiVersion?: string
pixiUrl?: string
pixiUrlBearerToken?: string
pixiUrlHeaders?: NodeJS.Dict<string>
logLevel?: LogLevel
manifestPath?: string
runInstall?: boolean
@@ -31,17 +32,16 @@ type Inputs = Readonly<{
authS3AccessKeyId?: string
authS3SecretAccessKey?: string
authS3SessionToken?: string
pypiKeyringProvider?: 'disabled' | 'subprocess'
postCleanup?: boolean
globalEnvironments?: string[]
}>
export type PixiSource =
| {
version: string
}
| {
url: string
bearerToken?: string
}
export interface PixiSource {
urlTemplate: string
headers?: NodeJS.Dict<string>
version: string
}
type Auth = {
host: string
@@ -81,8 +81,10 @@ export type Options = Readonly<{
cache?: Cache
pixiBinPath: string
auth?: Auth
pypiKeyringProvider?: 'disabled' | 'subprocess'
postCleanup: boolean
activatedEnvironment?: string
globalEnvironments?: string[]
}>
const pixiPath = 'pixi.toml'
const pyprojectPath = 'pyproject.toml'
@@ -90,14 +92,37 @@ const pyprojectPath = 'pyproject.toml'
const logLevelSchema = z.enum(['q', 'default', 'v', 'vv', 'vvv'])
export type LogLevel = z.infer<typeof logLevelSchema>
const pypiKeyringProviderSchema = z.enum(['disabled', 'subprocess'])
export type PypiKeyringProvider = z.infer<typeof pypiKeyringProviderSchema>
export const PATHS = {
pixiBin: path.join(os.homedir(), '.pixi', 'bin', `pixi${os.platform() === 'win32' ? '.exe' : ''}`)
}
const parseOrUndefined = <T>(key: string, schema: z.ZodSchema<T>, errorMessage?: string): T | undefined => {
const input = core.getInput(key)
// GitHub actions sets empty inputs to the empty string, but we want undefined
if (input === '') {
const getEnvironmentVariableName = (key: string): string => {
return `SETUP_PIXI_${key.toUpperCase().replace(/-/g, '_')}`
}
const inputOrEnvironmentVariable = (key: string): string | undefined => {
const inputValue = core.getInput(key)
// GitHub actions sets empty inputs to the empty string
if (inputValue !== '') {
return inputValue
}
const envVarName = getEnvironmentVariableName(key)
const envVarValue = process.env[envVarName]
// Empty environment variables are treated as undefined
if (envVarValue !== undefined && envVarValue !== '') {
core.debug(`Using environment variable ${envVarName} with value: ${envVarValue}`)
return envVarValue
}
return undefined
}
const parseOrUndefined = <T>(key: string, schema: z.ZodType<T>, errorMessage?: string): T | undefined => {
const input = inputOrEnvironmentVariable(key)
if (input === undefined) {
return undefined
}
const maybeResult = schema.safeParse(input)
@@ -110,19 +135,17 @@ const parseOrUndefined = <T>(key: string, schema: z.ZodSchema<T>, errorMessage?:
return maybeResult.data
}
const parseOrUndefinedJSON = <T>(key: string, schema: z.ZodSchema<T>): T | undefined => {
const input = core.getInput(key)
// GitHub actions sets empty inputs to the empty string, but we want undefined
if (input === '') {
const parseOrUndefinedJSON = <T>(key: string, schema: z.ZodType<T>): T | undefined => {
const input = inputOrEnvironmentVariable(key)
if (input === undefined) {
return undefined
}
return schema.parse(JSON.parse(input))
}
const parseOrUndefinedList = <T>(key: string, schema: z.ZodSchema<T>): T[] | undefined => {
const input = core.getInput(key)
// GitHub actions sets empty inputs to the empty string, but we want undefined
if (input === '') {
const parseOrUndefinedList = <T>(key: string, schema: z.ZodType<T>): T[] | undefined => {
const input = inputOrEnvironmentVariable(key)
if (input === undefined) {
return undefined
}
return input
@@ -131,12 +154,20 @@ const parseOrUndefinedList = <T>(key: string, schema: z.ZodSchema<T>): T[] | und
.filter((s) => s !== '')
}
const validateInputs = (inputs: Inputs): void => {
if (inputs.pixiVersion && inputs.pixiUrl) {
throw new Error('You need to specify either pixi-version or pixi-url')
const parseOrUndefinedMultilineList = <T>(key: string, schema: z.ZodType<T>): T[] | undefined => {
const input = inputOrEnvironmentVariable(key)
if (input === undefined) {
return undefined
}
if (inputs.pixiUrlBearerToken && !inputs.pixiUrl) {
throw new Error('You need to specify pixi-url when using pixi-url-bearer-token')
return input
.split('\n')
.map((s) => schema.parse(s.trim()))
.filter((s) => s !== '')
}
const validateInputs = (inputs: Inputs): void => {
if (inputs.pixiUrlHeaders && !inputs.pixiUrl) {
throw new Error('You need to specify pixi-url when using pixi-url-headers')
}
if (inputs.cacheKey !== undefined && inputs.cache === false) {
throw new Error('Cannot specify cache key without caching')
@@ -225,11 +256,11 @@ const determinePixiInstallation = (pixiUrlOrVersionSet: boolean, pixiBinPath: st
const inferOptions = (inputs: Inputs): Options => {
const runInstall = inputs.runInstall ?? true
const pixiSource = inputs.pixiVersion
? { version: inputs.pixiVersion }
: inputs.pixiUrl
? { url: inputs.pixiUrl, bearerToken: inputs.pixiUrlBearerToken }
: { version: 'latest' }
const pixiSource: PixiSource = {
urlTemplate: inputs.pixiUrl ?? DEFAULT_PIXI_URL_TEMPLATE,
headers: inputs.pixiUrlHeaders,
version: inputs.pixiVersion ?? 'latest'
}
const { downloadPixi, pixiBinPath } = determinePixiInstallation(
!!inputs.pixiVersion || !!inputs.pixiUrl,
@@ -310,8 +341,11 @@ const inferOptions = (inputs: Inputs): Options => {
s3SessionToken: inputs.authS3SessionToken
}) as Auth)
const postCleanup = inputs.postCleanup ?? true
const pypiKeyringProvider = inputs.pypiKeyringProvider
return {
globalEnvironments: inputs.globalEnvironments,
pixiSource,
pypiKeyringProvider,
downloadPixi,
logLevel,
manifestPath,
@@ -344,8 +378,8 @@ const getOptions = () => {
z.union([z.literal('latest'), z.string().regex(/^v\d+\.\d+\.\d+$/)]),
'pixi-version must either be `latest` or a version string matching `vX.Y.Z`.'
),
pixiUrl: parseOrUndefined('pixi-url', z.string().url()),
pixiUrlBearerToken: parseOrUndefined('pixi-url-bearer-token', z.string()),
pixiUrl: parseOrUndefined('pixi-url', z.string()),
pixiUrlHeaders: parseOrUndefinedJSON('pixi-url-headers', z.record(z.string(), z.string())),
logLevel: parseOrUndefined(
'log-level',
logLevelSchema,
@@ -369,6 +403,8 @@ const getOptions = () => {
authS3AccessKeyId: parseOrUndefined('auth-s3-access-key-id', z.string()),
authS3SecretAccessKey: parseOrUndefined('auth-s3-secret-access-key', z.string()),
authS3SessionToken: parseOrUndefined('auth-s3-session-token', z.string()),
pypiKeyringProvider: parseOrUndefined('pypi-keyring-provider', pypiKeyringProviderSchema),
globalEnvironments: parseOrUndefinedMultilineList('global-environments', z.string()),
postCleanup: parseOrUndefinedJSON('post-cleanup', z.boolean())
}
core.debug(`Inputs: ${JSON.stringify(inputs)}`)
+16 -5
View File
@@ -5,6 +5,14 @@ import * as core from '@actions/core'
import type { ExecOptions } from '@actions/exec'
import { exec, getExecOutput } from '@actions/exec'
import { options } from './options'
import Handlebars from 'handlebars'
export const DEFAULT_PIXI_URL_TEMPLATE = `\
{{#if latest~}}
https://github.com/prefix-dev/pixi/releases/latest/download/{{pixiFile}}
{{~else~}}
https://github.com/prefix-dev/pixi/releases/download/{{version}}/{{pixiFile}}
{{~/if}}`
export const getCondaArch = () => {
const archDict: Record<string, string> = {
@@ -49,14 +57,17 @@ const getArch = () => {
}
}
export const getPixiUrlFromVersion = (version: string) => {
export const renderPixiUrl = (urlTemplate: string, version: string) => {
const latest = version == 'latest'
const arch = getArch()
const platform = getPlatform()
const pixiFile = `pixi-${arch}-${platform}${platform === 'pc-windows-msvc' ? '.exe' : ''}`
if (version === 'latest') {
return `https://github.com/prefix-dev/pixi/releases/latest/download/${pixiFile}`
}
return `https://github.com/prefix-dev/pixi/releases/download/${version}/${pixiFile}`
const template = Handlebars.compile(urlTemplate)
return template({
version,
latest,
pixiFile
})
}
export const sha256 = (s: BinaryLike) => {
+1
View File
@@ -24,6 +24,7 @@ export default defineConfig({
'@actions/cache',
'@actions/io',
'@actions/tool-cache',
'handlebars',
'untildify',
'smol-toml',
'which',