I have already written about how to make your docker build faster with uv. Today, I want to quickly show how to make your CI build for a python project faster.
uv is a great pip alternative that for most projects will work as a drop-in replacement. It is a lot quicker in resolving and installing python packages than pip which is especially nice for CI pipelines (or docker builds). Faster pipelines mean a quicker dev turnaround which means higher productivity.
If you keep installing the same packages in your pipeline, you might as well reuse the cache that uv internally uses across pipeline runs.
Cache Task in the Pipeline
For that, you have to insert the following code in your azure-pipelines.yml
before you run uv venv
and uv pip install ...
and after you have installed uv:
- bash: |
echo "##vso[task.setvariable variable=uv-cache-path;]$(uv cache dir)"
- task: Cache@2
displayName: Cache uv
inputs:
key: uv cache | "$(python.version)"
path: $(uv-cache-path)
This sets a new variable uv-cache-path
with the path to the uv cache and then it will cache this path for successive pipeline runs. I assume that you store the python version that you use in a variable called python.version
. You can also replace this directly with the python version that you use. Make sure to keep the quotes around the version though as the task will otherwise interpret the version as a path.
Prune the Cache
Finally, we can use a new feature to prune the cache before we upload it. This will decrease the file size of the cache which makes the upload and download of the cache faster and therefore probably saves you time. You should run uv cache prune --ci
before the end of your pipeline job:
- script: uv cache prune --ci
Summary
In summary, if you want to make your python pipeline faster, the first step should be to use uv. You can simply replace the pip ...
calls by uv pip ...
and see how much faster that makes your pipeline.
If you install a lot of packages that need extensive build steps, it might be worth to re-use the uv cache. For that, you can use the Cache@2
task provided by Azure Pipelines.
Top comments (0)