Compare commits

...

12 Commits

Author SHA1 Message Date
Adam Hathcock bb5ee67e53 fmt
.NET Build and Publish / build-windows (push) Has been cancelled
.NET Build and Publish / build-linux (push) Has been cancelled
.NET Build and Publish / deploy-installers (push) Has been cancelled
2025-03-06 13:11:06 +00:00
Adam Hathcock f7db985705 Merge remote-tracking branch 'origin/dev' into adam/cnx-1367-build-subset-when-tagged 2025-03-06 13:10:02 +00:00
Adam Hathcock 3de5b4f62c Merge branch 'dev' into adam/cnx-1367-build-subset-when-tagged 2025-03-06 11:50:03 +00:00
Adam Hathcock ef9bb0effc affected tests and small refactor
.NET Build and Publish / build-windows (push) Has been cancelled
.NET Build and Publish / build-linux (push) Has been cancelled
.NET Build and Publish / deploy-installers (push) Has been cancelled
2025-03-06 10:02:04 +00:00
Adam Hathcock f9281bbb56 add conditions around build and publish for linux
.NET Build and Publish / build-windows (push) Has been cancelled
.NET Build and Publish / build-linux (push) Has been cancelled
.NET Build and Publish / deploy-installers (push) Has been cancelled
2025-03-06 09:10:18 +00:00
Adam Hathcock 7e1da5a012 put if statement on job 2025-03-06 09:06:00 +00:00
Adam Hathcock 880ec0bad0 Lazy affected 2025-03-06 08:45:28 +00:00
Adam Hathcock 58e36b07c8 build refactor to get affected work
.NET Build and Publish / build-windows (push) Has been cancelled
.NET Build and Publish / build-linux (push) Has been cancelled
.NET Build and Publish / deploy-installers (push) Has been cancelled
2025-03-06 08:17:08 +00:00
Adam Hathcock f4522cbe33 fix github action
.NET Build and Publish / build-windows (push) Has been cancelled
.NET Build and Publish / build-linux (push) Has been cancelled
.NET Build and Publish / deploy-installers (push) Has been cancelled
2025-03-05 16:29:43 +00:00
Adam Hathcock 9584d442a2 adjust test 2025-03-05 16:26:49 +00:00
Adam Hathcock 9a56a09d7a use this branch as a test branch 2025-03-05 16:16:25 +00:00
Adam Hathcock d6aa70875e Add affected usage with tag math 2025-03-05 16:09:09 +00:00
10 changed files with 310 additions and 90 deletions
+3 -3
View File
@@ -9,10 +9,10 @@
],
"rollForward": false
},
"gitversion.tool": {
"version": "6.0.2",
"dotnet-affected": {
"version": "5.0.0",
"commands": [
"dotnet-gitversion"
"dotnet-affected"
],
"rollForward": false
}
+9 -8
View File
@@ -2,7 +2,7 @@ name: .NET Build and Publish
on:
push:
branches: ["main", "dev", "release/*"] # Continuous delivery on every long-lived branch
branches: ["main", "adam/*"]
tags: ["v3.*"] # Manual delivery on every 3.x tag
jobs:
@@ -27,13 +27,12 @@ jobs:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
- name: ⚒️ Run GitVersion on Windows
run: ./build.ps1 build-server-version
- name: ⚒️ Run build on Windows
run: ./build.ps1
- name: ⬆️ Upload artifacts
#if tag and it's main branch (and adam test branch)
if: github.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/v3.') && (github.event.base_ref == 'refs/heads/main' || startsWith(github.event.base_ref, 'refs/heads/adam/'))
uses: actions/upload-artifact@v4
with:
name: output-${{ env.GitVersion_FullSemVer }}
@@ -49,6 +48,8 @@ jobs:
deploy-installers:
runs-on: ubuntu-latest
needs: build-windows
#if tag and it's main branch (and adam test branch)
if: github.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/v3.') && (github.event.base_ref == 'refs/heads/main' || startsWith(github.event.base_ref, 'refs/heads/adam/'))
env:
IS_TAG_BUILD: ${{ github.ref_type == 'tag' }}
IS_RELEASE_BRANCH: ${{ startsWith(github.ref_name, 'release/') || github.ref_name == 'main'}}
@@ -90,13 +91,12 @@ jobs:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
- name: ⚒️ Run GitVersion on Linux
run: ./build.sh build-server-version
- name: ⚒️ Run tests on Linux
run: ./build.sh test-only
- name: ⚒️ Run Build and Pack on Linux
#if tag and it's main branch (and adam test branch)
if: github.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/v3.') && (github.event.base_ref == 'refs/heads/main' || startsWith(github.event.base_ref, 'refs/heads/adam/'))
run: ./build.sh build-linux
- name: Upload coverage reports to Codecov with GitHub Action
@@ -106,5 +106,6 @@ jobs:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Push to nuget.org
if: ${{ github.ref_type == 'tag' }}
#if tag and it's main branch (and adam test branch)
if: github.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/v3.') && (github.event.base_ref == 'refs/heads/main' || startsWith(github.event.base_ref, 'refs/heads/adam/'))
run: dotnet nuget push output/*.nupkg --source "https://api.nuget.org/v3/index.json" --api-key ${{secrets.CONNECTORS_NUGET_TOKEN }} --skip-duplicate
+170
View File
@@ -0,0 +1,170 @@
using GlobExpressions;
using Microsoft.Build.Construction;
using Semver;
using static SimpleExec.Command;
namespace Build;
public static class Affected
{
public static readonly string Root = Environment.CurrentDirectory;
public const string AFFECTED_PROJECT = "affected.proj";
private static IEnumerable<string> GetAffectedProjects()
{
var projFile = Path.Combine(Root, AFFECTED_PROJECT);
Console.WriteLine("Affected project file: " + projFile);
var project = ProjectRootElement.Open(projFile) ?? throw new InvalidOperationException();
var references = project.ItemGroups.SelectMany(x => x.Items).Where(x => x.ItemType == "ProjectReference");
foreach (var refe in references)
{
var referencePath = refe.Include[(Root.Length + 1)..];
referencePath = Path.GetDirectoryName(referencePath) ?? throw new InvalidOperationException();
if (Path.DirectorySeparatorChar != '/')
{
referencePath = referencePath.Replace(Path.DirectorySeparatorChar, '/');
}
yield return referencePath;
}
}
public static async Task<string[]> GetSolutions()
{
await ComputeAffected();
var projFile = Path.Combine(Root, AFFECTED_PROJECT);
if (File.Exists(projFile))
{
Console.WriteLine("Affected project file: " + projFile);
return [projFile];
}
Console.WriteLine("Using solutions: " + string.Join(',', Consts.Solutions));
return Consts.Solutions;
}
public static async Task<IEnumerable<string>> GetProjects()
{
await ComputeAffected();
var projFile = Path.Combine(Root, AFFECTED_PROJECT);
if (File.Exists(projFile))
{
var references = GetAffectedProjects();
return references.Where(x => x.EndsWith(".Tests.csproj"));
}
return Glob.Files(Root, "**/*.Tests.csproj");
}
public static async Task<InstallerProject[]> GetInstallerProjects()
{
await ComputeAffected();
var projFile = Path.Combine(Root, AFFECTED_PROJECT);
if (File.Exists(projFile))
{
var references = GetAffectedProjects().ToList();
var projs = new List<InstallerProject>();
foreach (var referencePath in references)
{
Console.WriteLine($"Candidate project: {referencePath}");
}
foreach (var manifest in Consts.InstallerManifests)
{
var assets = new List<InstallerAsset>();
foreach (var referencePath in references)
{
foreach (var proj in manifest.Projects)
{
if (proj.ProjectPath.Contains(referencePath))
{
assets.Add(proj);
}
}
}
if (assets.Count > 0)
{
projs.Add(manifest with { Projects = assets });
}
}
foreach (var proj in projs.SelectMany(x => x.Projects))
{
Console.WriteLine("Affected project being built: " + proj);
}
if (projs.Count > 0)
{
return projs.ToArray();
}
}
Console.WriteLine("Using all installer manifests: " + string.Join(',', Consts.InstallerManifests));
return Consts.InstallerManifests;
}
private static bool s_affectedComputed;
public static async Task ComputeAffected()
{
if (s_affectedComputed)
{
return;
}
var (currentTag, _) = await ReadAsync("git", "describe --tags");
currentTag = currentTag.Trim();
var version = await Versions.ComputeVersion();
var currentVersion = SemVersion.Parse(version).WithoutPrereleaseOrMetadata();
var (lastTag, _) = await ReadAsync("git", $"describe --abbrev=0 --tags {currentTag}^");
lastTag = lastTag.Trim();
if (!SemVersion.TryParse(lastTag, SemVersionStyles.AllowLowerV, out var lastVersion))
{
Console.WriteLine($"Could not parse version: '{lastTag}'");
s_affectedComputed = true;
return;
}
Console.WriteLine($"Last tag: {lastTag}, Current tag: {currentTag}");
lastVersion = lastVersion.WithoutPrereleaseOrMetadata();
currentVersion = currentVersion.WithoutPrereleaseOrMetadata();
Console.WriteLine($"Last parsed version: {lastVersion}, Current parsed version: {currentVersion}");
var sort = currentVersion.CompareSortOrderTo(lastVersion);
Console.WriteLine($"Sort: {sort}");
if (sort == 0)
{
Console.WriteLine($"Current version {currentVersion} is equal to: {lastVersion}");
s_affectedComputed = true;
return;
}
if (sort != 1)
{
Console.WriteLine($"Current version {currentVersion} is not greater than: {lastVersion}");
s_affectedComputed = true;
return;
}
var majorEquals = currentVersion.Major == lastVersion.Major;
var minorEquals = currentVersion.Minor == lastVersion.Minor;
if (!majorEquals)
{
Console.WriteLine($"Current version {currentVersion} is not matching major version: {lastVersion}");
s_affectedComputed = true;
return;
}
if (minorEquals)
{
var (currentCommit, _) = await ReadAsync("git", $"rev-list -n 1 {currentTag.Trim()}");
var (lastCommit, _) = await ReadAsync("git", $"rev-list -n 1 {lastTag.Trim()}");
await RunAsync("dotnet", $"affected --from {currentCommit.Trim()} --to {lastCommit.Trim()}", Root);
}
s_affectedComputed = true;
}
}
+1
View File
@@ -10,6 +10,7 @@
<PackageReference Include="Bullseye" />
<PackageReference Include="Glob" />
<PackageReference Include="Microsoft.Build" />
<PackageReference Include="Semver" />
<PackageReference Include="SimpleExec" />
</ItemGroup>
</Project>
+68 -76
View File
@@ -12,9 +12,7 @@ const string TEST = "test";
const string TEST_ONLY = "test-only";
const string FORMAT = "format";
const string ZIP = "zip";
const string VERSION = "version";
const string RESTORE_TOOLS = "restore-tools";
const string BUILD_SERVER_VERSION = "build-server-version";
const string CLEAN_LOCKS = "clean-locks";
const string CHECK_SOLUTIONS = "check-solutions";
const string DEEP_CLEAN = "deep-clean";
@@ -125,17 +123,6 @@ Target(
}
);
Target(
VERSION,
async () =>
{
var (output, _) = await ReadAsync("dotnet", "minver -v w");
output = output.Trim();
Console.WriteLine($"Version: {output}");
Run("echo", $"\"version={output}\" >> $GITHUB_OUTPUT");
}
);
Target(
RESTORE_TOOLS,
() =>
@@ -156,35 +143,33 @@ Target(
Target(
RESTORE,
DependsOn(FORMAT),
Consts.Solutions,
s =>
async () =>
{
Run("dotnet", $"restore {s} --locked-mode");
}
);
Target(
BUILD_SERVER_VERSION,
DependsOn(RESTORE_TOOLS),
() =>
{
Run("dotnet", "tool run dotnet-gitversion /output json /output buildserver");
var version = await Versions.ComputeVersion();
var fileVersion = await Versions.ComputeFileVersion();
foreach (var s in await Affected.GetSolutions())
{
Console.WriteLine($"Restoring: {s} - Version: {version} & {fileVersion}");
await RunAsync("dotnet", $"restore {s} --locked-mode");
}
}
);
Target(
BUILD,
DependsOn(RESTORE),
Consts.Solutions,
s =>
async () =>
{
var version = Environment.GetEnvironmentVariable("GitVersion_FullSemVer") ?? "3.0.0-localBuild";
var fileVersion = Environment.GetEnvironmentVariable("GitVersion_AssemblySemFileVer") ?? "3.0.0.0";
Console.WriteLine($"Version: {version} & {fileVersion}");
Run(
"dotnet",
$"build {s} -c Release --no-restore -warnaserror -p:Version={version} -p:FileVersion={fileVersion} -v:m"
);
var version = await Versions.ComputeVersion();
var fileVersion = await Versions.ComputeFileVersion();
foreach (var s in await Affected.GetSolutions())
{
Console.WriteLine($"Restoring: {s} - Version: {version} & {fileVersion}");
await RunAsync(
"dotnet",
$"build {s} -c Release --no-restore -warnaserror -p:Version={version} -p:FileVersion={fileVersion} -v:m"
);
}
}
);
@@ -193,13 +178,16 @@ Target(CHECK_SOLUTIONS, Solutions.CompareConnectorsToLocal);
Target(
TEST,
DependsOn(BUILD, CHECK_SOLUTIONS),
Glob.Files(".", "**/*.Tests.csproj"),
file =>
async () =>
{
Run("dotnet", $"test {file} -c Release --no-build --no-restore --verbosity=minimal");
foreach (var file in await Affected.GetProjects())
{
await RunAsync("dotnet", $"test {file} -c Release --no-build --no-restore --verbosity=minimal");
}
}
);
//all tests on purpose
Target(
TEST_ONLY,
DependsOn(FORMAT),
@@ -218,18 +206,18 @@ Target(
BUILD_LINUX,
DependsOn(FORMAT),
Glob.Files(".", "**/Speckle.Importers.Ifc.csproj"),
file =>
async file =>
{
Run("dotnet", $"restore {file} --locked-mode");
var version = Environment.GetEnvironmentVariable("GitVersion_FullSemVer") ?? "3.0.0-localBuild";
var fileVersion = Environment.GetEnvironmentVariable("GitVersion_AssemblySemFileVer") ?? "3.0.0.0";
await RunAsync("dotnet", $"restore {file} --locked-mode");
var version = await Versions.ComputeVersion();
var fileVersion = await Versions.ComputeFileVersion();
Console.WriteLine($"Version: {version} & {fileVersion}");
Run(
await RunAsync(
"dotnet",
$"build {file} -c Release --no-restore -warnaserror -p:Version={version} -p:FileVersion={fileVersion} -v:m"
);
RunAsync(
await RunAsync(
"dotnet",
$"pack {file} -c Release -o output --no-build -p:Version={version} -p:FileVersion={fileVersion} -v:m"
);
@@ -239,47 +227,51 @@ Target(
Target(
ZIP,
DependsOn(TEST),
Consts.InstallerManifests,
x =>
async () =>
{
var outputDir = Path.Combine(".", "output");
var slugDir = Path.Combine(outputDir, x.HostAppSlug);
Directory.CreateDirectory(outputDir);
Directory.CreateDirectory(slugDir);
foreach (var asset in x.Projects)
var version = await Versions.ComputeVersion();
foreach (var x in await Affected.GetInstallerProjects())
{
var fullPath = Path.Combine(".", asset.ProjectPath, "bin", "Release", asset.TargetName);
if (!Directory.Exists(fullPath))
Console.WriteLine($"Zipping: {x} as {version}");
var outputDir = Path.Combine(".", "output");
var slugDir = Path.Combine(outputDir, x.HostAppSlug);
Directory.CreateDirectory(outputDir);
Directory.CreateDirectory(slugDir);
foreach (var asset in x.Projects)
{
throw new InvalidOperationException("Could not find: " + fullPath);
var fullPath = Path.Combine(".", asset.ProjectPath, "bin", "Release", asset.TargetName);
if (!Directory.Exists(fullPath))
{
throw new InvalidOperationException("Could not find: " + fullPath);
}
var assetName = Path.GetFileName(asset.ProjectPath);
var connectorDir = Path.Combine(slugDir, assetName);
Directory.CreateDirectory(connectorDir);
foreach (var directory in Directory.EnumerateDirectories(fullPath, "*", SearchOption.AllDirectories))
{
Directory.CreateDirectory(directory.Replace(fullPath, connectorDir));
}
foreach (var file in Directory.EnumerateFiles(fullPath, "*", SearchOption.AllDirectories))
{
Console.WriteLine(file);
File.Copy(file, file.Replace(fullPath, connectorDir), true);
}
}
var assetName = Path.GetFileName(asset.ProjectPath);
var connectorDir = Path.Combine(slugDir, assetName);
Directory.CreateDirectory(connectorDir);
foreach (var directory in Directory.EnumerateDirectories(fullPath, "*", SearchOption.AllDirectories))
{
Directory.CreateDirectory(directory.Replace(fullPath, connectorDir));
}
foreach (var file in Directory.EnumerateFiles(fullPath, "*", SearchOption.AllDirectories))
{
Console.WriteLine(file);
File.Copy(file, file.Replace(fullPath, connectorDir), true);
}
var outputPath = Path.Combine(outputDir, $"{x.HostAppSlug}.zip");
File.Delete(outputPath);
Console.WriteLine($"Zipping: '{slugDir}' to '{outputPath}'");
ZipFile.CreateFromDirectory(slugDir, outputPath);
// Directory.Delete(slugDir, true);
}
var outputPath = Path.Combine(outputDir, $"{x.HostAppSlug}.zip");
File.Delete(outputPath);
Console.WriteLine($"Zipping: '{slugDir}' to '{outputPath}'");
ZipFile.CreateFromDirectory(slugDir, outputPath);
// Directory.Delete(slugDir, true);
}
);
Target("default", DependsOn(FORMAT, ZIP), () => Console.WriteLine("Done!"));
Target("default", DependsOn(TEST), () => Console.WriteLine("Done!"));
await RunTargetsAndExitAsync(args).ConfigureAwait(true);
+40
View File
@@ -0,0 +1,40 @@
using Semver;
using static SimpleExec.Command;
namespace Build;
public static class Versions
{
private static string? s_currentVersion;
public static async Task<string> ComputeVersion()
{
if (s_currentVersion is not null)
{
return s_currentVersion;
}
var (currentTag, _) = await ReadAsync("git", "describe --tags");
currentTag = currentTag.Trim();
if (!SemVersion.TryParse(currentTag, SemVersionStyles.AllowLowerV, out var currentVersion))
{
throw new InvalidOperationException($"Could not parse version: '{currentTag}'");
}
s_currentVersion = currentVersion.ToString();
return s_currentVersion;
}
private static string? s_currentFileVersion;
public static async Task<string> ComputeFileVersion()
{
if (s_currentFileVersion is not null)
{
return s_currentFileVersion;
}
var version = await ComputeVersion();
var currentVersion = SemVersion.Parse(version).WithoutPrereleaseOrMetadata();
s_currentFileVersion = currentVersion.ToString() + ".0";
return s_currentFileVersion;
}
}
+14
View File
@@ -53,6 +53,15 @@
"resolved": "1.14.1",
"contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ=="
},
"Semver": {
"type": "Direct",
"requested": "[3.0.0, )",
"resolved": "3.0.0",
"contentHash": "9jZCicsVgTebqkAujRWtC9J1A5EQVlu0TVKHcgoCuv345ve5DYf4D1MjhKEnQjdRZo6x/vdv6QQrYFs7ilGzLA==",
"dependencies": {
"Microsoft.Extensions.Primitives": "5.0.1"
}
},
"SimpleExec": {
"type": "Direct",
"requested": "[12.0.0, )",
@@ -75,6 +84,11 @@
"resolved": "8.0.0",
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "5.0.1",
"contentHash": "5WPSmL4YeP7eW+Vc8XZ4DwjYWBAiSwDV9Hm63JJWcz1Ie3Xjv4KuJXzgCstj48LkLfVCYa7mLcx7y+q6yqVvtw=="
},
"Microsoft.NET.StringTools": {
"type": "Transitive",
"resolved": "17.11.4",
+3 -2
View File
@@ -25,7 +25,8 @@
<PackageVersion Include="Revit.Async" Version="2.1.1" />
<PackageVersion Include="RhinoCommon" Version="8.9.24194.18121" />
<PackageVersion Include="RhinoWindows" Version="8.9.24194.18121" />
<PackageVersion Include="Speckle.CSI.API" Version="2.4.0" />
<PackageVersion Include="Semver" Version="3.0.0" />
<PackageVersion Include="Speckle.CSI.API" Version="2.4.0" />
<PackageVersion Include="Speckle.DoubleNumerics" Version="4.1.0" />
<PackageVersion Include="Speckle.Triangle" Version="1.0.0" />
<PackageVersion Include="Tekla.Structures.Dialog" Version="2024.0.4" PrivateAssets="all" IncludeAssets="compile; build" />
@@ -56,4 +57,4 @@
<GlobalPackageReference Include="Speckle.InterfaceGenerator" Version="0.9.6" />
<GlobalPackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" />
</ItemGroup>
</Project>
</Project>
@@ -7,7 +7,7 @@ namespace Speckle.Connectors.Common.Tests;
public class CancellationManagerTests
{
[Test]
public void CancelOne()
public void CancelOne2()
{
var manager = new CancellationManager();
manager.NumberOfOperations.Should().Be(0);
+1
View File
@@ -12,6 +12,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Config", "Config", "{85A13E
Directory.Packages.props = Directory.Packages.props
global.json = global.json
README.md = README.md
.config\dotnet-tools.json = .config\dotnet-tools.json
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Revit", "Revit", "{D92751C8-1039-4005-90B2-913E55E0B8BD}"