Skip to content

Commit 55a80e2

Browse files
committed
feat: embed version metadata with git information into assembly
1 parent 52e9873 commit 55a80e2

File tree

15 files changed

+226
-93
lines changed

15 files changed

+226
-93
lines changed

.github/workflows/build.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ permissions:
3838

3939
env:
4040
VERSION_PREFIX: 0.8.0
41+
VERSION_SUFFIX_NAME: beta
4142
VERSION_SUFFIX: -beta
4243

4344
jobs:
@@ -148,7 +149,7 @@ jobs:
148149

149150
- name: Build solution
150151
if: steps.cache-binaries.outputs.cache-hit != 'true' || inputs.forceBuild == true || inputs.forceRestore == true
151-
run: dotnet publish Intersect.sln --sc -r linux-x64 -p:Configuration=Release -p:PackageVersion=${{ env.VERSION_PREFIX }}${{ env.VERSION_SUFFIX }}.${{ github.run_number }}+build.${{ github.sha }} -p:Version=${{ env.VERSION_PREFIX }}.${{ github.run_number }}
152+
run: dotnet publish Intersect.sln --sc -r linux-x64 -p:Configuration=Release -p:PackageVersion=${{ env.VERSION_PREFIX }}${{ env.VERSION_SUFFIX }}.${{ github.run_number }}+build.${{ github.sha }} -p:Version=${{ env.VERSION_PREFIX }}.${{ github.run_number }} -p:CommitSha=${{ github.sha }} -p:BuildNumber=${{ github.run_number }} -p:VersionNameSuffix=${{ env.VERSION_SUFFIX_NAME }}
152153

153154
- name: Tarball artifacts to maintain unix file permissions
154155
run: tar -cvf linux.tar Intersect.Client/bin/Release/*/*/publish Intersect.Server/bin/Release/*/*/publish
@@ -216,7 +217,7 @@ jobs:
216217

217218
- name: Build solution
218219
if: steps.cache-binaries.outputs.cache-hit != 'true' || inputs.forceBuild == true || inputs.forceRestore == true
219-
run: dotnet publish Intersect.sln --sc -r osx-x64 -p:Configuration=Release -p:PackageVersion=${{ env.VERSION_PREFIX }}${{ env.VERSION_SUFFIX }}.${{ github.run_number }}+build.${{ github.sha }} -p:Version=${{ env.VERSION_PREFIX }}.${{ github.run_number }}
220+
run: dotnet publish Intersect.sln --sc -r osx-x64 -p:Configuration=Release -p:PackageVersion=${{ env.VERSION_PREFIX }}${{ env.VERSION_SUFFIX }}.${{ github.run_number }}+build.${{ github.sha }} -p:Version=${{ env.VERSION_PREFIX }}.${{ github.run_number }} -p:CommitSha=${{ github.sha }} -p:BuildNumber=${{ github.run_number }} -p:VersionNameSuffix=${{ env.VERSION_SUFFIX_NAME }}
220221

221222
- name: Tarball artifacts to maintain unix file permissions
222223
run: tar -cvf osx.tar Intersect.Client/bin/Release/*/*/publish Intersect.Server/bin/Release/*/*/publish
@@ -285,7 +286,7 @@ jobs:
285286

286287
- name: Build solution
287288
if: steps.cache-binaries.outputs.cache-hit != 'true' || inputs.forceBuild == true || inputs.forceRestore == true
288-
run: dotnet publish Intersect.sln --sc -r win-x64 -p:Configuration=Release -p:PackageVersion=${{ env.VERSION_PREFIX }}${{ env.VERSION_SUFFIX }}.${{ github.run_number }}+build.${{ github.sha }} -p:Version=${{ env.VERSION_PREFIX }}.${{ github.run_number }}
289+
run: dotnet publish Intersect.sln --sc -r win-x64 -p:Configuration=Release -p:PackageVersion=${{ env.VERSION_PREFIX }}${{ env.VERSION_SUFFIX }}.${{ github.run_number }}+build.${{ github.sha }} -p:Version=${{ env.VERSION_PREFIX }}.${{ github.run_number }} -p:CommitSha=${{ github.sha }} -p:BuildNumber=${{ github.run_number }} -p:VersionNameSuffix=${{ env.VERSION_SUFFIX_NAME }}
289290

