-
Notifications
You must be signed in to change notification settings - Fork 4
/
action.yml
118 lines (108 loc) · 4.83 KB
/
action.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
name: Setup Python and Poetry
description: Setup Python and Poetry. Cribbed from snok/install-poetry.
inputs:
python-version:
description: Python version to pass to actions/setup-python@v4.
required: false
default: "3.x"
poetry-version:
description: Poetry version to install via pip.
required: false
default: "1.2.2"
extras:
description: >
If present, a space-separated list of extras to pass to
`poetry install --extra ...`. Either way, dev-dependencies
will be installed.
# If https://github.com/python-poetry/poetry/issues/3413 get solved, I think
# we should make this action install all extras by default.
required: false
default: ""
groups:
description: >
If present, a space-separated list of dependency groups to pass to
`poetry install --with ...`.
required: false
default: ""
install-project:
description: >
Set to "false" to disable installing of the project, instead only install
deps.
required: false
default: "true"
runs:
using: composite
steps:
- name: Setup Python
id: setup-python
uses: actions/setup-python@v4
with:
python-version: ${{ inputs.python-version }}
- name: Check for poetry lock
run: "test -f poetry.lock || (echo No lock file! && false)"
shell: bash
# Install poetry. It takes ~10seconds for a clean pip install, most of which is
# the installation rather than the downloading. So instead, we cache the user-base
# directory (~/.local). For this to be safe:
# - we must not write to `.local` as part of the CI
# - we must not install anything with the system `pip` other than poetry.
# Based on the writeup at:
# https://github.com/snok/install-poetry/blob/main/README.md#caching-the-poetry-installation
- name: Locate user site
id: site-user-base
run: echo "dir=$(python -m site --user-base)" >> "$GITHUB_OUTPUT"
shell: bash
- name: Restore/cache poetry installation
id: poetry-install-cache
uses: actions/cache@v3
with:
path: ${{ steps.site-user-base.outputs.dir }}
key: poetry-install-cache-${{ steps.setup-python.outputs.python-version }}-${{ inputs.poetry-version }}
- name: Install poetry from scratch
if: "${{ steps.poetry-install-cache.outputs.cache-hit != 'true' }}"
run: python -m pip install --user poetry==${{ inputs.poetry-version }}
shell: bash
# Poetry manages a virtualenv for us. We're going to cache that too.
# Again, we're following snok/install-poetry's README.
- name: Locate poetry venv
id: poetry-venvs
run: echo "dir=$(python -m poetry config virtualenvs.path)" >> "$GITHUB_OUTPUT"
shell: bash
- name: Restore/cache poetry venv
id: poetry-venv-cache
uses: actions/cache@v3
with:
path: ${{ steps.poetry-venvs.outputs.dir }}
key: poetry-venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('poetry.lock') }}-${{ inputs.extras }}
- name: Check that the poetry lockfile is up to date
# This is rather hacky. We look for the warning message in poetry's
# output. We really want to use `poetry lock --check`, but that is only
# available in poetry 1.2.
# https://github.com/python-poetry/poetry/issues/1406
#
# Note that the error message has changed with Poetry 1.2 to
# Warning: poetry.lock is not consistent with pyproject.toml. You may be
# getting improper dependencies. Run poetry lock [--no-update] to fix it.
# So this check fails on Poetry 1.2. But that version of poetry wants to change
# the lockfile to include versions of setuptools for each dependency. So it's
# convenient to leave this as-is, unless we want to change to use Poetry 1.2 by
# default in the future.
run: >-
poetry export --without-hashes | (! grep "The lock file is not up to date") ||
(echo pyproject.toml was updated without running \`poetry lock --no-update\`. && false)
shell: bash
- name: Install project (no extras or groups)
if: inputs.extras == '' && inputs.groups == ''
run: poetry install -vv --no-interaction ${{ inputs.install-project != 'true' && '--no-root' || '' }}
shell: bash
- name: Install project with --extras=${{ inputs.extras }} --with=${{ inputs.groups }}
if: inputs.extras != '' || inputs.groups != ''
# (Empty groups lists are fine.)
run: poetry install -vv --no-interaction ${{ inputs.extras != '' && format('--extras="{0}"', inputs.extras) || '' }} --with="${{ inputs.groups }}" ${{ inputs.install-project != 'true' && '--no-root' || '' }}
shell: bash
# For debugging---let's just check what we're working with.
- name: Dump virtual environment
run: |
poetry env info
poetry run pip list
shell: bash