Skip to content
Merged

wip #30

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 29 additions & 7 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
@@ -1,28 +1,50 @@
# This workflow will build a .NET project
# This workflow will build and test a .NET project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net

name: .NET
name: .NET CI

on:
push:
branches: [ "*" ]
branches: [ main, develop ]
pull_request:
branches: [ "*" ]
branches: [ main, develop ]

jobs:
build:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x

- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
restore-keys: |
${{ runner.os }}-nuget-

- name: Restore dependencies
run: dotnet restore

- name: Build
run: dotnet build --no-restore
run: dotnet build --no-restore --configuration Release

- name: Test
run: dotnet test --no-build --verbosity normal
run: dotnet test --no-build --configuration Release --verbosity normal

- name: Code Coverage
run: dotnet test --no-build --configuration Release --collect:"XPlat Code Coverage" --results-directory ./TestResults

- name: Upload coverage reports
uses: actions/upload-artifact@v4
if: always()
with:
name: coverage-reports
path: ./TestResults/**/coverage.cobertura.xml
retention-days: 30
282 changes: 282 additions & 0 deletions .github/workflows/nuget-publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,282 @@
name: NuGet Publish

on:
push:
branches: [ master, develop ]
tags: [ '*' ]
workflow_dispatch:
inputs:
version:
description: 'Override version (optional)'
required: false
type: string
environment:
description: 'Publish environment'
required: false
default: 'auto'
type: choice
options:
- auto
- staging
- production
create_release:
description: 'Create GitHub release (production only)'
required: false
type: boolean
default: false
release_notes:
description: 'Release notes'
required: false
type: string

env:
DOTNET_VERSION: 10.0.x
NUGET_SOURCE: https://api.nuget.org/v3/index.json

jobs:
build:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.setup.outputs.version }}
is-nightly: ${{ steps.setup.outputs.is-nightly }}
is-release: ${{ steps.setup.outputs.is-release }}
should-publish: ${{ steps.setup.outputs.should-publish }}
environment: ${{ steps.setup.outputs.environment }}
create-release: ${{ steps.setup.outputs.create-release }}

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}

- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
restore-keys: |
${{ runner.os }}-nuget-

- name: Restore dependencies
run: dotnet restore

- name: Build
run: dotnet build --no-restore --configuration Release

- name: Test
run: dotnet test --no-build --configuration Release --verbosity normal

- name: Setup version and publishing strategy
id: setup
uses: actions/github-script@v7
with:
script: |
const core = require('@actions/core');

// Get current context
const ref = context.ref;
const eventName = context.eventName;
const inputs = context.payload.inputs || {};

// Initialize variables
let version = '';
let isNightly = false;
let isRelease = false;
let shouldPublish = false;
let environment = 'auto';
let createRelease = false;

// Handle manual override
if (inputs.version) {
version = inputs.version;
environment = inputs.environment || 'auto';
isNightly = version.includes('nightly');
isRelease = !isNightly && !version.includes('preview');
shouldPublish = true;
createRelease = inputs.create_release === true && isRelease;
} else {
// Automatic version detection
if (ref === 'refs/heads/develop') {
// Nightly builds for develop branch
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
const commitSha = context.sha.substring(0, 7);
version = `1.0.0-nightly-${timestamp}-${commitSha}`;
isNightly = true;
shouldPublish = true;
environment = 'nightly';
} else if (ref.startsWith('refs/tags/')) {
// Release from git tag
version = ref.replace('refs/tags/v', '');
version = ref.replace('refs/tags/', '');
isRelease = true;
shouldPublish = true;
environment = 'production';
// Create GitHub release for all tags
createRelease = true;
} else if (eventName === 'release') {
// Release from GitHub release
version = context.payload.release.tag_name;
isRelease = true;
shouldPublish = true;
environment = 'production';
} else if (ref === 'refs/heads/main') {
// Main branch builds (preview versions)
version = `1.0.0-preview-${context.runNumber}`;
environment = 'staging';
shouldPublish = false; // Don't auto-publish from main
}
}

// Resolve auto environment
if (environment === 'auto') {
environment = isNightly ? 'nightly' : isRelease ? 'production' : 'staging';
}

// Validate version format (basic check)
if (!version.match(/^\d+\.\d+\.\d+(-[\w\.\-]+)?$/)) {
core.setFailed(`Invalid version format: ${version}`);
return;
}

// Set outputs
core.setOutput('version', version);
core.setOutput('is-nightly', isNightly);
core.setOutput('is-release', isRelease);
core.setOutput('should-publish', shouldPublish);
core.setOutput('environment', environment);
core.setOutput('create-release', createRelease && ref.startsWith('refs/tags/'));