290291
- name: Tarball artifacts to maintain unix file permissions
291292
run: tar -cvf win.tar Intersect.Client/bin/Release/*/*/publish Intersect.Editor/bin/Release/*/*/publish Intersect.Server/bin/Release/*/*/publish

.github/workflows/pull_request.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ on:
2323

2424
env:
2525
VERSION_PREFIX: 0.8.0
26+
VERSION_SUFFIX_NAME: pr${{ github.event.number }}
2627
VERSION_SUFFIX: -pr${{ github.event.number }}
2728
PARENT_VERSION_SUFFIX: -beta
2829

@@ -70,10 +71,10 @@ jobs:
7071
- name: Build solution
7172
if: steps.cache-binaries.outputs.cache-hit != 'true' || inputs.forceBuild == true || inputs.forceRestore == true
7273
run: |
73-
dotnet publish Intersect.sln -r win-x64 -p:Configuration=Release -p:PackageVersion=${{ env.VERSION_PREFIX }}${{ env.VERSION_SUFFIX }}.${{ github.run_number }}+build.${{ github.sha }} -p:Version=${{ env.VERSION_PREFIX }}.${{ github.run_number }}
74+
dotnet publish Intersect.sln -r win-x64 -p:Configuration=Release -p:PackageVersion=${{ env.VERSION_PREFIX }}${{ env.VERSION_SUFFIX }}.${{ github.run_number }}+build.${{ github.sha }} -p:Version=${{ env.VERSION_PREFIX }}.${{ github.run_number }} -p:CommitSha=${{ github.sha }} -p:BuildNumber=${{ github.run_number }} -p:VersionNameSuffix=${{ env.VERSION_SUFFIX_NAME }}
7475
git apply disable-windows-editor.patch
75-
dotnet publish Intersect.sln -r linux-x64 -p:Configuration=Release -p:PackageVersion=${{ env.VERSION_PREFIX }}${{ env.VERSION_SUFFIX }}.${{ github.run_number }}+build.${{ github.sha }} -p:Version=${{ env.VERSION_PREFIX }}.${{ github.run_number }}
76-
dotnet publish Intersect.sln -r osx-x64 -p:Configuration=Release -p:PackageVersion=${{ env.VERSION_PREFIX }}${{ env.VERSION_SUFFIX }}.${{ github.run_number }}+build.${{ github.sha }} -p:Version=${{ env.VERSION_PREFIX }}.${{ github.run_number }}
76+
dotnet publish Intersect.sln -r linux-x64 -p:Configuration=Release -p:PackageVersion=${{ env.VERSION_PREFIX }}${{ env.VERSION_SUFFIX }}.${{ github.run_number }}+build.${{ github.sha }} -p:Version=${{ env.VERSION_PREFIX }}.${{ github.run_number }} -p:CommitSha=${{ github.sha }} -p:BuildNumber=${{ github.run_number }} -p:VersionNameSuffix=${{ env.VERSION_SUFFIX_NAME }}
77+
dotnet publish Intersect.sln -r osx-x64 -p:Configuration=Release -p:PackageVersion=${{ env.VERSION_PREFIX }}${{ env.VERSION_SUFFIX }}.${{ github.run_number }}+build.${{ github.sha }} -p:Version=${{ env.VERSION_PREFIX }}.${{ github.run_number }} -p:CommitSha=${{ github.sha }} -p:BuildNumber=${{ github.run_number }} -p:VersionNameSuffix=${{ env.VERSION_SUFFIX_NAME }}
7778
7879
- name: Package artifacts
7980
uses: AscensionGameDev/actions@a573cea975b37832c9fe4a9ee880e22af93696de

