Compare commits

..
23 Commits
Author SHA1 Message Date
Ruben ArtsandPavel Zwerschke 632d179351 Add better support for pyproject.toml pixi projects (#87)
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2024-04-16 14:31:30 +02:00
Yannik Tausch 60414de954 support preinstalled local pixi (#98) 2024-04-15 09:37:12 +02:00
nichmor 4fc8d82a01 fix: restoring cache for pyproject.toml (#95) 2024-04-11 15:28:58 +02:00
wpbonelliandPavel Zwerschke 42f9edde75 fix: respect frozen/locked inputs for pixi list (#94)
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2024-04-11 14:32:36 +02:00
github-actions[bot] 92e1dd3a46 Reference latest Pixi version in README (#92) 2024-04-08 08:33:42 +02:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Pavel Zwerschke
07648b19d8 Bump the dependencies group with 2 updates (#90)
* Bump the dependencies group with 2 updates

Bumps the dependencies group with 2 updates: [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) and [softprops/action-gh-release](https://github.com/softprops/action-gh-release).


Updates `peter-evans/create-pull-request` from 6.0.1 to 6.0.2
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/a4f52f8033a6168103c2538976c07b467e8163bc...70a41aba780001da0a30141984ae2a0c95d8704e)

Updates `softprops/action-gh-release` from 1 to 2
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v1...v2)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: softprops/action-gh-release
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>

* pin versions

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2024-04-01 13:42:54 +00:00
dependabot[bot] d0cc138dee Bump the dependencies group with 4 updates (#89) 2024-04-01 13:32:25 +00:00
github-actions[bot] 3d635066b4 Reference latest Pixi version in README (#86) 2024-03-25 07:43:13 +01:00
Ruben Arts 2e317cc221 Improve multi environment example (#85)
Align with pixi.sh
2024-03-18 13:21:23 +00:00
Pavel Zwerschke 603fd64350 Create pull request template (#84) 2024-03-11 14:39:41 +00:00
github-actions[bot] f0903b2941 Reference latest Pixi version in README (#83) 2024-03-11 08:17:51 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> d2f0e65db7 Bump the dependencies group with 7 updates (#80)
Bumps the dependencies group with 7 updates:

| Package | From | To |
| --- | --- | --- |
| [@actions/cache](https://github.com/actions/toolkit/tree/HEAD/packages/cache) | `3.2.3` | `3.2.4` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `20.11.14` | `20.11.24` |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `6.20.0` | `7.1.0` |
| [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `6.20.0` | `7.1.0` |
| [eslint](https://github.com/eslint/eslint) | `8.56.0` | `8.57.0` |
| [prettier](https://github.com/prettier/prettier) | `3.2.4` | `3.2.5` |
| [tsup](https://github.com/egoist/tsup) | `8.0.1` | `8.0.2` |


Updates `@actions/cache` from 3.2.3 to 3.2.4
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/cache/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/cache)

Updates `@types/node` from 20.11.14 to 20.11.24
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@typescript-eslint/eslint-plugin` from 6.20.0 to 7.1.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.1.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 6.20.0 to 7.1.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.1.0/packages/parser)

Updates `eslint` from 8.56.0 to 8.57.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.56.0...v8.57.0)

Updates `prettier` from 3.2.4 to 3.2.5
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.2.4...3.2.5)

Updates `tsup` from 8.0.1 to 8.0.2
- [Release notes](https://github.com/egoist/tsup/releases)
- [Changelog](https://github.com/egoist/tsup/blob/dev/.releaserc.json)
- [Commits](https://github.com/egoist/tsup/compare/v8.0.1...v8.0.2)

---
updated-dependencies:
- dependency-name: "@actions/cache"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: dependencies
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: dependencies
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: tsup
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-01 08:31:53 +00:00
dependabot[bot] 0aa5efde00 Bump the dependencies group with 2 updates (#81)
* Bump the dependencies group with 2 updates

Bumps the dependencies group with 2 updates: [pnpm/action-setup](https://github.com/pnpm/action-setup) and [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request).


Updates `pnpm/action-setup` from 2 to 3
- [Release notes](https://github.com/pnpm/action-setup/releases)
- [Commits](https://github.com/pnpm/action-setup/compare/v2...v3)

Updates `peter-evans/create-pull-request` from 6.0.0 to 6.0.1
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/b1ddad2c994a25fbc81a28b3ec0e368bb2021c50...a4f52f8033a6168103c2538976c07b467e8163bc)

---
updated-dependencies:
- dependency-name: pnpm/action-setup
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: dependencies
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-01 07:28:31 +00:00
Ruben ArtsandPavel Zwerschke 20681dbcbf Add pwsh as pixi shells to the tests and documentation (#79)
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2024-02-17 10:38:13 +01:00
Pavel Zwerschke 26e623ccb6 Add no-pixi-toml test (#77) 2024-02-05 14:46:46 +00:00
Pavel Zwerschke 19b5e6071f Fix cache-write behavior (#76) 2024-02-04 11:01:53 +01:00
Pavel Zwerschke afa1d6a5d1 Add warning about caching with multi-envs (#75) 2024-02-02 20:42:38 +00:00
Pavel Zwerschke 52708b32f2 Fix typos (#74) 2024-02-02 20:29:14 +00:00
Pavel Zwerschke c2a7a27098 Add support for multiple envs (#70) 2024-02-01 16:06:26 +01:00
Pavel Zwerschke ad0427dce9 Add pixi list to output (#69) 2024-02-01 14:40:22 +00:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Pavel Zwerschke
77992cdabd Bump the dependencies group with 7 updates (#73)
* Bump the dependencies group with 7 updates

Bumps the dependencies group with 7 updates:

| Package | From | To |
| --- | --- | --- |
| [@actions/cache](https://github.com/actions/toolkit/tree/HEAD/packages/cache) | `3.2.2` | `3.2.3` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `20.10.6` | `20.11.14` |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `6.16.0` | `6.20.0` |
| [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `6.16.0` | `6.20.0` |
| [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) | `16.6.0` | `16.6.2` |
| [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) | `5.1.2` | `5.1.3` |
| [prettier](https://github.com/prettier/prettier) | `3.1.1` | `3.2.4` |


Updates `@actions/cache` from 3.2.2 to 3.2.3
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/cache/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/cache)

Updates `@types/node` from 20.10.6 to 20.11.14
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@typescript-eslint/eslint-plugin` from 6.16.0 to 6.20.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.20.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 6.16.0 to 6.20.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.20.0/packages/parser)

Updates `eslint-plugin-n` from 16.6.0 to 16.6.2
- [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases)
- [Commits](https://github.com/eslint-community/eslint-plugin-n/compare/16.6.0...16.6.2)

Updates `eslint-plugin-prettier` from 5.1.2 to 5.1.3
- [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases)
- [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/eslint-plugin-prettier/compare/v5.1.2...v5.1.3)

Updates `prettier` from 3.1.1 to 3.2.4
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.1.1...3.2.4)

---
updated-dependencies:
- dependency-name: "@actions/cache"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies
- dependency-name: eslint-plugin-n
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: eslint-plugin-prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>

* build

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2024-02-01 09:55:06 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> a07becb301 Bump peter-evans/create-pull-request from 5.0.2 to 6.0.0 (#72)
Bumps the dependencies group with 1 update: [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request).


Updates `peter-evans/create-pull-request` from 5.0.2 to 6.0.0
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/153407881ec5c347639a548ade7d8ad1d6740e38...b1ddad2c994a25fbc81a28b3ec0e368bb2021c50)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-01 08:28:33 +01:00
Pavel Zwerschke 3f5ab780ba Add more tests (#71) 2024-02-01 00:16:28 +01:00
24 changed files with 34067 additions and 2513 deletions
+3
View File
@@ -0,0 +1,3 @@
If updating documentation:
- [ ] Updated documentation in https://github.com/prefix-dev/pixi/blob/main/docs/advanced/github_actions.md as well
+4 -4
View File
@@ -16,7 +16,7 @@ jobs:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v2
uses: pnpm/action-setup@v3
with:
version: 8
@@ -45,7 +45,7 @@ jobs:
run: |
set -euo pipefail
latest_version="$(jq -r '.version' package.json)"
count_expected=10
count_expected=13
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."
@@ -76,7 +76,7 @@ jobs:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create pull request
uses: peter-evans/create-pull-request@153407881ec5c347639a548ade7d8ad1d6740e38
uses: peter-evans/create-pull-request@70a41aba780001da0a30141984ae2a0c95d8704e
if: failure() && github.ref_name == 'main'
with:
token: ${{ secrets.GITHUB_TOKEN }}
@@ -90,7 +90,7 @@ jobs:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v2
uses: pnpm/action-setup@v3
with:
version: 8
+2 -2
View File
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: Quantco/ui-actions/version-metadata@v1
- uses: Quantco/ui-actions/version-metadata@a0653e9fc0ee3c4be9f7cc88e509e40536e9f3c1
id: version-metadata
with:
file: ./package.json
@@ -24,7 +24,7 @@ jobs:
TAG_NAME: v${{ steps.version-metadata.outputs.newVersion }}
- name: Create release
if: steps.version-metadata.outputs.changed == 'true'
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@9d7c94cfd0a1f3ed45544c887983e9fa900f0564
with:
generate_release_notes: true
tag_name: v${{ steps.version-metadata.outputs.newVersion }}
+305 -27
View File
@@ -11,7 +11,7 @@ jobs:
default:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
os: [ubuntu-latest, macos-latest, windows-latest, macos-14]
cache: [true, false]
runs-on: ${{ matrix.os }}
name: default ${{ matrix.cache == true && 'with' || 'without' }} cache (${{ matrix.os }})
@@ -26,15 +26,15 @@ jobs:
- run: |
set -o pipefail
pixi info
test -f .pixi/env/bin/python
./.pixi/env/bin/python --version | grep -q 3.11
test -f .pixi/envs/default/bin/python
./.pixi/envs/default/bin/python --version | grep -q 3.11
shell: bash
if: matrix.os != 'windows-latest'
- run: |
set -o pipefail
pixi info
test -f .pixi/env/python.exe
./.pixi/env/python.exe --version | grep -q 3.11
test -f .pixi/envs/default/python.exe
./.pixi/envs/default/python.exe --version | grep -q 3.11
shell: bash
if: matrix.os == 'windows-latest'
- run: |
@@ -58,15 +58,30 @@ jobs:
! test -d .pixi
shell: bash
custom-pixi-version:
no-pixi-toml:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: ./
with:
run-install: false
- run: |
! test -d .pixi
shell: bash
- run: pixi info
custom-pixi-version:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest, macos-14]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Move pixi.toml
run: mv test/default/* .
run: mv test/old-pixi-lockfiles/* .
- uses: ./
with:
cache: false
@@ -75,6 +90,58 @@ jobs:
locked: false
- run: pixi --version | grep -q "pixi 0.1.0"
old-lockfile:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
locked: [true, false]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* .
- uses: ./
with:
pixi-version: latest
cache: false
locked: ${{ matrix.locked }}
- if: matrix.os == 'windows-latest'
run: choco install yq
# assert that the lockfile wasn't updated
- run: test "$(yq '.version' pixi.lock)" = 1
install-path:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest, macos-14]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: ./
with:
run-install: false
- run: test "$(which pixi)" = "$HOME/.pixi/bin/pixi"
shell: bash
global-install:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest, macos-14]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: ./
with:
run-install: false
- run: pixi global install cowpy
- run: |
pixi global list 2>&1 | grep cowpy
cowpy hello world
test "$(which cowpy)" = "$HOME/.pixi/bin/cowpy"
if: matrix.os != 'windows-latest'
- run: cowpy hello world
if: matrix.os == 'windows-latest'
frozen:
strategy:
matrix:
@@ -110,14 +177,12 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Move pixi.toml
run: mv test/default/* .
run: mv test/old-pixi-lockfiles/* .
- uses: ./
with:
cache: false
pixi-url: https://github.com/prefix-dev/pixi/releases/download/v0.0.8/pixi-x86_64-unknown-linux-musl
# pixi 0.0.8 doesn't support --locked
locked: false
- run: pixi --version | grep -q "pixi 0.0.8"
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"
custom-manifest-path:
strategy:
@@ -130,7 +195,7 @@ jobs:
with:
cache: false
manifest-path: test/default/pixi.toml
different-log-level:
strategy:
matrix:
@@ -165,6 +230,126 @@ jobs:
# which pixi should be absolute
which pixi | grep -q "^/"
existing-pixi-bin:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
ignore-reason: [ none, version, version-latest, url, bin-path]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Move pixi.toml
run: mv test/default/* .
- name: Create pixi directory and add to PATH
run: |
mkdir -p $HOME/custom-existing-pixi
echo $HOME/custom-existing-pixi >> $GITHUB_PATH
if: matrix.os != 'windows-latest'
- name: Create pixi directory and add to PATH (Windows)
run: |
mkdir $env:USERPROFILE\custom-existing-pixi
echo $env:USERPROFILE\custom-existing-pixi >> $env:GITHUB_PATH
shell: pwsh
if: matrix.os == 'windows-latest'
- name: Download pixi binary (Ubuntu)
run: |
set -o pipefail
curl -L --output $HOME/custom-existing-pixi/pixi https://github.com/prefix-dev/pixi/releases/download/v0.14.0/pixi-x86_64-unknown-linux-musl
chmod +x $HOME/custom-existing-pixi/pixi
if: matrix.os == 'ubuntu-latest'
- name: Download pixi binary (macOS)
run: |
set -o pipefail
curl -L --output $HOME/custom-existing-pixi/pixi https://github.com/prefix-dev/pixi/releases/download/v0.14.0/pixi-x86_64-apple-darwin
chmod +x $HOME/custom-existing-pixi/pixi
if: matrix.os == 'macos-latest'
- name: Download pixi binary (Windows)
run: |
curl -L --output $HOME/custom-existing-pixi/pixi.exe https://github.com/prefix-dev/pixi/releases/download/v0.14.0/pixi-x86_64-pc-windows-msvc.exe
if: matrix.os == 'windows-latest'
- run: |
echo "Path: $PATH"
shell: bash
- name: Verify pixi version (before setup-pixi)
run: |
pixi --version
pixi --version | grep -q "pixi 0.14.0"
shell: bash
- name: Verify pixi path (before setup-pixi)
run: |
which pixi | grep -q $HOME/custom-existing-pixi/pixi
shell: bash
- name: Run Action (should use preinstalled pixi)
uses: ./
with:
cache: false
if: matrix.ignore-reason == 'none'
- name: Run Action (version-latest should overwrite preinstalled pixi)
uses: ./
with:
cache: false
pixi-version: latest
if: matrix.ignore-reason == 'version-latest'
- name: Run Action (version should overwrite preinstalled pixi)
uses: ./
with:
cache: false
pixi-version: v0.16.0
if: matrix.ignore-reason == 'version'
- name: Run Action (url should overwrite preinstalled pixi)
uses: ./
with:
cache: false
pixi-url: |
${{
matrix.os == 'ubuntu-latest' &&
'https://github.com/prefix-dev/pixi/releases/download/v0.16.0/pixi-x86_64-unknown-linux-musl'
|| matrix.os == 'macos-latest' &&
'https://github.com/prefix-dev/pixi/releases/download/v0.16.0/pixi-x86_64-apple-darwin'
|| 'https://github.com/prefix-dev/pixi/releases/download/v0.16.0/pixi-x86_64-pc-windows-msvc.exe'
}}
if: matrix.ignore-reason == 'url'
- name: Create custom bin directory
run: mkdir custom-bin
shell: bash
if: matrix.ignore-reason == 'bin-path'
- name: Run Action (pixi-bin-path should overwrite preinstalled pixi)
uses: ./
with:
cache: false
# this will implicitly set pixi-version to latest
pixi-bin-path: custom-bin/pixi${{ matrix.os == 'windows-latest' && '.exe' || '' }}
if: matrix.ignore-reason == 'bin-path'
- name: Verify pixi version (after setup-pixi) - still at 0.14.0
run: |
pixi --version
pixi --version | grep -q 0.14.0
shell: bash
if: matrix.ignore-reason == 'none'
- name: Verify pixi version (after setup-pixi) - should be 0.16.0
run: |
pixi --version
pixi --version | grep -q 0.16.0
shell: bash
if: matrix.ignore-reason != 'none' && matrix.ignore-reason != 'bin-path' && matrix.ignore-reason != 'version-latest'
- name: Verify pixi version (after setup-pixi) - should be latest
run: |
pixi --version
pixi --version | grep -vq 0.14.0
pixi --version | grep -vq 0.16.0
shell: bash
if: matrix.ignore-reason == 'bin-path' || matrix.ignore-reason == 'version-latest'
- name: Verify pixi path (after setup-pixi, no ignore reason)
run: |
which pixi | grep -q $HOME/custom-existing-pixi/pixi
shell: bash
if: matrix.ignore-reason == 'none'
- name: Verify pixi path (after setup-pixi, ignore reason)
run: |
which pixi | grep -vq $HOME/custom-existing-pixi/pixi
shell: bash
if: matrix.ignore-reason != 'none'
auth-token:
strategy:
matrix:
@@ -246,7 +431,7 @@ jobs:
auth-token: ${{ secrets.PREFIX_DEV_TOKEN }}
- name: Ensure private-package is installed
run: |
test -f .pixi/env/conda-meta/private-package-0.0.1-0.json
test -f .pixi/envs/default/conda-meta/private-package-0.0.1-0.json
pixi-shell:
strategy:
@@ -262,13 +447,15 @@ jobs:
cache: false
- run: |
python --version | grep -q "3.11"
shell: pixi run bash {0}
shell: pixi run bash -e {0}
- run: |
import sys
print(sys.version)
print("Hello world")
shell: pixi run python {0}
- run: |
python --version | Select-String "3.11"
shell: pixi run pwsh -Command {0}
post-cleanup-linux:
runs-on: ubuntu-latest
strategy:
@@ -368,24 +555,77 @@ jobs:
- name: Move pixi.toml
run: mv test/no-lockfile/* .
- uses: ./
with:
cache: false
- run: |
set -o pipefail
pixi info
test -f .pixi/env/bin/python
./.pixi/env/bin/python --version | grep -q 3.11
test -f .pixi/envs/default/bin/python
./.pixi/envs/default/bin/python --version | grep -q 3.11
shell: bash
if: matrix.os != 'windows-latest'
- run: |
set -o pipefail
pixi info
test -f .pixi/env/python.exe
./.pixi/env/python.exe --version | grep -q 3.11
test -f .pixi/envs/default/python.exe
./.pixi/envs/default/python.exe --version | grep -q 3.11
shell: bash
if: matrix.os == 'windows-latest'
- run: |
pixi run python --version | grep -q 3.11
pixi run test | grep -q "Hello world"
multiple-environments:
name: multiple-environments (${{ matrix.os }}, cache=${{ matrix.cache }})
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest, macos-14]
cache: ['true', 'false']
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Move pixi.toml
run: mv test/multiple-environments/* .
- uses: ./
with:
environments: py311 py312
cache: ${{ matrix.cache }}
- run: |
set -o pipefail
pixi info
test -f .pixi/envs/py311/bin/python
test -f .pixi/envs/py312/bin/python
! test -d .pixi/envs/default
./.pixi/envs/py311/bin/python --version | grep -q 3.11
./.pixi/envs/py312/bin/python --version | grep -q 3.12
shell: bash
if: matrix.os != 'windows-latest'
- run: |
set -o pipefail
pixi info
test -f .pixi/envs/py311/python.exe
test -f .pixi/envs/py312/python.exe
! test -d .pixi/envs/default
./.pixi/envs/py311/python.exe --version | grep -q 3.11
./.pixi/envs/py312/python.exe --version | grep -q 3.12
shell: bash
if: matrix.os == 'windows-latest'
cache-write-true:
timeout-minutes: 10
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest, macos-14]
steps:
- uses: actions/checkout@v4
- name: Move pixi files
run: mv test/default/* .
- uses: ./
with:
cache-write: true
test-cache1:
name: Test cache 1/2
timeout-minutes: 10
@@ -393,7 +633,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
os: [windows-latest, ubuntu-latest, macos-latest, macos-14]
steps:
- uses: actions/checkout@v4
- name: Move pixi files
@@ -404,10 +644,10 @@ jobs:
cache-key: test-cache-${{ github.sha }}-${{ github.run_attempt }}-
# check the action logs to see if the cache was written
- run: |
test -f .pixi/env/bin/python
test -f .pixi/envs/default/bin/python
if: matrix.os != 'windows-latest'
- run: |
test -f .pixi/env/python.exe
test -f .pixi/envs/default/python.exe
if: matrix.os == 'windows-latest'
test-cache2:
@@ -418,7 +658,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
os: [windows-latest, ubuntu-latest, macos-latest, macos-14]
steps:
- uses: actions/checkout@v4
- name: Move pixi files
@@ -429,10 +669,10 @@ jobs:
cache-key: test-cache-${{ github.sha }}-${{ github.run_attempt }}-
# check the action logs to see if the cache was restored
- run: |
test -f .pixi/env/bin/python
test -f .pixi/envs/default/bin/python
if: matrix.os != 'windows-latest'
- run: |
test -f .pixi/env/python.exe
test -f .pixi/envs/default/python.exe
if: matrix.os == 'windows-latest'
test-cache-no-write:
@@ -442,7 +682,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
os: [windows-latest, ubuntu-latest, macos-latest, macos-14]
steps:
- uses: actions/checkout@v4
- name: Move pixi files
@@ -453,6 +693,29 @@ jobs:
cache-write: false
cache-key: test-cache-${{ github.sha }}-${{ github.run_attempt }}-
# check the action logs to see if the cache write was skipped
pyproject:
timeout-minutes: 10
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Move pixi files
run: mv test/pyproject-manifest/* .
- uses: ./
- run: test -f .pixi/envs/default/bin/python
- run: pixi run test
custom-pyproject-manifest-path:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: ./
with:
cache: true
manifest-path: test/pyproject-manifest/pyproject.toml
# not properly testable
# https://github.com/actions/runner/issues/2347
@@ -554,3 +817,18 @@ jobs:
# # locked: true is implicit
# - run: exit 1
# if: success()
# 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@v4
# - name: Move pixi files
# run: mv test/no-lockfile/* .
# - uses: ./
# with:
# cache-write: true
+3
View File
@@ -97,3 +97,6 @@ Thumbs.db
# Ignore built ts files
__tests__/runner/*
lib/**/*
# Ignore jetbrains files
.idea
+104 -19
View File
@@ -23,9 +23,9 @@ GitHub Action to set up the [pixi](https://github.com/prefix-dev/pixi) package m
## Usage
```yml
- uses: prefix-dev/setup-pixi@v0.4.3
- uses: prefix-dev/setup-pixi@v0.6.0
with:
pixi-version: v0.12.0
pixi-version: v0.19.1
cache: true
auth-host: prefix.dev
auth-token: ${{ secrets.PREFIX_DEV_TOKEN }}
@@ -34,7 +34,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.4.3`) to avoid breaking changes.
> Please pin the versions of this action to a specific version (i.e., `prefix-dev/setup-pixi@v0.6.0`) 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:
@@ -73,12 +73,75 @@ 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.4.3
- uses: prefix-dev/setup-pixi@v0.6.0
with:
cache: true
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
```
### Multiple environments
With pixi, you can create multiple environments for different requirements.
You can also specify which environment(s) you want to install by setting the `environments` input argument.
This will install all environments that are specified and cache them.
```toml
[project]
name = "my-package"
channels = ["conda-forge"]
platforms = ["linux-64"]
[dependencies]
python = ">=3.11"
pip = "*"
polars = ">=0.14.24,<0.21"
[feature.py311.dependencies]
python = "3.11.*"
[feature.py312.dependencies]
python = "3.12.*"
[environments]
py311 = ["py311"]
py312 = ["py312"]
```
#### Multiple environments using a matrix
The following example will install the `py311` and `py312` environments in different jobs.
```yml
test:
runs-on: ubuntu-latest
strategy:
matrix:
environment: [py311, py312]
steps:
- uses: actions/checkout@v4
- uses: prefix-dev/setup-pixi@v0.6.0
with:
environments: ${{ matrix.environment }}
```
#### Install multiple environments in one job
The following example will install both the `py311` and the `py312` environment on the runner.
```yml
- uses: prefix-dev/setup-pixi@v0.6.0
with:
# separated by spaces
environments: >-
py311
py312
- run: |
pixi run -e py311 test
pixi run -e py312 test
```
> [!WARNING]
> If you don't specify any environment, the `default` environment will be installed and cached, even if you use other environments.
### Authentication
There are currently three ways to authenticate with pixi:
@@ -100,7 +163,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.4.3
- uses: prefix-dev/setup-pixi@v0.6.0
with:
auth-host: prefix.dev
auth-token: ${{ secrets.PREFIX_DEV_TOKEN }}
@@ -112,7 +175,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.4.3
- uses: prefix-dev/setup-pixi@v0.6.0
with:
auth-host: custom-artifactory.com
auth-username: ${{ secrets.PIXI_USERNAME }}
@@ -125,7 +188,7 @@ Specify the conda-token using the `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.4.3
- uses: prefix-dev/setup-pixi@v0.6.0
with:
auth-host: anaconda.org # or my-quetz-instance.com
conda-token: ${{ secrets.CONDA_TOKEN }}
@@ -133,17 +196,17 @@ This form of authentication (token is encoded in URL: `https://my-quetz-instance
### 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 {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}`.
This can be useful if you want to run commands inside of the pixi environment, but don't want to use the `pixi run` command for each command.
```yml
- run: | # everything here will be run inside of the pixi environment
python --version
pip install -e --no-deps .
shell: pixi run bash {0}
shell: pixi run bash -e {0}
```
You can even run python scripts like this:
You can even run Python scripts like this:
```yml
- run: | # everything here will be run inside of the pixi environment
@@ -152,9 +215,17 @@ You can even run python scripts like this:
shell: pixi run python {0}
```
If you want to use PowerShell, you need to specify `-Command` as well.
```yml
- run: | # everything here will be run inside of the pixi environment
python --version | Select-String "3.11"
shell: pixi run pwsh -Command {0} # pwsh works on all platforms
```
> [!NOTE]
> Under the hood, the `shell: xyz {0}` option is implemented by creating a temporary script file and calling `xyz` with that script file as an argument.
> This file does not have the executable bit set, so you cannot use `shell: pixi run {0}` directly but instead have to use `shell: pixi run bash {0}`.
> There are some custom shells provided by GitHub that have slightly different behavior, see [`jobs.<job_id>.steps[*].shell`](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell) in the documentation.
> See the [official documentation](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#custom-shell) and [ADR 0277](https://github.com/actions/runner/blob/main/docs/adrs/0277-run-action-shell-options.md) for more information about how the `shell:` input works in GitHub Actions.
### `--frozen` and `--locked`
@@ -163,7 +234,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.4.3
- uses: prefix-dev/setup-pixi@v0.6.0
with:
locked: true
# or
@@ -182,7 +253,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.4.3
- uses: prefix-dev/setup-pixi@v0.6.0
env:
RUNNER_DEBUG: true
```
@@ -200,13 +271,13 @@ 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.4.3
- uses: prefix-dev/setup-pixi@v0.6.0
with:
# one of `q`, `default`, `v`, `vv`, or `vvv`.
log-level: vvv
```
If nothing is specified, `setup-pixi` will default to `default` or `vv` depending on if [debug logging is enabled for the action](#debug-logging-of-the-action).
If nothing is specified, `log-level` will default to `default` or `vv` depending on if [debug logging is enabled for the action](#debug-logging-of-the-action).
### Self-hosted runners
@@ -221,18 +292,32 @@ If you set `post-cleanup` to `true`, the action will delete the following files:
- the rattler cache
- other rattler files in `~/.rattler`
If nothing is specified, `setup-pixi` will default to `true`.
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.4.3
- uses: prefix-dev/setup-pixi@v0.6.0
with:
post-cleanup: true
# ${{ runner.temp }}\Scripts\pixi.exe on Windows
pixi-bin-path: ${{ runner.temp }}/bin/pixi
```
You can also use a preinstalled local version of pixi on the runner by not setting any of the `pixi-version`,
`pixi-url` or `pixi-bin-path` inputs. This action will then try to find a local version of pixi in the runner's PATH.
### Using the `pyproject.toml` as a manifest file for pixi.
`setup-pixi` will automatically pick up the `pyproject.toml` if it contains a `[tool.pixi.project]` section and no `pixi.toml`.
This can be overwritten by setting the `manifest-path` input argument.
```yml
- uses: prefix-dev/setup-pixi@v0.6.0
with:
manifest-path: pyproject.toml
```
## 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).
@@ -240,6 +325,6 @@ If you want to see more examples, you can take a look at the [GitHub Workflows o
## Local Development
1. Clone this repository.
1. Run `pnpm install` inside the repository (if you don't have [`pnpm`](https://github.com/pnpm/pnpm) installed, you can install it with `npm install -g pnpm` or `brew install pnpm`).
1. Run `pnpm dev` for live transpilation of the TypeScript source code.
1. To test the action, you can run [`act`](https://github.com/nektos/act) (inside docker) or use :sparkles: CI driven development :sparkles:.
2. Run `pnpm install` inside the repository (if you don't have [`pnpm`](https://github.com/pnpm/pnpm) installed, you can install it with `pixi global install pnpm`).
3. Run `pnpm dev` for live transpilation of the TypeScript source code.
4. To test the action, you can run [`act`](https://github.com/nektos/act) (inside docker) or use :sparkles: CI driven development :sparkles:.
+3
View File
@@ -18,6 +18,9 @@ inputs:
description: Path to the manifest file (i.e., `pixi.toml`) to use for the pixi CLI. Defaults to `pixi.toml`.
run-install:
description: Whether to run `pixi install` after setting up the environment. Defaults to `true`.
environments:
description: |
A space-separated list of environments to install. If not specified, only the default environment is installed.
locked:
description: Whether to use `pixi install --locked`. Defaults to `true` when the lockfile is present, otherwise `false`.
frozen:
Generated Vendored
+22634 -1019
View File
File diff suppressed because one or more lines are too long
Generated Vendored
+4204 -148
View File
File diff suppressed because it is too large Load Diff
+14 -11
View File
@@ -1,6 +1,6 @@
{
"name": "setup-pixi",
"version": "0.4.3",
"version": "0.6.0",
"private": true,
"description": "Action to set up the pixi package manager.",
"scripts": {
@@ -21,27 +21,30 @@
"author": "Pavel Zwerschke <pavelzw@gmail.com>",
"license": "BSD-3-Clause",
"dependencies": {
"@actions/cache": "^3.2.2",
"@actions/cache": "^3.2.4",
"@actions/core": "^1.10.1",
"@actions/exec": "^1.1.1",
"@actions/io": "^1.1.3",
"@actions/tool-cache": "^2.0.1",
"toml": "^3.0.0",
"untildify": "^5.0.0",
"which": "^4.0.0",
"zod": "^3.22.4"
},
"devDependencies": {
"@types/node": "^20.10.6",
"@typescript-eslint/eslint-plugin": "^6.16.0",
"@typescript-eslint/parser": "^6.16.0",
"eslint": "^8.56.0",
"@types/node": "^20.12.2",
"@types/which": "^3.0.3",
"@typescript-eslint/eslint-plugin": "^7.4.0",
"@typescript-eslint/parser": "^7.4.0",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-config-standard": "^17.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-n": "^16.6.0",
"eslint-plugin-prettier": "^5.1.2",
"eslint-plugin-n": "^16.6.2",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-promise": "^6.1.1",
"prettier": "^3.1.1",
"tsup": "^8.0.1",
"typescript": "^5.3.3"
"prettier": "^3.2.5",
"tsup": "^8.0.2",
"typescript": "^5.4.3"
}
}
+587 -369
View File
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -16,10 +16,12 @@ export const generateCacheKey = async (cacheKeyPrefix: string) =>
// 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 cwd in the cache key
const cwdSha = sha256(process.cwd())
core.debug(`cwdSha: ${cwdSha}`)
const sha = sha256(lockfileSha + pixiSha + lockfilePathSha + cwdSha)
const sha = sha256(lockfileSha + environments + pixiSha + lockfilePathSha + cwdSha)
core.debug(`sha: ${sha}`)
return `${cacheKeyPrefix}${getCondaArch()}-${sha}`
})
+55 -4
View File
@@ -54,22 +54,73 @@ const pixiInstall = async () => {
return Promise.resolve()
}
return tryRestoreCache()
.then((_cacheKey) =>
execute(pixiCmd(`install${options.frozen ? ' --frozen' : ''}${options.locked ? ' --locked' : ''}`))
)
.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)
}
const generateList = async () => {
if (!options.runInstall) {
core.debug('Skipping pixi list.')
return Promise.resolve()
}
if (
'version' in options.pixiSource &&
options.pixiSource.version !== 'latest' &&
options.pixiSource.version < 'v0.13.0'
) {
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()
}
let command = 'list'
if (
'version' in options.pixiSource &&
options.pixiSource.version !== 'latest' &&
options.pixiSource.version < 'v0.14.0'
) {
if (options.frozen) core.warning('pixi versions < `v0.14.0` do not support the --frozen option for pixi list.')
if (options.locked) core.warning('pixi versions < `v0.14.0` do not support the --locked option for pixi list.')
} else {
command = `${command}${options.frozen ? ' --frozen' : ''}${options.locked ? ' --locked' : ''}`
}
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}`)))
}
return Promise.resolve()
} else {
return core.group(`pixi ${command}`, () => execute(pixiCmd(command)))
}
}
const generateInfo = () => core.group('pixi info', () => execute(pixiCmd('info')))
const run = async () => {
core.debug(`process.env.HOME: ${process.env.HOME}`)
core.debug(`os.homedir(): ${os.homedir()}`)
await downloadPixi(options.pixiSource)
if (options.downloadPixi) {
await downloadPixi(options.pixiSource)
}
addPixiToPath()
await pixiLogin()
await pixiInstall()
await generateInfo()
await generateList()
}
run().catch((error) => {
+77 -9
View File
@@ -1,17 +1,20 @@
import path from 'path'
import os from 'os'
import { exit } from 'process'
import { existsSync } from 'fs'
import { existsSync, readFileSync } from 'fs'
import * as core from '@actions/core'
import * as z from 'zod'
import untildify from 'untildify'
import { parse } from 'toml'
import which from 'which'
type Inputs = {
type Inputs = Readonly<{
pixiVersion?: string
pixiUrl?: string
logLevel?: LogLevel
manifestPath?: string
runInstall?: boolean
environments?: string[]
frozen?: boolean
locked?: boolean
cache?: boolean
@@ -24,7 +27,7 @@ type Inputs = {
authPassword?: string
authCondaToken?: string
postCleanup?: boolean
}
}>
export type PixiSource =
| {
@@ -56,10 +59,12 @@ type Cache = {
export type Options = Readonly<{
pixiSource: PixiSource
downloadPixi: boolean
logLevel: LogLevel
manifestPath: string
pixiLockFile: string
runInstall: boolean
environments?: string[]
frozen: boolean
locked: boolean
cache?: Cache
@@ -100,6 +105,18 @@ const parseOrUndefinedJSON = <T>(key: string, schema: z.ZodSchema<T>): T | undef
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 === '') {
return undefined
}
return input
.split(' ')
.map((s) => schema.parse(s))
.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')
@@ -139,11 +156,32 @@ const validateInputs = (inputs: Inputs): void => {
throw new Error('You need to specify auth-host')
}
}
if (inputs.cacheWrite && !inputs.cacheKey && !inputs.cache) {
throw new Error('cache-write is only valid with cache-key or cache specified.')
if (inputs.runInstall === false && inputs.environments) {
throw new Error('Cannot specify environments without running install')
}
}
const determinePixiInstallation = (pixiUrlOrVersionSet: boolean, pixiBinPath: string | undefined) => {
const preinstalledPixi = which.sync('pixi', { nothrow: true })
if (pixiUrlOrVersionSet || pixiBinPath) {
if (preinstalledPixi) {
core.debug(`Local pixi found at ${preinstalledPixi} is being ignored.`)
}
return {
downloadPixi: true,
pixiBinPath: pixiBinPath ? path.resolve(untildify(pixiBinPath)) : PATHS.pixiBin
}
}
if (preinstalledPixi) {
core.info(`Using pre-installed pixi at ${preinstalledPixi}`)
return { downloadPixi: false, pixiBinPath: preinstalledPixi }
}
return { downloadPixi: true, pixiBinPath: PATHS.pixiBin }
}
const inferOptions = (inputs: Inputs): Options => {
const runInstall = inputs.runInstall ?? true
const pixiSource = inputs.pixiVersion
@@ -151,17 +189,44 @@ const inferOptions = (inputs: Inputs): Options => {
: inputs.pixiUrl
? { url: inputs.pixiUrl }
: { version: 'latest' }
const { downloadPixi, pixiBinPath } = determinePixiInstallation(
!!inputs.pixiVersion || !!inputs.pixiUrl,
inputs.pixiBinPath
)
const logLevel = inputs.logLevel ?? (core.isDebug() ? 'vv' : 'default')
const manifestPath = inputs.manifestPath ? path.resolve(untildify(inputs.manifestPath)) : 'pixi.toml'
const pixiLockFile = path.join(path.dirname(manifestPath), path.basename(manifestPath).replace(/\.toml$/, '.lock'))
// infer manifest path from inputs or default to pixi.toml or pyproject.toml depending on what is present in the repo.
let manifestPath = 'pixi.toml' // default
if (inputs.manifestPath) {
manifestPath = path.resolve(untildify(inputs.manifestPath))
} else {
if (existsSync('pixi.toml')) {
manifestPath = 'pixi.toml'
} else if (existsSync('pyproject.toml')) {
const fileContent = readFileSync('pyproject.toml', 'utf-8')
const parsedContent = parse(fileContent)
// only use pyproject.toml if [tool.pixi] is present
if (parsedContent.tool && parsedContent.tool.pixi) {
core.debug('The tool.pixi table found so using pyproject.toml as manifest file.')
manifestPath = 'pyproject.toml'
}
} else {
if (runInstall) {
core.warning('Could not find any manifest file. Defaulting to pixi.toml.')
}
}
}
const pixiLockFile = path.join(path.dirname(manifestPath), 'pixi.lock')
const lockFileAvailable = existsSync(pixiLockFile)
core.debug(`lockFileAvailable: ${lockFileAvailable}`)
if (!lockFileAvailable && inputs.cacheWrite === true) {
throw new Error('You cannot specify cache-write = true without a lock file present')
}
const cache = inputs.cacheKey
? { cacheKeyPrefix: inputs.cacheKey, cacheWrite: inputs.cacheWrite ?? true }
: inputs.cache === true || (lockFileAvailable && inputs.cache !== false)
? { cacheKeyPrefix: 'pixi-', cacheWrite: true }
? { cacheKeyPrefix: 'pixi-', cacheWrite: inputs.cacheWrite ?? true }
: undefined
const pixiBinPath = inputs.pixiBinPath ? path.resolve(untildify(inputs.pixiBinPath)) : PATHS.pixiBin
const frozen = inputs.frozen ?? false
const locked = inputs.locked ?? (lockFileAvailable && !frozen)
const auth = !inputs.authHost
@@ -184,10 +249,12 @@ const inferOptions = (inputs: Inputs): Options => {
const postCleanup = inputs.postCleanup ?? true
return {
pixiSource,
downloadPixi,
logLevel,
manifestPath,
pixiLockFile,
runInstall,
environments: inputs.environments,
frozen,
locked,
cache,
@@ -221,6 +288,7 @@ const getOptions = () => {
),
manifestPath: parseOrUndefined('manifest-path', z.string()),
runInstall: parseOrUndefinedJSON('run-install', z.boolean()),
environments: parseOrUndefinedList('environments', z.string()),
locked: parseOrUndefinedJSON('locked', z.boolean()),
frozen: parseOrUndefinedJSON('frozen', z.boolean()),
cache: parseOrUndefinedJSON('cache', z.boolean()),
+1
View File
@@ -78,6 +78,7 @@ export const pixiCmd = (command: string, withManifestPath = true) => {
if (withManifestPath) {
commandArray = commandArray.concat(['--manifest-path', options.manifestPath])
}
commandArray = commandArray.concat(['--color', 'always'])
switch (options.logLevel) {
case 'vvv':
commandArray = commandArray.concat(['-vvv'])
+1105 -899
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -4,7 +4,7 @@ version = "0.1.0"
description = "Add a short description here"
authors = ["Pavel Zwerschke <pavelzw@gmail.com>"]
channels = ["conda-forge"]
platforms = ["linux-64", "osx-64", "win-64"]
platforms = ["linux-64", "osx-64", "osx-arm64", "win-64"]
[tasks]
test = "python -c 'print(\"Hello world!\")'"
File diff suppressed because it is too large Load Diff
+18
View File
@@ -0,0 +1,18 @@
[project]
name = "test-package"
channels = ["conda-forge"]
platforms = ["linux-64", "osx-arm64", "osx-64", "win-64"]
[dependencies]
python = ">=3.11"
pip = "*"
polars = ">=0.14.24,<0.21"
[feature.py311.dependencies]
python = "3.11.*"
[feature.py312.dependencies]
python = "3.12.*"
[environments]
py311 = ["py311"]
py312 = ["py312"]
File diff suppressed because it is too large Load Diff
+13
View File
@@ -0,0 +1,13 @@
[project]
name = "test-default"
version = "0.1.0"
description = "Add a short description here"
authors = ["Pavel Zwerschke <pavelzw@gmail.com>"]
channels = ["conda-forge"]
platforms = ["linux-64", "osx-64", "osx-arm64", "win-64"]
[tasks]
test = "python -c 'print(\"Hello world!\")'"
[dependencies]
python = "3.11.*"
File diff suppressed because it is too large Load Diff
+22
View File
@@ -0,0 +1,22 @@
[project]
name = "pyproject-manifest"
version = "0.1.0"
description = "Testing pyproject-manifest."
readme = "README.md"
requires-python = ">=3.11"
dependencies = ["flask==2.*"]
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
[tool.pixi.project]
name = "pyproject-manifest"
channels = ["conda-forge"]
platforms = ["linux-64", "osx-arm64", "osx-64", "win-64"]
[tool.pixi.pypi-dependencies]
boltons = "*"
[tool.pixi.tasks]
test = "echo 'Running tests...'"
+2
View File
@@ -19,6 +19,8 @@ export default defineConfig({
'@actions/io',
'@actions/tool-cache',
'untildify',
'toml',
'which',
'zod'
]
})