-
Notifications
You must be signed in to change notification settings - Fork 104
164 lines (149 loc) · 5.64 KB
/
test.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
name: test
on:
pull_request:
push:
branches:
- main
concurrency:
# Concurrency group that uses the workflow name and PR number if available
# or commit SHA as a fallback. If a new build is triggered under that
# concurrency group while a previous build is running it will be canceled.
# Repeated pushes to a PR will cancel all previous builds, while multiple
# merges to main will not cancel.
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
# # Temporarily pin the version due to
# # <https://github.com/mamba-org/mamba/issues/3467>
# MICROMAMBA_VERSION: 'latest'
MICROMAMBA_VERSION: '1.5.10-0'
jobs:
test:
name: pytest py${{ matrix.python-version }} on ${{ matrix.os }} (${{ matrix.pytest-split-group-index }}/${{ matrix.pytest-split-group-size }})
runs-on: ${{ matrix.os }}-latest
strategy:
fail-fast: false
matrix:
os: [ ubuntu, macos, windows ]
python-version: [ "3.8", "3.12" ]
# pytest-split handles dividing the tests into n groups indexed 1...n.
# The tests are automatically split so that the expected duration of each
# group is roughly the same.
# See the "exclude" section below for pruning to the group sizes,
# and the "include" section for defining the group sizes.
pytest-split-group-index: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
exclude:
- os: windows
python-version: "3.8"
- os: macos
python-version: "3.8"
# Prune the indices so that we only run the splits up to the group size
# defined below in "include". (This is ugly but effective.)
- os: ubuntu
pytest-split-group-index: 4
- os: ubuntu
pytest-split-group-index: 5
- os: ubuntu
pytest-split-group-index: 6
- os: ubuntu
pytest-split-group-index: 7
- os: ubuntu
pytest-split-group-index: 8
- os: ubuntu
pytest-split-group-index: 9
- os: ubuntu
pytest-split-group-index: 10
- os: macos
pytest-split-group-index: 4
- os: macos
pytest-split-group-index: 5
- os: macos
pytest-split-group-index: 6
- os: macos
pytest-split-group-index: 7
- os: macos
pytest-split-group-index: 8
- os: macos
pytest-split-group-index: 9
- os: macos
pytest-split-group-index: 10
include:
- os: ubuntu
pytest-split-group-size: 3
- os: macos
pytest-split-group-size: 3
- os: windows
pytest-split-group-size: 10
defaults:
run:
shell: bash -eo pipefail -l {0}
env:
PYTHONUNBUFFERED: "1"
FORCE_COLOR: "1"
steps:
- uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
- uses: mamba-org/setup-micromamba@v2
with:
micromamba-version: ${{ env.MICROMAMBA_VERSION }}
environment-file: environments/conda-lock.yml
environment-name: conda-lock-dev
init-shell: bash
cache-environment: true
create-args: >-
python=${{ matrix.python-version }} --category=main --category=dev
- name: install conda-lock
run: |
which pip
pip install -e . --no-deps
pip check
- name: run-test
run: |
mkdir -p tests/durations
set -x
which pytest
pytest \
--cov=conda_lock --cov-branch --cov-report=xml --cov-report=term \
--store-durations \
--clean-durations \
--durations-path "tests/durations/${{ matrix.os }}-py${{ matrix.python-version }}.json" \
--splits="${{ matrix.pytest-split-group-size }}" \
--group="${{ matrix.pytest-split-group-index }}"
- uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Print test durations
run: |
ls -al tests/durations
cat tests/durations/${{ matrix.os }}-py${{ matrix.python-version }}.json
- name: Store test durations
uses: actions/upload-artifact@v4
with:
name: test-durations-${{ matrix.os }}-py${{ matrix.python-version }}-${{ matrix.pytest-split-group-index }}
path: tests/durations/${{ matrix.os }}-py${{ matrix.python-version }}.json
aggregate-durations:
name: Aggregate test durations
runs-on: ubuntu-latest
needs: test
steps:
- name: Download test durations
uses: actions/download-artifact@v4
# All the artifacts are downloaded into various subdirectories.
# For each filename that occurs, we need to find all the files in the
# subdirectories with the same name, group those, and merge them.
- name: Construct the list of filenames to aggregate and write them to temp/filenames.txt
id: construct-filenames
run: |
mkdir temp
find . -type f -name '*.json' | xargs -n1 basename | sort | uniq > temp/filenames.txt
cat temp/filenames.txt
- name: Aggregate test durations and sort by key (test name)
run: |
mkdir aggregated
while read -r filename; do
jq -s 'add | to_entries | sort_by(.key) | from_entries' $(find . -type f -name "$filename") > "aggregated/$filename"
done < temp/filenames.txt
- name: Upload aggregated test durations
uses: actions/upload-artifact@v4
with:
name: aggregated-test-durations
path: aggregated