Framework/Intersect.Framework.Core/Intersect.Framework.Core.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
</PackageReference>
3434
<PackageReference Include="NCalcSync" Version="3.8.0" />
3535
<PackageReference Include="Semver" Version="2.3.0" />
36-
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
3736
<PackageReference Include="System.Collections.Immutable" Version="9.0.0" />
3837
<PackageReference Include="System.IO.Abstractions" Version="21.1.7" />
3938
<PackageReference Include="System.IO.FileSystem" Version="4.3.0" />

Framework/Intersect.Framework/Intersect.Framework.csproj

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@
33
<ItemGroup>
44
<PackageReference Include="MessagePack.Annotations" Version="2.6.100-alpha" />
55
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="7.0.14" />
6-
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />
7-
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="7.0.0" />
8-
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.1" />
9-
<PackageReference Include="Microsoft.Extensions.Options" Version="7.0.1" />
6+
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.2" />
7+
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.1" />
8+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.2" />
9+
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.2" />
1010
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
11+
<PackageReference Include="Serilog" Version="4.2.0" />
12+
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
1113
<PackageReference Include="System.IO.Hashing" Version="9.0.1" />
14+
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
15+
<PackageReference Include="Serilog.Sinks.Debug" Version="2.0.0" />
16+
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
1217
<PackageReference Include="System.Text.Json" Version="8.0.5" />
1318
</ItemGroup>
1419

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System.Diagnostics;
2+
using System.Reflection;
3+
using Intersect.Framework.Reflection;
4+
using Microsoft.Extensions.Logging;
5+
using Serilog;
6+
using Serilog.Core;
7+
using Serilog.Events;
8+
using Serilog.Extensions.Logging;
9+
using ILogger = Microsoft.Extensions.Logging.ILogger;
10+
11+
namespace Intersect.Framework.Logging;
12+
13+
public static class LoggerConfigurationExtensions
14+
{
15+
public static (ILoggerFactory, ILogger) CreateLoggerForIntersect(
16+
this LoggerConfiguration loggerConfiguration,
17+
Assembly forAssembly,
18+
string categoryName,
19+
LoggingLevelSwitch? parentLoggingLevelSwitch = null
20+
)
21+
{
22+
var currentProcess = Process.GetCurrentProcess();
23+
var processStartTime = currentProcess.StartTime;
24+
var executableName = Path.GetFileNameWithoutExtension(
25+
currentProcess.MainModule?.FileName ?? forAssembly.GetName().Name
26+
);
27+
28+
LoggingLevelSwitch loggingLevelSwitch =
29+
new(Debugger.IsAttached ? LogEventLevel.Debug : LogEventLevel.Information);
30+
31+
if (parentLoggingLevelSwitch is not null)
32+
{
33+
parentLoggingLevelSwitch.MinimumLevelChanged +=
34+
(_, args) => loggingLevelSwitch.MinimumLevel = args.NewLevel;
35+
}
36+
37+
LoggingLevelSwitch errorLevelSwitch = new();
38+
39+
var serilogLogger = loggerConfiguration
40+
.MinimumLevel.ControlledBy(loggingLevelSwitch)
41+
.Enrich.FromLogContext()
42+
.WriteTo.Console()
43+
.WriteTo.File(
44+
Path.Combine(
45+
"logs",
46+
$"{executableName}-{processStartTime:yyyy_MM_dd-HH_mm_ss_fff}.log"
47+
),
48+
rollOnFileSizeLimit: true,
49+
retainedFileTimeLimit: TimeSpan.FromDays(30)
50+
)
51+
.WriteTo.File(
52+
Path.Combine("logs", $"errors-{executableName}.log"),
53+
levelSwitch: errorLevelSwitch,
54+
rollOnFileSizeLimit: true,
55+
retainedFileTimeLimit: TimeSpan.FromDays(30)
56+
)
57+
.CreateLogger();
58+
59+
var loggerFactory = new SerilogLoggerFactory(serilogLogger, dispose: true);
60+
var logger = loggerFactory.CreateLogger(categoryName);
61+
62+
logger.LogInformation(
63+
"Starting {AssemblyName} v{AssemblyVersion}",
64+
forAssembly.GetName().Name,
65+
forAssembly.GetMetadataVersion()
66+
);
67+
68+
errorLevelSwitch.MinimumLevel = LogEventLevel.Error;
69+
70+
return (loggerFactory, logger);
71+
}
72+
}

