Skip to content

Commit 3f1ecc3

Browse files
authored
Add Dependabot configuration and seal target classes (#180)
* Add Dependabot configuration and enhance project metadata for better dependency management * Mark EventGridTarget and EventHubTarget classes as sealed to prevent inheritance * Add net10.0 target framework to project files for Azure extensions * Add .NET installation script to AppVeyor configuration * Add CI workflow configuration for build, pack, and test jobs * Replace msbuild commands with dotnet CLI for restore and pack steps in CI workflow * Remove .NET 10.0 and 8.0 setup steps from CI workflow * Add obj directory to build artifact paths and update .NET setup for pack and test jobs * Add caching for NuGet packages in CI workflow to improve build performance
1 parent 238a108 commit 3f1ecc3

File tree

13 files changed

+257
-8
lines changed

13 files changed

+257
-8
lines changed

.github/dependabot.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
version: 2
2+
updates:
3+
# Security updates only for NuGet packages
4+
- package-ecosystem: "nuget"
5+
directory: "/"
6+
schedule:
7+
interval: "weekly"
8+
# Only create PRs for security updates
9+
open-pull-requests-limit: 10
10+
# Group all security updates into a single PR when possible
11+
groups:
12+
security-updates:
13+
patterns:
14+
- "*"
15+
update-types:
16+
- "patch"
17+
- "minor"
18+
labels:
19+
- "dependencies"
20+
- "security"
21+
commit-message:
22+
prefix: "deps"
23+
prefix-development: "deps-dev"
24+
include: "scope"
25+
# Ignore major version updates to avoid breaking changes
26+
ignore:
27+
- dependency-name: "*"
28+
update-types: ["version-update:semver-major"]

.github/workflows/ci.yml

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [ master ]
6+
pull_request:
7+
branches: [ master ]
8+
9+
# Cancel in-progress runs for the same branch/PR
10+
concurrency:
11+
group: ${{ github.workflow }}-${{ github.ref }}
12+
cancel-in-progress: true
13+
14+
# Minimal permissions - security best practice
15+
permissions:
16+
contents: read
17+
18+
jobs:
19+
build:
20+
runs-on: windows-latest
21+
22+
steps:
23+
- uses: actions/checkout@v4
24+
25+
- name: Setup .NET 10.0
26+
uses: actions/setup-dotnet@v4
27+
with:
28+
dotnet-version: '10.0.x'
29+
30+
- name: Setup .NET 8.0
31+
uses: actions/setup-dotnet@v4
32+
with:
33+
dotnet-version: '8.0.x'
34+
35+
# Cache NuGet packages to speed up builds
36+
- name: Cache NuGet packages
37+
uses: actions/cache@v4
38+
with:
39+
path: ~/.nuget/packages
40+
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
41+
restore-keys: |
42+
${{ runner.os }}-nuget-
43+
44+
- name: Display .NET version
45+
run: dotnet --version
46+
47+
- name: Restore and Build
48+
run: dotnet build src\NLog.Extensions.AzureStorage.sln -c Release --verbosity minimal
49+
50+
- name: Upload build artifacts for matrix jobs
51+
uses: actions/upload-artifact@v4
52+
with:
53+
name: build-output
54+
path: |
55+
src\**\bin\Release\**
56+
src\**\obj\**
57+
test\**\bin\Release\**
58+
test\**\obj\**
59+
retention-days: 1
60+
61+
pack:
62+
needs: build
63+
runs-on: windows-latest
64+
strategy:
65+
matrix:
66+
project:
67+
- NLog.Extensions.AzureBlobStorage
68+
- NLog.Extensions.AzureDataTables
69+
- NLog.Extensions.AzureQueueStorage
70+
- NLog.Extensions.AzureEventGrid
71+
- NLog.Extensions.AzureEventHub
72+
- NLog.Extensions.AzureServiceBus
73+
74+
steps:
75+
- uses: actions/checkout@v4
76+
77+
- name: Setup .NET
78+
uses: actions/setup-dotnet@v4
79+
with:
80+
dotnet-version: |
81+
8.0.x
82+
10.0.x
83+
84+
- name: Cache NuGet packages
85+
uses: actions/cache@v4
86+
with:
87+
path: ~/.nuget/packages
88+
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
89+
restore-keys: |
90+
${{ runner.os }}-nuget-
91+
92+
- name: Download build artifacts
93+
uses: actions/download-artifact@v4
94+
with:
95+
name: build-output
96+
97+
- name: Pack ${{ matrix.project }}
98+
run: dotnet pack src\${{ matrix.project }} -c Release --no-build -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg -p:ContinuousIntegrationBuild=true -p:EmbedUntrackedSources=true -p:PublishRepositoryUrl=true --verbosity minimal
99+
100+
- name: Upload package
101+
uses: actions/upload-artifact@v4
102+
with:
103+
name: package-${{ matrix.project }}
104+
path: |
105+
src\${{ matrix.project }}\bin\Release\*.nupkg
106+
src\${{ matrix.project }}\bin\Release\*.snupkg
107+
retention-days: 90
108+
109+
test:
110+
needs: build
111+
runs-on: windows-latest
112+
strategy:
113+
matrix:
114+
project:
115+
- NLog.Extensions.AzureBlobStorage.Tests
116+
- NLog.Extensions.AzureDataTables.Tests
117+
- NLog.Extensions.AzureQueueStorage.Tests
118+
- NLog.Extensions.AzureEventGrid.Tests
119+
- NLog.Extensions.AzureEventHub.Tests
120+
- NLog.Extensions.AzureServiceBus.Tests
121+
122+
steps:
123+
- uses: actions/checkout@v4
124+
125+
- name: Setup .NET
126+
uses: actions/setup-dotnet@v4
127+
with:
128+
dotnet-version: |
129+
8.0.x
130+
10.0.x
131+
132+
- name: Cache NuGet packages
133+
uses: actions/cache@v4
134+
with:
135+
path: ~/.nuget/packages
136+
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
137+
restore-keys: |
138+
${{ runner.os }}-nuget-
139+
140+
- name: Download build artifacts
141+
uses: actions/download-artifact@v4
142+
with:
143+
name: build-output
144+
145+
- name: Test ${{ matrix.project }}
146+
run: dotnet test test\${{ matrix.project }} /p:Configuration=Release --verbosity minimal --no-build

DEPENDENCY_MANAGEMENT.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Dependency Management
2+
3+
## TL;DR
4+
5+
**Dependabot handles security updates automatically.** Just review PRs labeled `security` and merge if tests pass.
6+
7+
## How It Works
8+
9+
1. Dependabot scans weekly for security vulnerabilities
10+
2. Creates PRs automatically for security patches (ignores major version bumps)
11+
3. You review the PR (~5 min)
12+
4. Tests run in CI
13+
5. Merge if green
14+
6. Update version number in `.csproj` and add release note
15+
16+
## When to Update
17+
18+
**Security fixes** - Always
19+
⚠️ **New features** - Only if needed
20+
**Major versions** - Avoid unless necessary
21+
22+
## Quick Reference
23+
24+
### Approve a Dependabot PR
25+
26+
```bash
27+
# Tests run automatically in CI, but you can run locally:
28+
dotnet test test\NLog.Extensions.AzureBlobStorage.Tests /p:Configuration=Release
29+
dotnet test test\NLog.Extensions.AzureDataTables.Tests /p:Configuration=Release
30+
dotnet test test\NLog.Extensions.AzureQueueStorage.Tests /p:Configuration=Release
31+
dotnet test test\NLog.Extensions.AzureEventGrid.Tests /p:Configuration=Release
32+
dotnet test test\NLog.Extensions.AzureEventHub.Tests /p:Configuration=Release
33+
dotnet test test\NLog.Extensions.AzureServiceBus.Tests /p:Configuration=Release
34+
```
35+
36+
After merge: Bump version in affected `.csproj` files and update `<PackageReleaseNotes>`.
37+
38+
### Check for Vulnerabilities Manually
39+
40+
```bash
41+
dotnet list package --vulnerable
42+
```
43+
44+
### GitHub Settings
45+
46+
Enable these notifications:
47+
48+
- Dependabot alerts (Settings → Security)
49+
- PRs labeled `security`
50+
51+
## Versioning
52+
53+
- **Patch** (x.y.Z): Security fixes, dependency updates
54+
- **Minor** (x.Y.0): New features
55+
- **Major** (X.0.0): Breaking changes (rare)
56+
57+
## Time Commitment
58+
59+
- **Most months**: 0 minutes (no security issues)
60+
- **Security update**: 10-15 minutes (review + merge PR)
61+
- **Quarterly check**: Optional

appveyor.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@ version: 1.0.{build}
22
image: Visual Studio 2022
33
configuration: Release
44

5+
install:
6+
- ps: |
7+
Invoke-WebRequest -Uri 'https://dot.net/v1/dotnet-install.ps1' -UseBasicParsing -OutFile "$env:temp\dotnet-install.ps1"
8+
& $env:temp\dotnet-install.ps1 -Architecture x64 -Version '10.0.100' -InstallDir "$env:ProgramFiles\dotnet"
9+
10+
before_build:
11+
- cmd: dotnet --version
12+
513
build_script:
614
- cmd: msbuild /t:Restore src\NLog.Extensions.AzureStorage.sln /p:Configuration=Release /p:IncludeSymbols=true /p:SymbolPackageFormat=snupkg /p:ContinuousIntegrationBuild=true /p:EmbedUntrackedSources=true /p:PublishRepositoryUrl=true /verbosity:minimal
715
- cmd: msbuild /t:Pack src\NLog.Extensions.AzureBlobStorage /p:Configuration=Release /p:IncludeSymbols=true /p:SymbolPackageFormat=snupkg /p:ContinuousIntegrationBuild=true /p:EmbedUntrackedSources=true /p:PublishRepositoryUrl=true /verbosity:minimal

src/NLog.Extensions.AzureBlobStorage/NLog.Extensions.AzureBlobStorage.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>netstandard2.0;net8.0</TargetFrameworks>
4+
<TargetFrameworks>netstandard2.0;net8.0;net10.0</TargetFrameworks>
55
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
66
<IsTrimmable Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net6.0'))">true</IsTrimmable>
77
<GenerateDocumentationFile>true</GenerateDocumentationFile>

src/NLog.Extensions.AzureCosmosTable/NLog.Extensions.AzureCosmosTable.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
<TargetFrameworks>net45;net461;netstandard1.3;netstandard2.0</TargetFrameworks>
55
<DisableImplicitFrameworkReferences Condition=" '$(TargetFramework)' == 'net45' Or '$(TargetFramework)' == 'net461' ">true</DisableImplicitFrameworkReferences>
66
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
7+
<GenerateDocumentationFile>true</GenerateDocumentationFile>
8+
<RepositoryBranch>master</RepositoryBranch>
9+
<IncludeSymbols>true</IncludeSymbols>
10+
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
711

812
<Version>2.8.0</Version>
913

@@ -14,6 +18,7 @@
1418

1519
<PackageTags>NLog;azure;CloudTable;cosmos;cosmosdb;documentdb;table;storage;log;logging</PackageTags>
1620
<PackageIcon>logo64.png</PackageIcon>
21+
<PackageReadmeFile>README.md</PackageReadmeFile>
1722
<PackageProjectUrl>https://github.com/JDetmar/NLog.Extensions.AzureStorage</PackageProjectUrl>
1823
<RepositoryType>git</RepositoryType>
1924
<RepositoryUrl>https://github.com/JDetmar/NLog.Extensions.AzureStorage.git</RepositoryUrl>
@@ -25,6 +30,7 @@ Docs: https://github.com/JDetmar/NLog.Extensions.AzureStorage/blob/master/src/NL
2530

2631
<ItemGroup>
2732
<None Include="../../logo64.png" Link="logo64.png" Pack="true" PackagePath="" Visible="false" />
33+
<None Include="README.md" Pack="true" PackagePath="\" />
2834
</ItemGroup>
2935

3036
<ItemGroup>

src/NLog.Extensions.AzureDataTables/NLog.Extensions.AzureDataTables.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>netstandard2.0;net8.0</TargetFrameworks>
4+
<TargetFrameworks>netstandard2.0;net8.0;net10.0</TargetFrameworks>
55
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
66
<IsTrimmable Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net6.0'))">true</IsTrimmable>
77
<GenerateDocumentationFile>true</GenerateDocumentationFile>

src/NLog.Extensions.AzureEventGrid/EventGridTarget.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace NLog.Targets
1818
/// Azure Event Grid NLog Target
1919
/// </summary>
2020
[Target("AzureEventGrid")]
21-
public class EventGridTarget : AsyncTaskTarget
21+
public sealed class EventGridTarget : AsyncTaskTarget
2222
{
2323
private readonly IEventGridService _eventGridService;
2424
private readonly char[] _reusableEncodingBuffer = new char[32 * 1024]; // Avoid large-object-heap

src/NLog.Extensions.AzureEventGrid/NLog.Extensions.AzureEventGrid.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>netstandard2.0;net8.0</TargetFrameworks>
4+
<TargetFrameworks>netstandard2.0;net8.0;net10.0</TargetFrameworks>
55
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
66
<IsTrimmable Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net6.0'))">true</IsTrimmable>
77
<GenerateDocumentationFile>true</GenerateDocumentationFile>

src/NLog.Extensions.AzureEventHub/EventHubTarget.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace NLog.Targets
1717
/// Azure Event Hubs NLog Target
1818
/// </summary>
1919
[Target("AzureEventHub")]
20-
public class EventHubTarget : AsyncTaskTarget
20+
public sealed class EventHubTarget : AsyncTaskTarget
2121
{
2222
private readonly IEventHubService _eventHubService;
2323
private SortHelpers.KeySelector<LogEventInfo, string> _getEventHubPartitionKeyDelegate;

0 commit comments

Comments
 (0)