// Log information
console.log(`Version: ${version}`);
console.log(`Is Nightly: ${isNightly}`);
console.log(`Is Release: ${isRelease}`);
console.log(`Should Publish: ${shouldPublish}`);
console.log(`Environment: ${environment}`);
console.log(`Create Release: ${createRelease}`);

- name: Pack
run: |
dotnet pack Netorrent/Netorrent.csproj \
--configuration Release \
--output ./artifacts \
-p:PackageVersion=${{ steps.setup.outputs.version }} \
-p:ContinuousIntegrationBuild=true \
-p:IncludeSymbols=true

- name: Validate packages
run: |
dotnet nuget verify ./artifacts/*.nupkg --all
dotnet nuget verify ./artifacts/*.snupkg --all

- name: List packages
if: steps.setup.outputs.should-publish == 'true'
run: |
echo "Generated packages:"
ls -la ./artifacts/ || echo "No artifacts found"

- name: Upload artifacts
uses: actions/upload-artifact@v4
if: steps.setup.outputs.should-publish == 'true'
with:
name: nuget-packages-${{ steps.setup.outputs.version }}
path: ./artifacts/*.nupkg
retention-days: ${{ steps.setup.outputs.is-nightly == 'true' && '30' || '90' }}

publish:
needs: build
runs-on: ubuntu-latest
if: needs.build.outputs.should-publish == 'true'
environment: ${{ needs.build.outputs.environment }}

steps:
- name: Download artifacts
uses: actions/download-artifact@v4
with:
name: nuget-packages-${{ needs.build.outputs.version }}
path: ./artifacts

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}

- name: Publish to NuGet
run: |
dotnet nuget push ./artifacts/*.nupkg \
--source ${{ env.NUGET_SOURCE }} \
--api-key ${{ secrets.NUGET_API_KEY }} \
--skip-duplicate
env:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}

- name: Publish symbols
run: |
dotnet nuget push ./artifacts/*.snupkg \
--source ${{ env.NUGET_SOURCE }} \
--api-key ${{ secrets.NUGET_API_KEY }} \
--skip-duplicate
env:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}

- name: Create GitHub Release
if: needs.build.outputs.create-release == 'true'
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ needs.build.outputs.version }}
release_name: Release ${{ needs.build.outputs.version }}
body: |
## 📦 Package Information
- **Version**: `${{ needs.build.outputs.version }}`
- **NuGet**: [Netorrent.${{ needs.build.outputs.version }}](https://www.nuget.org/packages/Netorrent/${{ needs.build.outputs.version }})
- **Installation**: `dotnet add package Netorrent --version ${{ needs.build.outputs.version }}`

${{ github.event.inputs.release_notes || '' }}

---

🤖 *This release was automatically generated. Check [Actions](https://github.com/${{ github.repository }}/actions) for build details.*
draft: false
prerelease: ${{ contains(needs.build.outputs.version, 'nightly') || contains(needs.build.outputs.version, 'preview') || contains(needs.build.outputs.version, 'rc') }}

- name: Upload release assets
if: needs.build.outputs.create-release == 'true'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const path = require('path');

const version = '${{ needs.build.outputs.version }}';
const artifactsDir = './artifacts';

// Get release ID
const { data: release } = await github.rest.repos.getReleaseByTag({
owner: context.repo.owner,
repo: context.repo.repo,
tag: version
});

// Upload all .nupkg and .snupkg files
const files = fs.readdirSync(artifactsDir)
.filter(file => file.endsWith('.nupkg') || file.endsWith('.snupkg'));

for (const file of files) {
const filePath = path.join(artifactsDir, file);
const fileData = fs.readFileSync(filePath);

await github.rest.repos.uploadReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: release.id,
name: file,
data: fileData
});
}

18 changes: 16 additions & 2 deletions Netorrent/Netorrent.csproj
Original file line number Diff line number Diff line change
@@ -1,11 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<IsAotCompatible>true</IsAotCompatible>
<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
<Nullable>enable</Nullable>
<!-- NuGet Package Metadata -->
<PackageId>Netorrent</PackageId>
<Authors>Your Name</Authors>
<Description>A .NET library for torrent operations with support for peer-to-peer networking</Description>
<RepositoryUrl>https://github.com/yourusername/Netorrent</RepositoryUrl>
<PackageProjectUrl>https://github.com/yourusername/Netorrent</PackageProjectUrl>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageTags>torrent;dotnet;networking;p2p;filesharing;bittorrent</PackageTags>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<RepositoryType>git</RepositoryType>
<Copyright>Copyright © 2025</Copyright>
</PropertyGroup>
<PropertyGroup>
<WarningsAsErrors>CS8600;CS8602;CS8603;CS8604;CS8618;CS8625</WarningsAsErrors>
Expand Down
Loading