@@ -10,24 +10,123 @@ permissions:
1010 id-token : write
1111
1212jobs :
13- build-and-publish :
13+ build-wheels :
14+ name : Build native wheels
15+ continue-on-error : ${{ matrix.allow-failure == true }}
16+ strategy :
17+ fail-fast : false
18+ matrix :
19+ os : [ubuntu-latest, macos-14, windows-latest]
20+ python-version : ['3.12', '3.13']
21+ include :
22+ - os : ubuntu-latest
23+ python-version : ' 3.14'
24+ allow-failure : true
25+ runs-on : ${{ matrix.os }}
26+ steps :
27+ - name : Checkout repository
28+ uses : actions/checkout@v4
29+
30+ - name : Set up Rust
31+ uses : dtolnay/rust-toolchain@stable
32+
33+ - name : Set up Python
34+ uses : actions/setup-python@v5
35+ with :
36+ python-version : ${{ matrix.python-version }}
37+
38+ - name : Install build backend
39+ run : |
40+ python -m pip install --upgrade pip
41+ pip install build maturin
42+
43+ - name : Build wheels on Linux (manylinux2014 + zig)
44+ if : matrix.os == 'ubuntu-latest'
45+ run : |
46+ maturin build --release \
47+ --zig \
48+ --compatibility manylinux2014 \
49+ -m crates/codex_native/Cargo.toml \
50+ -i python \
51+ -o dist
52+
53+ - name : Build wheels on macOS/Windows
54+ if : matrix.os != 'ubuntu-latest'
55+ run : |
56+ maturin build --release -m crates/codex_native/Cargo.toml -i python -o dist
57+
58+ - name : Upload wheels
59+ uses : actions/upload-artifact@v4
60+ with :
61+ name : wheels-${{ matrix.os }}-${{ matrix.python-version }}
62+ path : dist/*.whl
63+
64+ build-sdist :
65+ name : Build sdist
1466 runs-on : ubuntu-latest
1567 steps :
16- - name : Check out repository
68+ - name : Checkout repository
1769 uses : actions/checkout@v4
1870
71+ - name : Set up Rust
72+ uses : dtolnay/rust-toolchain@stable
73+
1974 - name : Set up Python
2075 uses : actions/setup-python@v5
2176 with :
2277 python-version : ' 3.13'
2378
24- - name : Install uv
25- uses : astral-sh/setup-uv@v4
79+ - name : Install build tool
80+ run : |
81+ python -m pip install --upgrade pip
82+ pip install build maturin
83+
84+ - name : Build sdist (PEP 517)
85+ run : |
86+ python -m build --sdist
87+
88+ - name : Upload sdist
89+ uses : actions/upload-artifact@v4
2690 with :
27- version : latest
91+ name : sdist
92+ path : dist/*.tar.gz
2893
29- - name : Build distribution
30- run : uv build
94+ publish :
95+ name : Publish to PyPI (Trusted Publishing)
96+ needs : [build-wheels, build-sdist]
97+ runs-on : ubuntu-latest
98+ steps :
99+ - name : Download all artifacts
100+ uses : actions/download-artifact@v4
101+ with :
102+ path : dist
103+ # Merge all artifacts directly into dist/ so Twine finds files
104+ merge-multiple : true
105+
106+ - name : Flatten artifacts into dist/
107+ shell : bash
108+ run : |
109+ shopt -s globstar nullglob
110+ mkdir -p dist_flat
111+ for f in dist/**/*.whl dist/**/*.tar.gz; do
112+ mv "$f" dist_flat/
113+ done
114+ rm -rf dist
115+ mv dist_flat dist
31116
32- - name : Publish to PyPI (Trusted Publishing)
33- run : uv publish --trusted-publishing=always
117+ - name : Verify artifacts present
118+ shell : bash
119+ run : |
120+ shopt -s nullglob
121+ files=(dist/*.whl dist/*.tar.gz)
122+ if [ ${#files[@]} -eq 0 ]; then
123+ echo "No distribution files found in dist/" >&2
124+ exit 1
125+ fi
126+ echo "Found ${#files[@]} files:" && ls -al dist
127+
128+ - name : Publish to PyPI
129+ uses : pypa/gh-action-pypi-publish@release/v1
130+ with :
131+ packages-dir : dist
132+ skip-existing : true
0 commit comments