はじめに #
Poetryではpoetry config virtualenvs.in-project true
を設定すると、project内に.venv
を作って環境分離をしてくれます。
$ tree -L 1 -a
.
├── app/
├── dockerfiles/
├── .dockerignore
├── .gitlab-ci.yml
├── poetry.lock
├── pyproject.toml
├── README.md
└── .venv/
Gitlab CI/CDではこの.venv
をキャッシュすることで、外部ライブラリ(pip)の毎回のinstallを避けて高速化することができます。
.venv
を別のjob(別ディレクトリ)で再利用することは、必ず動作が保証されている訳ではないので注意しましょう。
https://gitlab.com/gitlab-org/gitlab/-/merge_requests/93367
1. dockerfileの作成 #
image内部で仮想環境を作りたくないので、poetry install
はせず、poetryのコマンドを使えるようにだけしておきます。
FROM python:3.12
ENV PYTHONUNBUFFERED=1
ENV PATH="/root/.local/bin:$PATH"
RUN curl -sSL https://install.python-poetry.org | python3 -
RUN poetry config virtualenvs.in-project true
POETRY_VIRTUALENVS_IN_PROJECT
の環境変数で外部から設定してもOKです。docs
2. .gitlab-ci.yml
の作成
#
作成したimageを$CI_REGISTRY_IMAGE/ci/python312:latest
としてgitlabのコンテナレジストリに保存して、Gitlab CI/CDで利用します。
キャッシュ専用のjobprepare_cache
を用意しpoetry install
を実施することで、以降のjobではキャッシュされた.venv
を利用することができます。
複数のpythonのverを検証したい等で
.venv
を使い分ける必要がある場合は、prefix: ci-python312
を変更することで分離できます。
またbranch毎など、動的に使い分けたい場合はdocsを参照ください。
.python_cache:
image: $CI_REGISTRY_IMAGE/ci/python312:latest
cache:
key:
files:
- poetry.lock
prefix: ci-python312 # Want to change the scope of the cache -> https://docs.gitlab.com/ee/ci/caching/#common-use-cases-for-caches
policy: pull
paths:
- .venv
# - mypy_cache # Uncomment if you use mypy
prepare_cache:
extends: .python_cache
stage: cache
cache:
policy: pull-push
script:
- poetry install -v
small_test:
extends: .python_cache
stage: test
script:
- poetry run python -m pytest
needs:
- prepare_cache
3. 実行結果 #
2つのjobが実行される。
prepare_cache
.venv
をcacheして保存しているので、2回目以降のpoetry install -v
はAlready installedによってSKIPされ高速化されます。
small_test
.venv
をcacheからrestoreしているので、poetry install
することなくそのままpoetry run
を実行できます。
おわりに #
今回のコードやPipelineの実行結果は以下に載せています。参考にどうぞ。
blog / gitlab-ci-cache-python
0
0