-
Notifications
You must be signed in to change notification settings - Fork 0
597 lines (508 loc) · 24.2 KB
/
release.yml
File metadata and controls
597 lines (508 loc) · 24.2 KB
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
# =============================================================================
# SochDB Python SDK Release Pipeline
# =============================================================================
#
# WORKFLOW FLOW:
#
# ┌─────────────────────────────────────────────────────────────────┐
# │ 1. Download binaries from sochdb/sochdb + Build (PARALLEL) │
# ├─────────────────────────────────────────────────────────────────┤
# │ ├─ build-wheel (Linux x86_64) → downloads binary + builds │
# │ ├─ build-wheel (macOS ARM64) → downloads binary + builds │
# │ ├─ build-wheel (Windows x64) → downloads binary + builds │
# │ └─ build-sdist → builds source distribution │
# └─────────────────────────────────────────────────────────────────┘
# ↓
# ┌─────────────────────────────────────────────────────────────────┐
# │ 2. Publish packages (PARALLEL) │
# ├─────────────────────────────────────────────────────────────────┤
# │ ├─ create-release → Creates GitHub release + attaches wheels │
# │ └─ publish → Uploads wheels to PyPI │
# └─────────────────────────────────────────────────────────────────┘
# ↓
# ┌─────────────────────────────────────────────────────────────────┐
# │ 3. summary → Shows comprehensive status │
# └─────────────────────────────────────────────────────────────────┘
#
# This workflow packages pre-built SochDB binaries into Python wheels.
#
# IMPORTANT: This SDK pulls pre-compiled binaries from the main SochDB
# repository (sochdb/sochdb) and wraps them in Python wheels. Each wheel
# contains platform-specific binaries:
# - sochdb-bulk (CLI tool for bulk operations)
# - sochdb-server (standalone server)
# - sochdb-grpc-server (gRPC server)
# - libsochdb_storage.* (FFI library)
# - libsochdb_index.* (FFI library)
#
# The version input MUST match an existing release in sochdb/sochdb repo.
#
# Platforms supported:
# - Linux x86_64 (manylinux_2_17)
# - macOS ARM64 (Apple Silicon)
# - Windows x64
#
# Python versions supported: 3.9, 3.10, 3.11, 3.12, 3.13
#
# =============================================================================
# REQUIRED SETUP:
# =============================================================================
#
# PyPI - NO TOKEN NEEDED!
# Uses OIDC Trusted Publisher (configure at PyPI project settings)
# https://pypi.org/manage/project/sochdb-client/settings/publishing/
#
# GitHub Releases - Requires write permission
# Uses GITHUB_TOKEN with contents: write permission
#
# =============================================================================
name: Release
on:
workflow_dispatch:
inputs:
version:
description: 'Toondb-client release version (e.g., 0.3.1)'
required: true
type: string
sochdb_version:
description: 'Toondb release version (e.g., 0.3.1) - MUST match an existing sochdb/sochdb release tag'
required: false
type: string
dry_run:
description: 'Dry run (validate without publishing)'
required: false
default: false
type: boolean
env:
SOCHDB_REPO: sochdb/sochdb
jobs:
# ===========================================================================
# Build Python Wheels (All Platforms)
# ===========================================================================
build-wheel:
name: Build Wheel (${{ matrix.target }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
wheel_platform: manylinux_2_17_x86_64
archive_ext: tar.gz
- os: macos-latest
target: aarch64-apple-darwin
wheel_platform: macosx_11_0_arm64
archive_ext: tar.gz
- os: windows-latest
target: x86_64-pc-windows-msvc
wheel_platform: win_amd64
archive_ext: zip
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Create directory structure
shell: bash
run: |
mkdir -p src/sochdb/_bin/${{ matrix.target }}
mkdir -p src/sochdb/lib/${{ matrix.target }}
- name: Download binaries from main SochDB release
shell: bash
run: |
# Use sochdb_version if provided, otherwise use version
VERSION="${{ inputs.sochdb_version }}"
if [ -z "$VERSION" ]; then
VERSION="${{ inputs.version }}"
fi
TAG="v${VERSION}"
TARGET="${{ matrix.target }}"
if [ "${{ matrix.archive_ext }}" = "zip" ]; then
ASSET_NAME="sochdb-${VERSION}-${TARGET}.zip"
else
ASSET_NAME="sochdb-${VERSION}-${TARGET}.tar.gz"
fi
DOWNLOAD_URL="https://github.com/${{ env.SOCHDB_REPO }}/releases/download/${TAG}/${ASSET_NAME}"
echo "Downloading SochDB binaries from main repository:"
echo " Repository: ${{ env.SOCHDB_REPO }}"
echo " Version: ${VERSION}"
echo " URL: $DOWNLOAD_URL"
curl -L -f -o release-archive.${{ matrix.archive_ext }} "$DOWNLOAD_URL"
# Extract the archive
if [ "${{ matrix.archive_ext }}" = "zip" ]; then
unzip -o release-archive.zip
else
tar -xzf release-archive.tar.gz
fi
ls -la
ls -la ${TARGET}/ || true
- name: Copy binaries and libraries to SDK (Unix)
if: matrix.os != 'windows-latest'
shell: bash
run: |
TARGET="${{ matrix.target }}"
# Copy binaries to _bin/
cp ${TARGET}/sochdb-bulk src/sochdb/_bin/${TARGET}/ 2>/dev/null || \
find . -maxdepth 2 -name "sochdb-bulk" -type f -exec cp {} src/sochdb/_bin/${TARGET}/ \;
cp ${TARGET}/sochdb-server src/sochdb/_bin/${TARGET}/ 2>/dev/null || \
find . -maxdepth 2 -name "sochdb-server" -type f -exec cp {} src/sochdb/_bin/${TARGET}/ \;
cp ${TARGET}/sochdb-grpc-server src/sochdb/_bin/${TARGET}/ 2>/dev/null || \
find . -maxdepth 2 -name "sochdb-grpc-server" -type f -exec cp {} src/sochdb/_bin/${TARGET}/ \;
# Copy shared libraries to lib/
cp ${TARGET}/libsochdb_storage* src/sochdb/lib/${TARGET}/ 2>/dev/null || \
find . -maxdepth 2 -name "libsochdb_storage*" -type f -exec cp {} src/sochdb/lib/${TARGET}/ \;
cp ${TARGET}/libsochdb_index* src/sochdb/lib/${TARGET}/ 2>/dev/null || \
find . -maxdepth 2 -name "libsochdb_index*" -type f -exec cp {} src/sochdb/lib/${TARGET}/ \;
# Make executables
chmod +x src/sochdb/_bin/${TARGET}/* 2>/dev/null || true
chmod +x src/sochdb/lib/${TARGET}/* 2>/dev/null || true
echo "=== Binaries ==="
ls -la src/sochdb/_bin/${TARGET}/
echo "=== Libraries ==="
ls -la src/sochdb/lib/${TARGET}/
- name: Copy binaries and libraries to SDK (Windows)
if: matrix.os == 'windows-latest'
shell: bash
run: |
TARGET="${{ matrix.target }}"
# Copy binaries to _bin/ (no sochdb-server on Windows)
cp ${TARGET}/sochdb-bulk.exe src/sochdb/_bin/${TARGET}/ 2>/dev/null || \
find . -maxdepth 2 -name "sochdb-bulk.exe" -type f -exec cp {} src/sochdb/_bin/${TARGET}/ \;
cp ${TARGET}/sochdb-grpc-server.exe src/sochdb/_bin/${TARGET}/ 2>/dev/null || \
find . -maxdepth 2 -name "sochdb-grpc-server.exe" -type f -exec cp {} src/sochdb/_bin/${TARGET}/ \;
# Copy shared libraries (DLLs) to lib/
cp ${TARGET}/sochdb_storage.dll src/sochdb/lib/${TARGET}/ 2>/dev/null || \
find . -maxdepth 2 -name "sochdb_storage.dll" -type f -exec cp {} src/sochdb/lib/${TARGET}/ \;
cp ${TARGET}/sochdb_index.dll src/sochdb/lib/${TARGET}/ 2>/dev/null || \
find . -maxdepth 2 -name "sochdb_index.dll" -type f -exec cp {} src/sochdb/lib/${TARGET}/ \;
echo "=== Binaries ==="
ls -la src/sochdb/_bin/${TARGET}/
echo "=== Libraries ==="
ls -la src/sochdb/lib/${TARGET}/
- name: Update package version
shell: bash
run: |
sed -i.bak 's/version = ".*"/version = "${{ inputs.version }}"/' pyproject.toml
rm -f pyproject.toml.bak
grep "version" pyproject.toml | head -1
- name: Build wheel
run: |
pip install build wheel
python -m build --wheel
- name: Rename wheel with correct platform tag
shell: bash
run: |
cd dist
for f in *-py3-none-any.whl; do
if [ -f "$f" ]; then
newname=$(echo $f | sed 's/-py3-none-any/-py3-none-${{ matrix.wheel_platform }}/')
mv "$f" "$newname"
fi
done
ls -la
- name: Upload wheel artifact
uses: actions/upload-artifact@v4
with:
name: wheel-${{ matrix.target }}
path: dist/*.whl
retention-days: 5
# ===========================================================================
# Build Source Distribution
# ===========================================================================
build-sdist:
name: Build Source Distribution
runs-on: ubuntu-latest
strategy:
matrix:
include:
- target: x86_64-unknown-linux-gnu
archive_ext: tar.gz
- target: aarch64-apple-darwin
archive_ext: tar.gz
- target: x86_64-pc-windows-msvc
archive_ext: zip
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Create directory structure
run: |
mkdir -p src/sochdb/_bin/${{ matrix.target }}
mkdir -p src/sochdb/lib/${{ matrix.target }}
- name: Download binaries from main SochDB release
shell: bash
run: |
# Use sochdb_version if provided, otherwise use version
VERSION="${{ inputs.sochdb_version }}"
if [ -z "$VERSION" ]; then
VERSION="${{ inputs.version }}"
fi
TAG="v${VERSION}"
TARGET="${{ matrix.target }}"
if [ "${{ matrix.archive_ext }}" = "zip" ]; then
ASSET_NAME="sochdb-${VERSION}-${TARGET}.zip"
else
ASSET_NAME="sochdb-${VERSION}-${TARGET}.tar.gz"
fi
DOWNLOAD_URL="https://github.com/${{ env.SOCHDB_REPO }}/releases/download/${TAG}/${ASSET_NAME}"
echo "Downloading SochDB binaries for sdist:"
echo " URL: $DOWNLOAD_URL"
curl -L -f -o release-archive.${{ matrix.archive_ext }} "$DOWNLOAD_URL"
# Extract the archive
if [ "${{ matrix.archive_ext }}" = "zip" ]; then
unzip -o release-archive.zip
else
tar -xzf release-archive.tar.gz
fi
- name: Copy binaries to SDK
shell: bash
run: |
TARGET="${{ matrix.target }}"
# Copy binaries
if [ "$TARGET" = "x86_64-pc-windows-msvc" ]; then
# Windows binaries
find . -maxdepth 2 -name "sochdb-bulk.exe" -type f -exec cp {} src/sochdb/_bin/${TARGET}/ \;
find . -maxdepth 2 -name "sochdb-grpc-server.exe" -type f -exec cp {} src/sochdb/_bin/${TARGET}/ \;
find . -maxdepth 2 -name "sochdb_storage.dll" -type f -exec cp {} src/sochdb/lib/${TARGET}/ \;
find . -maxdepth 2 -name "sochdb_index.dll" -type f -exec cp {} src/sochdb/lib/${TARGET}/ \;
else
# Unix binaries
find . -maxdepth 2 -name "sochdb-bulk" -type f -exec cp {} src/sochdb/_bin/${TARGET}/ \;
find . -maxdepth 2 -name "sochdb-server" -type f -exec cp {} src/sochdb/_bin/${TARGET}/ \; || true
find . -maxdepth 2 -name "sochdb-grpc-server" -type f -exec cp {} src/sochdb/_bin/${TARGET}/ \;
find . -maxdepth 2 -name "libsochdb_storage*" -type f -exec cp {} src/sochdb/lib/${TARGET}/ \;
find . -maxdepth 2 -name "libsochdb_index*" -type f -exec cp {} src/sochdb/lib/${TARGET}/ \;
chmod +x src/sochdb/_bin/${TARGET}/* 2>/dev/null || true
fi
echo "=== Binaries for ${TARGET} ==="
ls -la src/sochdb/_bin/${TARGET}/ 2>/dev/null || echo "No binaries"
echo "=== Libraries for ${TARGET} ==="
ls -la src/sochdb/lib/${TARGET}/ 2>/dev/null || echo "No libraries"
- name: Update package version
run: |
sed -i 's/version = ".*"/version = "${{ inputs.version }}"/' pyproject.toml
- name: Build sdist (only first target)
if: matrix.target == 'x86_64-unknown-linux-gnu'
run: |
pip install build
python -m build --sdist
- name: Upload sdist artifact
if: matrix.target == 'x86_64-unknown-linux-gnu'
uses: actions/upload-artifact@v4
with:
name: sdist
path: dist/*.tar.gz
retention-days: 5
# ===========================================================================
# Create GitHub Release
# ===========================================================================
create-release:
name: Create GitHub Release
runs-on: ubuntu-latest
needs: [build-wheel, build-sdist]
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: dist/
merge-multiple: true
- name: List release packages
run: |
echo "=== Packages for release ==="
ls -la dist/
echo ""
echo "Total packages: $(ls dist/ | wc -l)"
- name: Generate release notes
id: release_notes
run: |
cat > release_notes.md << 'EOF'
## SochDB Python SDK v${{ inputs.version }}
Python SDK wrapping pre-built binaries from [sochdb/sochdb v${{ inputs.sochdb_version || inputs.version }}](https://github.com/sochdb/sochdb/releases/tag/v${{ inputs.sochdb_version || inputs.version }})
### Installation
```bash
pip install sochdb==${{ inputs.version }}
```
### What's Included
This release contains platform-specific wheels with pre-compiled SochDB binaries:
- **sochdb-bulk**: CLI tool for bulk data operations
- **sochdb-server**: Standalone database server
- **sochdb-grpc-server**: gRPC server implementation
- **libsochdb_storage**: Native storage FFI library
- **libsochdb_index**: Native indexing FFI library
### Supported Platforms
- ✅ **Linux x86_64** (manylinux_2_17_x86_64)
- ✅ **macOS ARM64** (Apple Silicon, macosx_11_0_arm64)
- ✅ **Windows x64** (win_amd64)
### Python Version Support
- Python 3.9
- Python 3.10
- Python 3.11
- Python 3.12
- Python 3.13
### Package Contents
Each wheel includes:
- Python SDK code (`sochdb` package)
- Platform-specific binaries in `_bin/<platform>/`
- Shared libraries in `lib/<platform>/`
### Source Distribution
The source distribution (`.tar.gz`) is also available for custom builds, though binaries are not included and would need to be obtained separately from the main SochDB repository.
---
**Binary Source**: These Python wheels bundle pre-compiled binaries from the [SochDB main repository](https://github.com/sochdb/sochdb) release v${{ inputs.sochdb_version || inputs.version }}.
EOF
- name: Create GitHub Release
if: ${{ inputs.dry_run != true }}
uses: softprops/action-gh-release@v1
with:
tag_name: v${{ inputs.version }}
name: Release v${{ inputs.version }}
body_path: release_notes.md
draft: false
prerelease: false
files: dist/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Dry run - show what would be released
if: ${{ inputs.dry_run == true }}
run: |
echo "🔍 Dry run mode - GitHub release would be created with:"
echo ""
cat release_notes.md
echo ""
echo "=== Files to attach ==="
ls -lh dist/
# ===========================================================================
# Publish to PyPI (parallel with GitHub release creation)
# ===========================================================================
publish:
name: Publish to PyPI
runs-on: ubuntu-latest
needs: [build-wheel, build-sdist]
# Required for PyPI Trusted Publisher (OIDC) - no token needed!
permissions:
id-token: write
contents: read
steps:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: dist/
merge-multiple: true
- name: List packages
run: |
echo "=== Packages to upload ==="
ls -la dist/
if [ -z "$(ls -A dist/)" ]; then
echo "ERROR: No Python packages found!"
exit 1
fi
- name: Validate packages
run: |
pip install twine
twine check dist/*
- name: Publish to PyPI (Trusted Publisher)
if: ${{ inputs.dry_run != true }}
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: dist/
skip-existing: true
verbose: true
- name: Dry run validation
if: ${{ inputs.dry_run == true }}
run: |
echo "🔍 Dry run - packages validated but not uploaded"
echo "Packages:"
ls -la dist/
# ===========================================================================
# Release Summary
# ===========================================================================
summary:
name: Release Summary
runs-on: ubuntu-latest
needs: [build-wheel, build-sdist, create-release, publish]
if: always()
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: dist/
merge-multiple: true
- name: Generate comprehensive summary
run: |
echo "## 🎉 SochDB Python SDK v${{ inputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [ "${{ inputs.dry_run }}" = "true" ]; then
echo "**Mode:** 🧪 Dry Run (validation only - nothing published)" >> $GITHUB_STEP_SUMMARY
else
echo "**Mode:** 🚀 Production Release" >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📦 Binary Source" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
SOCHDB_VERSION="${{ inputs.sochdb_version }}"
if [ -z "$SOCHDB_VERSION" ]; then
SOCHDB_VERSION="${{ inputs.version }}"
fi
echo "**Binaries pulled from:** [sochdb/sochdb v${SOCHDB_VERSION}](https://github.com/${{ env.SOCHDB_REPO }}/releases/tag/v${SOCHDB_VERSION})" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "This Python SDK wraps pre-compiled binaries from the main SochDB repository." >> $GITHUB_STEP_SUMMARY
echo "Each wheel contains platform-specific:" >> $GITHUB_STEP_SUMMARY
echo "- \`sochdb-bulk\`, \`sochdb-server\`, \`sochdb-grpc-server\` (executables)" >> $GITHUB_STEP_SUMMARY
echo "- \`libsochdb_storage.*\`, \`libsochdb_index.*\` (FFI libraries)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📥 Installation" >> $GITHUB_STEP_SUMMARY
echo '```bash' >> $GITHUB_STEP_SUMMARY
echo "pip install sochdb-client==${{ inputs.version }}" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 🐍 Python Version Support" >> $GITHUB_STEP_SUMMARY
echo "Python 3.9 | 3.10 | 3.11 | 3.12 | 3.13" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 💻 Platform Support" >> $GITHUB_STEP_SUMMARY
echo "| Platform | Wheel Tag | Status |" >> $GITHUB_STEP_SUMMARY
echo "|----------|-----------|--------|" >> $GITHUB_STEP_SUMMARY
echo "| Linux x86_64 | manylinux_2_17_x86_64 | ✅ Built |" >> $GITHUB_STEP_SUMMARY
echo "| macOS ARM64 | macosx_11_0_arm64 | ✅ Built |" >> $GITHUB_STEP_SUMMARY
echo "| Windows x64 | win_amd64 | ✅ Built |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📦 Packages Created" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
ls -lh dist/ | tail -n +2 | awk '{printf "%-8s %s\n", $5, $9}'
echo '```' >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### ✅ Build Status" >> $GITHUB_STEP_SUMMARY
echo "| Job | Result |" >> $GITHUB_STEP_SUMMARY
echo "|-----|--------|" >> $GITHUB_STEP_SUMMARY
function status_icon() {
case "$1" in
success) echo "✅ Success" ;;
failure) echo "❌ Failed" ;;
cancelled) echo "⏸️ Cancelled" ;;
skipped) echo "⏭️ Skipped" ;;
*) echo "❔ $1" ;;
esac
}
echo "| Build Wheels | $(status_icon '${{ needs.build-wheel.result }}') |" >> $GITHUB_STEP_SUMMARY
echo "| Build Source Dist | $(status_icon '${{ needs.build-sdist.result }}') |" >> $GITHUB_STEP_SUMMARY
echo "| Create GitHub Release | $(status_icon '${{ needs.create-release.result }}') |" >> $GITHUB_STEP_SUMMARY
echo "| Publish to PyPI | $(status_icon '${{ needs.publish.result }}') |" >> $GITHUB_STEP_SUMMARY
if [ "${{ inputs.dry_run }}" != "true" ]; then
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 🔗 Links" >> $GITHUB_STEP_SUMMARY
echo "- 📦 [PyPI Package](https://pypi.org/project/sochdb-client/${{ inputs.version }}/)" >> $GITHUB_STEP_SUMMARY
echo "- 🏷️ [GitHub Release](https://github.com/${{ github.repository }}/releases/tag/v${{ inputs.version }})" >> $GITHUB_STEP_SUMMARY
echo "- 🔧 [Source Binaries](https://github.com/${{ env.SOCHDB_REPO }}/releases/tag/v${SOCHDB_VERSION})" >> $GITHUB_STEP_SUMMARY
fi