1+ name : Build Wheels and Release
2+
3+ on :
4+ workflow_dispatch :
5+ push :
6+ tags :
7+ - " *"
8+
9+ env :
10+ PYTHON_VERSIONS : ' ["3.11","3.12","3.13"]'
11+
12+ permissions :
13+ contents : write
14+ actions : read
15+ packages : write
16+
17+ concurrency :
18+ group : build-wheels-${{ github.ref }}
19+ cancel-in-progress : true
20+
21+ defaults :
22+ run :
23+ shell : bash {0}
24+
25+ jobs :
26+ get-python-versions :
27+ runs-on : ubuntu-latest
28+ outputs :
29+ py_ver : ${{ steps.set.outputs.py_ver }}
30+ py_last : ${{ steps.set.outputs.py_last }}
31+ steps :
32+ - id : set
33+ run : |
34+ echo py_ver=$PYTHON_VERSIONS >> $GITHUB_OUTPUT
35+ echo "py_last=${{ fromJson(env.PYTHON_VERSIONS)[0] }}" >> $GITHUB_OUTPUT
36+
37+ check-tag-on-main :
38+ runs-on : ubuntu-latest
39+ steps :
40+ - name : Checkout repository with full history
41+ uses : actions/checkout@v4
42+ with :
43+ token : ${{ secrets.PAT_TOKEN }}
44+ fetch-depth : 0
45+
46+ - name : Verify tag
47+ run : |
48+ git fetch origin main
49+ TAG_COMMIT=$(git rev-parse ${{ github.ref_name }})
50+ if git merge-base --is-ancestor "$TAG_COMMIT" origin/main; then
51+ echo "Tag ${{ github.ref_name }} ($TAG_COMMIT) is contained in main"
52+ else
53+ echo "::error::Tag ${{ github.ref_name }} ($TAG_COMMIT) is not found in main. Please release from the main branch."
54+ exit 1
55+ fi
56+
57+ check-tag-privilege :
58+ # No third party actions used
59+ uses : scikit-package/release-scripts/.github/workflows/_check-tag-privilege.yml@v0
60+ with :
61+ maintainer_github_username : sbillinge
62+
63+ build-sdist :
64+ needs : [check-tag-privilege, get-python-versions, check-tag-on-main]
65+ runs-on : ubuntu-latest
66+
67+ steps :
68+ - name : Checkout
69+ # GitHub officially-maintained actions
70+ uses : actions/checkout@v4
71+ with :
72+ fetch-depth : 0
73+
74+ - name : Set up Python
75+ # GitHub officially-maintained actions
76+ uses : actions/setup-python@v5
77+ with :
78+ python-version : ${{ needs.get-python-versions.outputs.py_last }}
79+
80+ - name : Build docs and remove fonts that blow up the wheel size
81+ run : |
82+ python -m pip install Sphinx sphinx-rtd-theme sphinx-copybutton m2r
83+ cd docs
84+ make html
85+ cd build/html/_static/css/fonts
86+ find . -type f ! -name '*.ttf' -delete
87+ cd ../..
88+ rm -rf fonts
89+ cd ..
90+ rm -rf _sources
91+ cd ..
92+ rm -rf doctrees
93+ cd ../..
94+
95+ - name : Make sdist
96+ run : |
97+ python -m pip install --upgrade pip build cython setuptools setuptools-git-versioning
98+ python -m build --sdist --no-isolation
99+
100+ - name : Strip source codes
101+ run : |
102+ set -euo pipefail
103+ tar xf dist/diffpy_distanceprinter-*.tar.gz
104+ SRC_DIR=$(find . -maxdepth 1 -type d -name 'diffpy_distanceprinter-*' | head -n1)
105+ find "$SRC_DIR" -type f -name '*.c' -print0 \
106+ | xargs -0 perl -i.bak -0777 -pe 's{/\*.*?\*/}{}gs'
107+ find "$SRC_DIR" -type f -name '*.c.bak' -delete
108+ tar czf dist/"${SRC_DIR#./}".tar.gz "$SRC_DIR"
109+ rm -rf "$SRC_DIR"
110+
111+ - name : Upload sdist
112+ # GitHub officially-maintained actions
113+ uses : actions/upload-artifact@v4
114+ with :
115+ name : sdist
116+ path : dist/
117+ retention-days : 1
118+
119+ - name : Upload INSTRUCTIONS.txt
120+ uses : actions/upload-artifact@v4
121+ with :
122+ name : instructions
123+ path : INSTRUCTIONS.txt
124+
125+ build-wheels :
126+ needs : [build-sdist, get-python-versions]
127+
128+ name : Build wheels ${{ matrix.python }}-${{ matrix.buildplat }}
129+ runs-on : ${{ matrix.buildplat }}
130+ strategy :
131+ fail-fast : false
132+ matrix :
133+ buildplat :
134+ - ubuntu-latest
135+ - macos-14
136+ - windows-latest
137+ python : ${{ fromJSON(needs.get-python-versions.outputs.py_ver) }}
138+ steps :
139+ - name : Download sdist
140+ # GitHub officially-maintained actions
141+ uses : actions/download-artifact@v4
142+ with :
143+ name : sdist
144+ path : dist/
145+
146+ - name : Set up Python
147+ uses : actions/setup-python@v5
148+ with :
149+ python-version : ${{ matrix.python }}
150+
151+ - name : Build wheels
152+ run : |
153+ # setuptools-git-versioning only look into .git and PKG-INFO in the top directory
154+ which python; python --version
155+ which pip; pip --version
156+ python -m pip install --upgrade pip build cython setuptools setuptools-git-versioning
157+ tar xf dist/diffpy_distanceprinter-*.tar.gz
158+ cd diffpy_distanceprinter-*
159+ python -m pip wheel . --no-deps --no-build-isolation --wheel-dir ./../dist
160+
161+ - name : Upload wheels
162+ uses : actions/upload-artifact@v4
163+ with :
164+ name : wheels-${{ matrix.python }}-${{ matrix.buildplat }}
165+ path : dist/*.whl
166+
167+ test-wheels :
168+ needs : [build-wheels, get-python-versions]
169+
170+ name : Test wheels ${{ matrix.python }}-${{ matrix.buildplat }}
171+ runs-on : ${{ matrix.buildplat }}
172+ strategy :
173+ fail-fast : false
174+ matrix :
175+ buildplat :
176+ - ubuntu-latest
177+ - macos-14
178+ - windows-latest
179+ python : ${{ fromJson(needs.get-python-versions.outputs.py_ver) }}
180+ steps :
181+ - name : Checkout
182+ uses : actions/checkout@v4
183+
184+ - name : Download wheels
185+ uses : actions/download-artifact@v4
186+ with :
187+ name : wheels-${{ matrix.python }}-${{ matrix.buildplat }}
188+ path : dist/
189+
190+ - name : Set up Python
191+ uses : actions/setup-python@v5
192+ with :
193+ python-version : ${{ matrix.python }}
194+
195+ - name : Install wheels
196+ run : |
197+ python -m pip install --upgrade pip pytest setuptools-git-versioning
198+ python -m pip install dist/*.whl
199+
200+ - name : Assert no source files in installed package
201+ run : |
202+ # For debugging
203+ # touch $(python -c "import sysconfig, os; print(os.path.join(sysconfig.get_paths()['purelib'], 'diffpy/distanceprinter', 'fake.py'))")
204+ python - << 'EOF'
205+ import os, glob, sys, sysconfig
206+ sp = sysconfig.get_paths()['purelib']
207+ pkg = os.path.join(sp, 'diffpy', 'distanceprinter')
208+ patterns = [os.path.join(pkg, '*.py'),
209+ os.path.join(pkg, '*.c')]
210+ bad = []
211+ for p in patterns:
212+ bad.extend(glob.glob(p))
213+
214+ if bad:
215+ print("Found leftover source files in installed package:")
216+ for f in bad:
217+ print(" -", f)
218+ sys.exit(1)
219+
220+ print("No .py or .c files present in diffpy/distanceprinter/")
221+ EOF
222+
223+ - name : Run tests
224+ run : python -m pytest
225+
226+ release :
227+ needs : [test-wheels]
228+ uses : ./.github/workflows/release-github.yml
229+ secrets :
230+ PAT_TOKEN : ${{ secrets.PAT_TOKEN }}
0 commit comments