uv/docs/guides/integration/gitlab.md
Florian Greinacher 9fc24b2ac5
docs: suggest copy linking for GitLab integration guide (#11067)
## Summary

Hardlinking does not work in that context and raises a warning.

Setting the link mode to copy makes the warning go away.

## Test Plan

Tested on gitlab.com and our self-hosted GitLab instance.

Before changing the link mode:

8986967570

After changing the link mode:

8987026307.

⚒️ with ❤️ by
[Siemens](https://opensource.siemens.com/)

---------

Co-authored-by: Zanie Blue <contact@zanie.dev>
2025-01-29 17:58:14 +00:00

86 lines
2.3 KiB
Markdown

---
title: Using uv in GitLab CI/CD
description: A guide to using uv in GitLab CI/CD, including installation, setting up Python,
installing dependencies, and more.
---
# Using uv in GitLab CI/CD
## Using the uv image
Astral provides [Docker images](docker.md#available-images) with uv preinstalled.
Select a variant that is suitable for your workflow.
```yaml title="gitlab-ci.yml"
variables:
UV_VERSION: 0.5
PYTHON_VERSION: 3.12
BASE_LAYER: bookworm-slim
# GitLab CI creates a separate mountpoint for the build directory,
# so we need to copy instead of using hard links.
UV_LINK_MODE: copy
uv:
image: ghcr.io/astral-sh/uv:$UV_VERSION-python$PYTHON_VERSION-$BASE_LAYER
script:
# your `uv` commands
```
!!! note
If you are using a distroless image, you have to specify the entrypoint:
```yaml
uv:
image:
name: ghcr.io/astral-sh/uv:$UV_VERSION
entrypoint: [""]
# ...
```
## Caching
Persisting the uv cache between workflow runs can improve performance.
```yaml
uv-install:
variables:
UV_CACHE_DIR: .uv-cache
cache:
- key:
files:
- uv.lock
paths:
- $UV_CACHE_DIR
script:
# Your `uv` commands
- uv cache prune --ci
```
See the [GitLab caching documentation](https://docs.gitlab.com/ee/ci/caching/) for more details on
configuring caching.
Using `uv cache prune --ci` at the end of the job is recommended to reduce cache size. See the [uv
cache documentation](../../concepts/cache.md#caching-in-continuous-integration) for more details.
## Using `uv pip`
If using the `uv pip` interface instead of the uv project interface, uv requires a virtual
environment by default. To allow installing packages into the system environment, use the `--system`
flag on all uv invocations or set the `UV_SYSTEM_PYTHON` variable.
The `UV_SYSTEM_PYTHON` variable can be defined in at different scopes. You can read more about
how [variables and their precedence works in GitLab here](https://docs.gitlab.com/ee/ci/variables/)
Opt-in for the entire workflow by defining it at the top level:
```yaml title="gitlab-ci.yml"
variables:
UV_SYSTEM_PYTHON: 1
# [...]
```
To opt-out again, the `--no-system` flag can be used in any uv invocation.
When persisting the cache, you may want to use `requirements.txt` or `pyproject.toml` as
your cache key files instead of `uv.lock`.