Framework/Intersect.Framework/Reflection/AssemblyExtensions.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Diagnostics.CodeAnalysis;
2+
using System.Globalization;
23
using System.Reflection;
34
using System.Resources;
45
// ReSharper disable MemberCanBePrivate.Global
@@ -49,6 +50,52 @@ params object[] args
4950
);
5051
}
5152

53+
public static string GetMetadataVersion(this Assembly assembly, bool excludeCommitSha = false)
54+
{
55+
var assemblyName = assembly.GetName();
56+
return GetMetadataVersionFrom(assembly, assemblyName, excludeCommitSha);
57+
}
58+
59+
private static string GetMetadataVersionFrom(Assembly assembly, AssemblyName assemblyName, bool excludeCommitSha)
60+
{
61+
var assemblyVersion = assemblyName.Version ?? new Version(0, 0, 0, 0);
62+
var assemblyMetadata = assembly.GetCustomAttributes<AssemblyMetadataAttribute>()
63+
.ToDictionary(attribute => attribute.Key, attribute => attribute.Value);
64+
65+
if (assemblyMetadata.TryGetValue("BuildNumber", out var rawBuildNumber))
66+
{
67+
if (int.TryParse(rawBuildNumber, CultureInfo.InvariantCulture, out var buildNumber))
68+
{
69+
assemblyVersion = new Version(
70+
assemblyVersion.Major,
71+
assemblyVersion.Minor,
72+
assemblyVersion.Build,
73+
buildNumber
74+
);
75+
}
76+
}
77+
78+
var metadataVersion = $"{assemblyVersion.ToString()}";
79+
if (assemblyMetadata.TryGetValue("VersionNameSuffix", out var versionNameSuffix))
80+
{
81+
metadataVersion = $"{metadataVersion}-{versionNameSuffix}";
82+
}
83+
84+
if (!excludeCommitSha && assemblyMetadata.TryGetValue("CommitSha", out var commitSha))
85+
{
86+
metadataVersion = $"{metadataVersion}+{commitSha}";
87+
}
88+
89+
return metadataVersion;
90+
}
91+
92+
public static string GetMetadataName(this Assembly assembly, bool excludeCommitSha = false)
93+
{
94+
var assemblyName = assembly.GetName();
95+
var prettyName = $"{assemblyName.Name} v{GetMetadataVersionFrom(assembly, assemblyName, excludeCommitSha)}";
96+
return prettyName;
97+
}
98+
5299
public static string GetVersionName(this Assembly assembly)
53100
{
54101
var version = assembly.GetName().Version;

Intersect (Core)/Intersect.Core.csproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,6 @@
8686
<PackageReference Include="Microsoft.VisualStudio.Validation" Version="17.8.8" />
8787
<PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" />
8888
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
89-
<PackageReference Include="Serilog" Version="4.2.0" />
90-
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
91-
<PackageReference Include="Serilog.Sinks.Debug" Version="2.0.0" />
92-
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
9389
<PackageReference Include="System.Buffers" Version="4.6.0" />
9490
<PackageReference Include="System.Collections" Version="4.3.0" />
9591
<PackageReference Include="System.Collections.Immutable" Version="9.0.0" />

Intersect.Client.Core/Core/Bootstrapper.cs

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
using Intersect.Configuration;
55
using Intersect.Core;
66
using Intersect.Factories;
7+
using Intersect.Framework.Logging;
8+
using Intersect.Framework.Reflection;
79
using Intersect.Network;
810
using Intersect.Plugins;
911
using Intersect.Plugins.Contexts;
@@ -13,6 +15,7 @@
1315
using Serilog.Core;
1416
using Serilog.Events;
1517
using Serilog.Extensions.Logging;
18+
using ILogger = Microsoft.Extensions.Logging.ILogger;
1619

1720
namespace Intersect.Client.Core;
1821

@@ -39,36 +42,15 @@ public static void Start(params string[] args)
3942
var commandLineOptions = parser.ParseArguments<ClientCommandLineOptions>(args)
4043
.MapResult(HandleParsedArguments, HandleParserErrors);
4144

42-
var executableName = Path.GetFileNameWithoutExtension(
43-
Process.GetCurrentProcess().MainModule?.FileName ?? Assembly.GetExecutingAssembly().GetName().Name
44-
);
45-
4645
LoggingLevelSwitch loggingLevelSwitch =
4746
new(Debugger.IsAttached ? LogEventLevel.Debug : LogEventLevel.Information);
4847

49-
var loggerConfiguration = new LoggerConfiguration()
50-
.MinimumLevel.ControlledBy(loggingLevelSwitch)
51-
.Enrich.FromLogContext()
52-
.WriteTo.Console()
53-
.WriteTo.File(
54-
Path.Combine(
55-
"logs",
56-
$"{executableName}-{Process.GetCurrentProcess().StartTime:yyyy_MM_dd-HH_mm_ss_fff}.log"
57-
),
58-
rollOnFileSizeLimit: true,
59-
retainedFileTimeLimit: TimeSpan.FromDays(30)
60-
)
61-
.WriteTo.File(
62-
Path.Combine("logs", $"errors-{executableName}.log"),
63-
restrictedToMinimumLevel: LogEventLevel.Error,
64-
rollOnFileSizeLimit: true,
65-
retainedFileTimeLimit: TimeSpan.FromDays(30)
66-
);
67-
68-
var logger = new SerilogLoggerFactory(loggerConfiguration.CreateLogger()).CreateLogger("Client");
69-
70-
var assemblyName = Assembly.GetExecutingAssembly().GetName();
71-
logger.LogCritical("Starting {AssemblyName} v{Version}", assemblyName.Name, assemblyName.Version);
48+
var executingAssembly = Assembly.GetExecutingAssembly();
49+
var (_, logger) = new LoggerConfiguration().CreateLoggerForIntersect(
50+
executingAssembly,
51+
"Client",
52+
loggingLevelSwitch
53+
);
7254

7355
var packetTypeRegistry = new PacketTypeRegistry(logger, typeof(SharedConstants).Assembly);
7456
if (!packetTypeRegistry.TryRegisterBuiltIn())

Intersect.Client.Core/Program.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,7 @@ internal static void Main(string[] args)
4444

4545
try
4646
{
47-
var type = Type.GetType("Intersect.Client.Core.Bootstrapper", true);
48-
Debug.Assert(type != null, "type != null");
49-
var method = type.GetMethod("Start");
50-
Debug.Assert(method != null, "method != null");
51-
method.Invoke(null, new object[] { args });
47+
Bootstrapper.Start(args);
5248
}
5349
catch (NoSuitableGraphicsDeviceException noSuitableGraphicsDeviceException)
5450
{

Intersect.Client/Program.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1+
using System.Reflection;
2+
using Intersect.Framework.Reflection;
3+
4+
Console.WriteLine($"Starting {Assembly.GetExecutingAssembly().GetMetadataName()}...");
5+
16
Intersect.Client.Core.Program.Main(args);

0 commit comments

Comments
 (0)