Skip to content

v0.3.0

v0.3.0 #71

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 .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: ~/.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 Release
if: steps.check_changes.outputs.run_release == 'true' && steps.compare_versions.outputs.VERSION_CHANGED == 'true'
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: v${{ steps.get_version.outputs.CURRENT_VERSION }}
release_name: Release ${{ steps.get_version.outputs.CURRENT_VERSION }}
draft: false
prerelease: true
- name: Upload Release Asset
if: steps.check_changes.outputs.run_release == 'true' && steps.compare_versions.outputs.VERSION_CHANGED == 'true'
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./${{ env.NUGET_PACKAGE_NAME }}.${{ steps.get_version.outputs.CURRENT_VERSION }}.nupkg
asset_name: ${{ env.NUGET_PACKAGE_NAME }}.${{ steps.get_version.outputs.CURRENT_VERSION }}.nupkg
asset_content_type: application/octet-stream
- 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"