Skip to content

[Cross] Broadcast Refactor to 1-to-1 numpy match #41

[Cross] Broadcast Refactor to 1-to-1 numpy match

[Cross] Broadcast Refactor to 1-to-1 numpy match #41

name: Build and Release
on:
push:
branches: [ "master", "main" ]
tags: [ "v*" ]
pull_request:
branches: [ "master", "main" ]
workflow_dispatch:
permissions: write-all
env:
# Suppress noisy build warnings that clutter CI annotations.
# Uses %3B (URL-encoded semicolon) because MSBuild CLI treats raw ; and , as property separators.
# XML doc warnings (CS15xx, CS17xx): ~7,200 of ~8,700 total — malformed/missing doc comments
# CS8981: 'np' only contains lowercase chars — intentional for NumPy API compat
# NU5048: PackageIconUrl deprecated — cosmetic NuGet warning
DOTNET_NOWARN: CS1570%3BCS1571%3BCS1572%3BCS1573%3BCS1574%3BCS1587%3BCS1591%3BCS1711%3BCS1734%3BCS8981%3BNU5048
jobs:
test:
strategy:
fail-fast: false
matrix:
os: [ windows-latest, ubuntu-latest, macos-latest ]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
10.0.x
dotnet-quality: 'preview'
- name: Build
run: dotnet build test/NumSharp.UnitTest/NumSharp.UnitTest.csproj --configuration Release -p:NoWarn=${{ env.DOTNET_NOWARN }}
# NOTE: Test project currently only targets net10.0. See TODO in NumSharp.UnitTest.csproj
# to re-enable net8.0 when TUnit compatibility is resolved.
#
# Test filtering:
# - OpenBugs: excluded via --treenode-filter (known-failing bug reproductions)
# - WindowsOnly: auto-skipped at runtime via [SkipOnNonWindows] attribute
- name: Test (net10.0)
run: |
dotnet run --project test/NumSharp.UnitTest/NumSharp.UnitTest.csproj \
--configuration Release --no-build --framework net10.0 \
-- --treenode-filter '/*/*/*/*[Category!=OpenBugs]' --report-trx
- name: Upload Test Results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results-${{ matrix.os }}
path: ${{ github.workspace }}/**/TestResults/**/*.trx
retention-days: 5
build-nuget:
needs: test
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
10.0.x
dotnet-quality: 'preview'
- name: Get version info
id: version
shell: bash
run: |
VERSION="${GITHUB_REF#refs/tags/v}"
ASSEMBLY_VERSION="${VERSION%%-*}"
COMMIT_SHA="${GITHUB_SHA:0:7}"
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
echo "ASSEMBLY_VERSION=$ASSEMBLY_VERSION" >> $GITHUB_OUTPUT
echo "COMMIT_SHA=$COMMIT_SHA" >> $GITHUB_OUTPUT
echo "Building version $VERSION (assembly: $ASSEMBLY_VERSION) +$COMMIT_SHA"
- name: Build
run: |
dotnet build src/NumSharp.Core/NumSharp.Core.csproj \
--configuration Release \
-p:NoWarn=${{ env.DOTNET_NOWARN }} \
-p:Version=${{ steps.version.outputs.VERSION }} \
-p:AssemblyVersion=${{ steps.version.outputs.ASSEMBLY_VERSION }} \
-p:FileVersion=${{ steps.version.outputs.ASSEMBLY_VERSION }} \
-p:PackageVersion=${{ steps.version.outputs.VERSION }} \
-p:SourceRevisionId=${{ steps.version.outputs.COMMIT_SHA }}
dotnet build src/NumSharp.Bitmap/NumSharp.Bitmap.csproj \
--configuration Release \
-p:NoWarn=${{ env.DOTNET_NOWARN }} \
-p:Version=${{ steps.version.outputs.VERSION }} \
-p:AssemblyVersion=${{ steps.version.outputs.ASSEMBLY_VERSION }} \
-p:FileVersion=${{ steps.version.outputs.ASSEMBLY_VERSION }} \
-p:PackageVersion=${{ steps.version.outputs.VERSION }} \
-p:SourceRevisionId=${{ steps.version.outputs.COMMIT_SHA }}
- name: Pack
run: |
mkdir -p artifacts/nuget
dotnet pack src/NumSharp.Core/NumSharp.Core.csproj \
--configuration Release \
--no-build \
--output artifacts/nuget \
-p:NoWarn=${{ env.DOTNET_NOWARN }} \
-p:Version=${{ steps.version.outputs.VERSION }} \
-p:AssemblyVersion=${{ steps.version.outputs.ASSEMBLY_VERSION }} \
-p:FileVersion=${{ steps.version.outputs.ASSEMBLY_VERSION }} \
-p:PackageVersion=${{ steps.version.outputs.VERSION }}
dotnet pack src/NumSharp.Bitmap/NumSharp.Bitmap.csproj \
--configuration Release \
--no-build \
--output artifacts/nuget \
-p:NoWarn=${{ env.DOTNET_NOWARN }} \
-p:Version=${{ steps.version.outputs.VERSION }} \
-p:AssemblyVersion=${{ steps.version.outputs.ASSEMBLY_VERSION }} \
-p:FileVersion=${{ steps.version.outputs.ASSEMBLY_VERSION }} \
-p:PackageVersion=${{ steps.version.outputs.VERSION }}
echo "Packages built:"
ls -la artifacts/nuget/
- name: Upload NuGet Packages
uses: actions/upload-artifact@v4
with:
name: nuget-packages
path: artifacts/nuget/*.nupkg
retention-days: 5
create-release:
needs: build-nuget
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Extract version
id: version
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
- name: Download NuGet Packages
uses: actions/download-artifact@v4
with:
name: nuget-packages
path: artifacts
- name: Generate checksums
run: |
cd artifacts
for f in *.nupkg; do
sha256sum "$f" | cut -d' ' -f1 > "${f}.sha256"
echo "${f}: $(cat ${f}.sha256)"
done
- name: Check if prerelease
id: prerelease
run: |
if [[ "${{ steps.version.outputs.VERSION }}" == *"-"* ]]; then
echo "IS_PRERELEASE=true" >> $GITHUB_OUTPUT
else
echo "IS_PRERELEASE=false" >> $GITHUB_OUTPUT
fi
- name: Create Release
uses: softprops/action-gh-release@v2
with:
files: |
artifacts/*.nupkg
artifacts/*.sha256
draft: false
prerelease: ${{ steps.prerelease.outputs.IS_PRERELEASE }}
generate_release_notes: true
body: |
## NumSharp v${{ steps.version.outputs.VERSION }}
### Install via NuGet
```
dotnet add package NumSharp --version ${{ steps.version.outputs.VERSION }}
dotnet add package NumSharp.Bitmap --version ${{ steps.version.outputs.VERSION }}
```
### Packages
| Package | NuGet |
|---------|-------|
| NumSharp | [![NuGet](https://img.shields.io/nuget/v/NumSharp.svg)](https://www.nuget.org/packages/NumSharp/${{ steps.version.outputs.VERSION }}) |
| NumSharp.Bitmap | [![NuGet](https://img.shields.io/nuget/v/NumSharp.Bitmap.svg)](https://www.nuget.org/packages/NumSharp.Bitmap/${{ steps.version.outputs.VERSION }}) |
publish-nuget:
needs: build-nuget
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
steps:
- name: Download NuGet Packages
uses: actions/download-artifact@v4
with:
name: nuget-packages
path: artifacts
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Push to NuGet
run: |
for package in artifacts/*.nupkg; do
echo "Pushing $package..."
dotnet nuget push "$package" \
--api-key ${{ secrets.NUGETAPIKEY }} \
--source https://api.nuget.org/v3/index.json \
--skip-duplicate
done