Skip to content

Bump golang.org/x/net from 0.23.0 to 0.38.0 in /src/D2Sharp/d2wrapper #87

Bump golang.org/x/net from 0.23.0 to 0.38.0 in /src/D2Sharp/d2wrapper

Bump golang.org/x/net from 0.23.0 to 0.38.0 in /src/D2Sharp/d2wrapper #87

name: Build, Package, and Release
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
permissions:
contents: write
packages: write
env:
DOTNET_VERSION: '8.0.x'
GO_VERSION: '1.22.2'
NUGET_PACKAGE_NAME: 'D2Sharp'
CI: true
jobs:
build:
strategy:
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Setup Dev Drive (Windows performance boost)
if: runner.os == 'Windows'
uses: samypr100/setup-dev-drive@v3
with:
drive-size: 8GB
drive-type: Fixed
drive-format: ReFS
- name: Configure Windows environment for performance
if: runner.os == 'Windows'
shell: bash
run: |
# Windows performance optimization: Use Dev Drive (E:) for I/O operations
# Article: https://chadgolden.com/blog/github-actions-windows-runners-slow
# Dev Drive provides 30x faster IOPS than C: drive
echo "DOTNET_INSTALL_DIR=E:\\tools\\dotnet" >> $GITHUB_ENV
echo "DOTNET_ROOT=E:\\tools\\dotnet" >> $GITHUB_ENV
echo "NUGET_PACKAGES=E:\\.nuget\\packages" >> $GITHUB_ENV
- name: Configure non-Windows environment
if: runner.os != 'Windows'
shell: bash
run: |
echo "NUGET_PACKAGES=$HOME/.nuget/packages" >> $GITHUB_ENV
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ${{ env.NUGET_PACKAGES }}
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Install GCC (Ubuntu)
if: matrix.os == 'ubuntu-latest'
run: sudo apt-get update && sudo apt-get install -y gcc
- name: Install dependencies
run: dotnet restore
- name: Build
run: dotnet build --configuration Release --no-restore
- name: Build native library for tests
shell: bash
run: |
cd src/D2Sharp/d2wrapper
# Determine library extension based on OS
if [ "${{ runner.os }}" == "Windows" ]; then
LIB_EXT="dll"
elif [ "${{ runner.os }}" == "macOS" ]; then
LIB_EXT="dylib"
else
LIB_EXT="so"
fi
# Build the native library
go build -buildmode=c-shared -o "d2wrapper.$LIB_EXT" .
# Copy to test output directory
mkdir -p ../../../tests/D2Sharp.Tests/bin/Debug/net8.0
cp "d2wrapper.$LIB_EXT" ../../../tests/D2Sharp.Tests/bin/Debug/net8.0/
- name: Test
run: dotnet test --no-restore --verbosity normal
- name: Test with Coverage
run: dotnet test --no-restore --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=./coverage/
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./tests/D2Sharp.Tests/coverage/coverage.cobertura.xml
flags: ${{ matrix.os }}
name: codecov-${{ matrix.os }}
fail_ci_if_error: false
token: ${{ secrets.CODECOV_TOKEN }}
- name: Build native library for packaging
shell: bash
run: |
cd src/D2Sharp/d2wrapper
# Determine library extension based on OS
if [ "${{ runner.os }}" == "Windows" ]; then
LIB_EXT="dll"
elif [ "${{ runner.os }}" == "macOS" ]; then
LIB_EXT="dylib"
else
LIB_EXT="so"
fi
# Build the native library for packaging
go build -buildmode=c-shared -o "d2wrapper.$LIB_EXT" .
- name: Upload D2Sharp build artifact
uses: actions/upload-artifact@v4.6.1
with:
name: d2net-${{ matrix.os }}
path: src/D2Sharp/bin/Release/net8.0/D2Sharp.*
- name: Upload native library
uses: actions/upload-artifact@v4.6.1
with:
name: d2wrapper-${{ matrix.os }}
path: src/D2Sharp/d2wrapper/d2wrapper*
- name: Upload build logs on failure
if: failure()
uses: actions/upload-artifact@v4.6.1
with:
name: build-logs-${{ matrix.os }}
path: |
**/*.log
**/*.trx
package:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Check for relevant changes
id: check_changes
run: |
if git diff --name-only HEAD^ HEAD | grep -qE '^src/|^examples/|\.csproj$|\.sln$|packages\.lock\.json$|go\.mod$|go\.sum$'; then
echo "Relevant changes detected"
echo "run_package=true" >> $GITHUB_OUTPUT
else
echo "No relevant changes detected"
echo "run_package=false" >> $GITHUB_OUTPUT
fi
- name: Setup .NET
if: steps.check_changes.outputs.run_package == 'true'
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Download artifacts
if: steps.check_changes.outputs.run_package == 'true'
uses: actions/download-artifact@v4.1.7
with:
path: artifacts
- name: Prepare native libraries for packaging
if: steps.check_changes.outputs.run_package == 'true'
run: |
mkdir -p src/D2Sharp/runtimes/win-x64/native
mkdir -p src/D2Sharp/runtimes/linux-x64/native
mkdir -p src/D2Sharp/runtimes/osx-x64/native
cp artifacts/d2wrapper-windows-latest/d2wrapper.dll src/D2Sharp/runtimes/win-x64/native/
cp artifacts/d2wrapper-ubuntu-latest/d2wrapper.so src/D2Sharp/runtimes/linux-x64/native/
cp artifacts/d2wrapper-macos-latest/d2wrapper.dylib src/D2Sharp/runtimes/osx-x64/native/
- name: Pack NuGet package
if: steps.check_changes.outputs.run_package == 'true'
run: dotnet pack src/D2Sharp/D2Sharp.csproj --configuration Release --output .
- name: Upload NuGet package
if: steps.check_changes.outputs.run_package == 'true'
uses: actions/upload-artifact@v4.6.1
with:
name: nuget-package
path: ./*.nupkg
- name: Skip packaging
if: steps.check_changes.outputs.run_package != 'true'
run: |
echo "No relevant changes for packaging, skipping this job"
release:
needs: package
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Check for relevant changes
id: check_changes
run: |
if git diff --name-only HEAD^ HEAD | grep -qE '^src/|^examples/|\.csproj$|\.sln$|packages\.lock\.json$|go\.mod$|go\.sum$'; then
echo "Relevant changes detected"
echo "run_release=true" >> $GITHUB_OUTPUT
else
echo "No relevant changes detected"
echo "run_release=false" >> $GITHUB_OUTPUT
fi
- name: Get current version
if: steps.check_changes.outputs.run_release == 'true'
id: get_version
run: |
VERSION=$(grep -oP '(?<=<VersionPrefix>).*(?=</VersionPrefix>)' src/D2Sharp/D2Sharp.csproj)
SUFFIX=$(grep -oP '(?<=<VersionSuffix>).*(?=</VersionSuffix>)' src/D2Sharp/D2Sharp.csproj)
if [ ! -z "$SUFFIX" ]; then
VERSION="$VERSION-$SUFFIX"
fi
echo "CURRENT_VERSION=$VERSION" >> $GITHUB_OUTPUT
- name: Get latest release version
if: steps.check_changes.outputs.run_release == 'true'
id: get_latest_release
run: |
LATEST_RELEASE=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r .tag_name | sed 's/^v//')
echo "LATEST_RELEASE=$LATEST_RELEASE" >> $GITHUB_OUTPUT
- name: Compare versions
if: steps.check_changes.outputs.run_release == 'true'
id: compare_versions
run: |
if [ "${{ steps.get_version.outputs.CURRENT_VERSION }}" != "${{ steps.get_latest_release.outputs.LATEST_RELEASE }}" ]; then
echo "VERSION_CHANGED=true" >> $GITHUB_OUTPUT
else
echo "VERSION_CHANGED=false" >> $GITHUB_OUTPUT
fi
- name: Download NuGet package
if: steps.check_changes.outputs.run_release == 'true' && steps.compare_versions.outputs.VERSION_CHANGED == 'true'
uses: actions/download-artifact@v4.1.7
with:
name: nuget-package
- name: Create or Update Release
if: steps.check_changes.outputs.run_release == 'true' && steps.compare_versions.outputs.VERSION_CHANGED == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
TAG="v${{ steps.get_version.outputs.CURRENT_VERSION }}"
PACKAGE="${{ env.NUGET_PACKAGE_NAME }}.${{ steps.get_version.outputs.CURRENT_VERSION }}.nupkg"
# Check if release exists
if ! gh release view "$TAG" >/dev/null 2>&1; then
echo "Creating new release $TAG"
gh release create "$TAG" \
--title "Release ${{ steps.get_version.outputs.CURRENT_VERSION }}" \
--prerelease \
--generate-notes
else
echo "Release $TAG already exists"
fi
# Upload asset (--clobber overwrites if exists)
echo "Uploading $PACKAGE to release $TAG"
gh release upload "$TAG" "$PACKAGE" --clobber
- name: Publish to NuGet
if: steps.check_changes.outputs.run_release == 'true' && steps.compare_versions.outputs.VERSION_CHANGED == 'true'
run: dotnet nuget push ./*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json
- name: Skip release
if: steps.check_changes.outputs.run_release != 'true'
run: |
echo "No relevant changes for release, skipping this job"