diff --git a/README.md b/README.md
index 26263ddea..53b8f4103 100644
--- a/README.md
+++ b/README.md
@@ -256,7 +256,7 @@ It supports automatic caching of your environments.
- run: pixi run cowpy "Thanks for using pixi"
```
-See the [GitHub Action documentation](https://github.com/prefix-dev/setup-pixi) for more examples.
+See the [documentation](https://pixi.sh/latest/advanced/github_actions) for more details.
diff --git a/docs/advanced/github_actions.md b/docs/advanced/github_actions.md
new file mode 100644
index 000000000..2d3999fb8
--- /dev/null
+++ b/docs/advanced/github_actions.md
@@ -0,0 +1,292 @@
+---
+part: pixi/advanced
+title: GitHub Action
+description: Learn how to use pixi using GitHub Actions
+---
+
+
+We created [prefix-dev/setup-pixi](https://github.com/prefix-dev/setup-pixi) to facilitate using pixi in CI.
+
+## Usage
+
+```yaml
+- uses: prefix-dev/setup-pixi@v0.5.1
+ with:
+ pixi-version: v0.16.1
+ cache: true
+ auth-host: prefix.dev
+ auth-token: ${{ secrets.PREFIX_DEV_TOKEN }}
+- run: pixi run test
+```
+
+!!!warning "Pin your action versions"
+ Since pixi is not yet stable, the API of this action may change between minor versions.
+ Please pin the versions of this action to a specific version (i.e., `prefix-dev/setup-pixi@v0.5.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:
+
+ ```yaml
+ version: 2
+ updates:
+ - package-ecosystem: github-actions
+ directory: /
+ schedule:
+ interval: monthly # or daily, weekly
+ groups:
+ dependencies:
+ patterns:
+ - "*"
+ ```
+
+## Features
+
+To see all available input arguments, see the [`action.yml`](https://github.com/prefix-dev/setup-pixi/blob/main/action.yml) file in `setup-pixi`.
+The most important features are described below.
+
+### Caching
+
+The action supports caching of the pixi environment.
+By default, caching is enabled if a `pixi.lock` file is present.
+It will then use the `pixi.lock` file to generate a hash of the environment and cache it.
+If the cache is hit, the action will skip the installation and use the cached environment.
+You can specify the behavior by setting the `cache` input argument.
+
+!!!tip "Customize your cache key"
+ If you need to customize your cache-key, you can use the `cache-key` input argument.
+ This will be the prefix of the cache key. The full cache key will be `-`.
+
+!!!tip "Only save caches on `main`"
+ In order to not exceed the [10 GB cache size limit](https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#usage-limits-and-eviction-policy) as fast, you might want to restrict when the cache is saved.
+ This can be done by setting the `cache-write` argument.
+
+ ```yaml
+ - uses: prefix-dev/setup-pixi@v0.5.1
+ 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.
+
+```yaml
+test:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ environment: [py311, py312]
+ steps:
+ - uses: actions/checkout@v4
+ - uses: prefix-dev/setup-pixi@v0.5.1
+ 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.
+
+```yaml
+- uses: prefix-dev/setup-pixi@v0.5.1
+ with:
+ # separated by spaces
+ environments: >-
+ py311
+ py312
+```
+
+!!!warning "Caching behavior if you don't specify environments"
+ 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:
+
+- using a token
+- using a username and password
+- using a conda-token
+
+For more information, see [Authentication](./authentication.md).
+
+!!!warning "Handle secrets with care"
+ Please only store sensitive information using [GitHub secrets](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions). Do not store them in your repository.
+ When your sensitive information is stored in a GitHub secret, you can access it using the `${{ secrets.SECRET_NAME }}` syntax.
+ These secrets will always be masked in the logs.
+
+#### Token
+
+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).
+
+```yaml
+- uses: prefix-dev/setup-pixi@v0.5.1
+ with:
+ auth-host: prefix.dev
+ auth-token: ${{ secrets.PREFIX_DEV_TOKEN }}
+```
+
+#### Username and password
+
+Specify the username and password using the `auth-username` and `auth-password` input arguments.
+This form of authentication (HTTP Basic Auth) is used in some enterprise environments with [artifactory](https://jfrog.com/artifactory) for example.
+
+```yaml
+- uses: prefix-dev/setup-pixi@v0.5.1
+ with:
+ auth-host: custom-artifactory.com
+ auth-username: ${{ secrets.PIXI_USERNAME }}
+ auth-password: ${{ secrets.PIXI_PASSWORD }}
+```
+
+#### Conda-token
+
+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//get/custom-channel`) is used at [anaconda.org](https://anaconda.org) or with [quetz instances](https://github.com/mamba-org/quetz).
+
+```yaml
+- uses: prefix-dev/setup-pixi@v0.5.1
+ with:
+ auth-host: anaconda.org # or my-quetz-instance.com
+ conda-token: ${{ secrets.CONDA_TOKEN }}
+```
+
+### 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}`.
+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.
+
+```yaml
+- run: | # everything here will be run inside of the pixi environment
+ python --version
+ pip install -e --no-deps .
+ shell: pixi run bash -e {0}
+```
+
+You can even run Python scripts like this:
+
+```yaml
+- run: | # everything here will be run inside of the pixi environment
+ import my_package
+ print("Hello world!")
+ shell: pixi run python {0}
+```
+
+If you want to use PowerShell, you need to specify `-Command` as well.
+
+```yaml
+- 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 "How does it work under the hood?"
+ 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..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`
+
+You can specify whether `setup-pixi` should run `pixi install --frozen` or `pixi install --locked` depending on the `frozen` or the `locked` input argument.
+See the [official documentation](https://prefix.dev/docs/pixi/cli#install) for more information about the `--frozen` and `--locked` flags.
+
+```yaml
+- uses: prefix-dev/setup-pixi@v0.5.1
+ with:
+ locked: true
+ # or
+ frozen: true
+```
+
+If you don't specify anything, the default behavior is to run `pixi install --locked` if a `pixi.lock` file is present and `pixi install` otherwise.
+
+### Debugging
+
+There are two types of debug logging that you can enable.
+
+#### Debug logging of the action
+
+The first one is the debug logging of the action itself.
+This can be enabled by for the action by re-running the action in debug mode:
+
+![Re-run in debug mode](https://raw.githubusercontent.com/prefix-dev/setup-pixi/main/.github/assets/enable-debug-logging-light.png#only-light)
+![Re-run in debug mode](https://raw.githubusercontent.com/prefix-dev/setup-pixi/main/.github/assets/enable-debug-logging-dark.png#only-dark)
+
+!!!tip "Debug logging documentation"
+ For more information about debug logging in GitHub Actions, see [the official documentation](https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging).
+
+#### Debug logging of pixi
+
+The second type is the debug logging of the pixi executable.
+This can be specified by setting the `log-level` input.
+
+```yaml
+- uses: prefix-dev/setup-pixi@v0.5.1
+ with:
+ # one of `q`, `default`, `v`, `vv`, or `vvv`.
+ log-level: vvv
+```
+
+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
+
+On self-hosted runners, it may happen that some files are persisted between jobs.
+This can lead to problems or secrets getting leaked between job runs.
+To avoid this, you can use the `post-cleanup` input to specify the post cleanup behavior of the action (i.e., what happens _after_ all your commands have been executed).
+
+If you set `post-cleanup` to `true`, the action will delete the following files:
+
+- `.pixi` environment
+- the pixi binary
+- the rattler cache
+- other rattler files in `~/.rattler`
+
+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.
+
+```yaml
+- uses: prefix-dev/setup-pixi@v0.5.1
+ with:
+ post-cleanup: true
+ pixi-bin-path: ${{ runner.temp }}/bin/pixi # (1)!
+```
+
+1. `${{ runner.temp }}\Scripts\pixi.exe` on Windows
+
+## More examples
+
+If you want to see more examples, you can take a look at the [GitHub Workflows of the `setup-pixi` repository](https://github.com/prefix-dev/setup-pixi/blob/main/.github/workflows/test.yml).
diff --git a/docs/basic_usage.md b/docs/basic_usage.md
index 8beac9f75..0fbd42f12 100644
--- a/docs/basic_usage.md
+++ b/docs/basic_usage.md
@@ -88,3 +88,15 @@ pixi global install rattler-build
# Install a linter you want to use in multiple projects.
pixi global install ruff
```
+
+## Use pixi in GitHub Actions
+
+You can use pixi in GitHub Actions to install dependencies and run commands.
+It supports automatic caching of your environments.
+
+```yml
+- uses: prefix-dev/setup-pixi@v0.5.1
+- run: pixi run cowpy "Thanks for using pixi"
+```
+
+See the [GitHub Actions](./advanced/github_actions.md) for more details.
diff --git a/mkdocs.yml b/mkdocs.yml
index 649211c7b..2697d277b 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -109,6 +109,7 @@ nav:
- Multi Platform: advanced/multi_platform_configuration.md
- Info command: advanced/explain_info_command.md
- Channel Logic: advanced/channel_priority.md
+ - GitHub Actions: advanced/github_actions.md
- Examples:
- C++/Cmake: examples/cpp-sdl.md
- OpenCV: examples/opencv.md