Skip to content
Open
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ dotnet_style_readonly_field = true:error

# CSharp code style settings:
[*.cs]
end_of_line = lf
# Prefer "var" everywhere
csharp_style_var_for_built_in_types = true:error
csharp_style_var_when_type_is_apparent = true:error
Expand Down
52 changes: 29 additions & 23 deletions aspire/AppHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ internal static async Task Run(
bool assumeCloned = false,
bool assumeBuild = false,
bool skipPrivateRepositories = false,
CancellationToken ct = default)
CancellationToken ct = default
)
{
var builder = DistributedApplication.CreateBuilder();

Expand All @@ -49,15 +50,14 @@ internal static async Task Run(

var buildAll = builder.AddProject<Projects.docs_builder>(AssemblerBuild);
string[] buildArgs = assumeBuild ? ["--assume-build"] : [];
buildAll = buildAll
.WithArgs(["assembler", "build", .. GlobalArguments, .. buildArgs])
.WaitForCompletion(cloneAll)
.WithParentRelationship(cloneAll);
buildAll =
buildAll.WithArgs(["assembler", "build", .. GlobalArguments, .. buildArgs])
.WaitForCompletion(cloneAll)
.WithParentRelationship(cloneAll);

IResourceBuilder<ElasticsearchResource>? elasticsearchLocal = null;
if (startElasticsearch)
elasticsearchLocal = builder.AddElasticsearch(ElasticsearchLocal)
.WithEnvironment("LICENSE", "trial");
elasticsearchLocal = builder.AddElasticsearch(ElasticsearchLocal).WithEnvironment("LICENSE", "trial");

var elasticsearchRemote = builder.AddExternalService(ElasticsearchRemote, elasticsearchUrl);

Expand All @@ -78,10 +78,12 @@ internal static async Task Run(

// ReSharper disable once RedundantAssignment
api = startElasticsearch
? api
.WithReference(elasticsearchLocal!)
? api.WithReference(elasticsearchLocal!)
.WithEnvironment("DOCUMENTATION_ELASTIC_URL", elasticsearchLocal!.GetEndpoint("http"))
.WithEnvironment(context => context.EnvironmentVariables["DOCUMENTATION_ELASTIC_PASSWORD"] = elasticsearchLocal!.Resource.PasswordParameter)
.WithEnvironment(
context =>
context.EnvironmentVariables["DOCUMENTATION_ELASTIC_PASSWORD"] = elasticsearchLocal!.Resource.PasswordParameter
)
.WithParentRelationship(elasticsearchLocal!)
.WaitFor(elasticsearchLocal!)
: api.WithReference(elasticsearchRemote)
Expand All @@ -96,10 +98,12 @@ internal static async Task Run(

// ReSharper disable once RedundantAssignment
mcp = startElasticsearch
? mcp
.WithReference(elasticsearchLocal!)
? mcp.WithReference(elasticsearchLocal!)
.WithEnvironment("DOCUMENTATION_ELASTIC_URL", elasticsearchLocal!.GetEndpoint("http"))
.WithEnvironment(context => context.EnvironmentVariables["DOCUMENTATION_ELASTIC_PASSWORD"] = elasticsearchLocal!.Resource.PasswordParameter)
.WithEnvironment(
context =>
context.EnvironmentVariables["DOCUMENTATION_ELASTIC_PASSWORD"] = elasticsearchLocal!.Resource.PasswordParameter
)
.WithParentRelationship(elasticsearchLocal!)
.WaitFor(elasticsearchLocal!)
: mcp.WithReference(elasticsearchRemote)
Expand All @@ -113,14 +117,15 @@ internal static async Task Run(

// ReSharper disable once RedundantAssignment
indexElasticsearch = startElasticsearch
? indexElasticsearch
.WaitFor(elasticsearchLocal!)
? indexElasticsearch.WaitFor(elasticsearchLocal!)
.WithReference(elasticsearchLocal!)
.WithEnvironment("DOCUMENTATION_ELASTIC_URL", elasticsearchLocal!.GetEndpoint("http"))
.WithEnvironment(context => context.EnvironmentVariables["DOCUMENTATION_ELASTIC_PASSWORD"] = elasticsearchLocal!.Resource.PasswordParameter)
.WithEnvironment(
context =>
context.EnvironmentVariables["DOCUMENTATION_ELASTIC_PASSWORD"] = elasticsearchLocal!.Resource.PasswordParameter
)
.WithParentRelationship(elasticsearchLocal!)
: indexElasticsearch
.WithReference(elasticsearchRemote)
: indexElasticsearch.WithReference(elasticsearchRemote)
.WithEnvironment("DOCUMENTATION_ELASTIC_URL", elasticsearchUrl)
.WithEnvironment("DOCUMENTATION_ELASTIC_APIKEY", elasticsearchApiKey)
.WithParentRelationship(elasticsearchRemote);
Expand All @@ -135,12 +140,13 @@ internal static async Task Run(
.WithParentRelationship(cloneAll);

serveStatic = startElasticsearch
? serveStatic
.WithReference(elasticsearchLocal!)
? serveStatic.WithReference(elasticsearchLocal!)
.WithEnvironment("DOCUMENTATION_ELASTIC_URL", elasticsearchLocal!.GetEndpoint("http"))
.WithEnvironment(context => context.EnvironmentVariables["DOCUMENTATION_ELASTIC_PASSWORD"] = elasticsearchLocal!.Resource.PasswordParameter)
: serveStatic
.WithReference(elasticsearchRemote)
.WithEnvironment(
context =>
context.EnvironmentVariables["DOCUMENTATION_ELASTIC_PASSWORD"] = elasticsearchLocal!.Resource.PasswordParameter
)
: serveStatic.WithReference(elasticsearchRemote)
.WithEnvironment("DOCUMENTATION_ELASTIC_URL", elasticsearchUrl)
.WithEnvironment("DOCUMENTATION_ELASTIC_APIKEY", elasticsearchApiKey);

Expand Down
153 changes: 82 additions & 71 deletions build/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,99 +11,110 @@

var app = ConsoleApp.Create();

app.Add("", async Task (Cancel _) =>
{
await "dotnet tool restore";
await "dotnet build -c Release --verbosity minimal";
await "dotnet test --configuration Release --logger GitHubActions -- RunConfiguration.CollectSourceInformation=true";
});
app.Add(
"",
async Task (Cancel _) =>
{
await "dotnet tool restore";
await "dotnet build -c Release --verbosity minimal";
await "dotnet test --configuration Release --logger GitHubActions -- RunConfiguration.CollectSourceInformation=true";
}
);

// this is manual for now and quite hacky.
// this ensures we download the actual LICENSE files in the repositories.
// NOT the SPDX html from licenses.nuget.org

app.Add("notices", async Task<int> (Cancel ctx) =>
{
var packages = await "dotnet thirdlicense --project src/docs-builder/docs-builder.csproj --output NOTICE.txt";
var packageLines = packages.Split(Environment.NewLine).Where(l => l.StartsWith("+"));
app.Add(
"notices",
async Task<int> (Cancel ctx) =>
{
var packages = await "dotnet thirdlicense --project src/docs-builder/docs-builder.csproj --output NOTICE.txt";
var packageLines = packages.Split(Environment.NewLine).Where(l => l.StartsWith("+"));

await File.WriteAllTextAsync("NOTICE.txt",
$"""
await File.WriteAllTextAsync(
"NOTICE.txt",
$"""
Elastic Documentation Tooling
Copyright 2024-{DateTime.UtcNow.Year} Elasticsearch B.V.


""", ctx);

""",
ctx
);

Console.WriteLine("Package lines:");
foreach (var line in packageLines)
{
var package = line.Split('+', '(')[1].ToLowerInvariant().Trim();
var version = line.Split('(', ')')[1].TrimStart('v').Trim();
if (package.StartsWith("microsoft.") || package.StartsWith("system"))
continue;

var text = await fetchText($"https://api.nuget.org/v3-flatcontainer/{package}/{version}/{package}.nuspec");
var xml = XDocument.Load(new StringReader(text));
var projectUrl = xml.XPathSelectElement("//*[local-name()='projectUrl']")?.Value;
var id = xml.XPathSelectElement("//*[local-name()='id']")?.Value;
projectUrl = projectUrl?.Replace("/wiki", string.Empty);

if (projectUrl is null || projectUrl.Contains(".github.com"))
throw new Exception($"Can not download license for {id}: {projectUrl}");

var rawUrl = projectUrl.Replace("github.com", "raw.githubusercontent.com");
string[] targets =
[
rawUrl + $"/refs/heads/master/" + "LICENSE.txt",
rawUrl + $"/refs/heads/master/" + "license.txt",
rawUrl + $"/refs/heads/master/" + "LICENSE",
rawUrl + $"/refs/heads/master/" + "LICENSE.md",
rawUrl + $"/refs/heads/main/" + "LICENSE.txt",
rawUrl + $"/refs/heads/main/" + "license.txt",
rawUrl + $"/refs/heads/main/" + "LICENSE",
rawUrl + $"/refs/heads/main/" + "LICENSE.md",
];
var license = string.Empty;
foreach (var target in targets)
Console.WriteLine("Package lines:");
foreach (var line in packageLines)
{
Console.WriteLine($"Downloading license for {id}: {target}");
try
var package = line.Split('+', '(')[1].ToLowerInvariant().Trim();
var version = line.Split('(', ')')[1].TrimStart('v').Trim();
if (package.StartsWith("microsoft.") || package.StartsWith("system"))
continue;

var text = await fetchText($"https://api.nuget.org/v3-flatcontainer/{package}/{version}/{package}.nuspec");
var xml = XDocument.Load(new StringReader(text));
var projectUrl = xml.XPathSelectElement("//*[local-name()='projectUrl']")?.Value;
var id = xml.XPathSelectElement("//*[local-name()='id']")?.Value;
projectUrl = projectUrl?.Replace("/wiki", string.Empty);

if (projectUrl is null || projectUrl.Contains(".github.com"))
throw new Exception($"Can not download license for {id}: {projectUrl}");

var rawUrl = projectUrl.Replace("github.com", "raw.githubusercontent.com");
string[] targets =
[
rawUrl + $"/refs/heads/master/" + "LICENSE.txt",
rawUrl + $"/refs/heads/master/" + "license.txt",
rawUrl + $"/refs/heads/master/" + "LICENSE",
rawUrl + $"/refs/heads/master/" + "LICENSE.md",
rawUrl + $"/refs/heads/main/" + "LICENSE.txt",
rawUrl + $"/refs/heads/main/" + "license.txt",
rawUrl + $"/refs/heads/main/" + "LICENSE",
rawUrl + $"/refs/heads/main/" + "LICENSE.md",
];
var license = string.Empty;
foreach (var target in targets)
{
license = await fetchText(target);
Console.WriteLine($"Downloading license for {id}: {target}");
try
{
license = await fetchText(target);
}
catch { }
if (license.Length > 0)
break;
}
catch { }
if (license.Length > 0)
break;
}

if (string.IsNullOrWhiteSpace(license))
throw new Exception($"Can not download license for {id}: {projectUrl}");
if (string.IsNullOrWhiteSpace(license))
throw new Exception($"Can not download license for {id}: {projectUrl}");

await File.AppendAllTextAsync("NOTICE.txt",
$"""
await File.AppendAllTextAsync(
"NOTICE.txt",
$"""
License notice for {id} (v{version})
------------------------------------
{license}


""", ctx);
}
""",
ctx
);
}

try
{
await "git status --porcelain";
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.WriteLine("The build left unchecked artifacts in the source folder");
await "git diff NOTICE.txt";
return 1;
}
try
{
await "git status --porcelain";
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.WriteLine("The build left unchecked artifacts in the source folder");
await "git diff NOTICE.txt";
return 1;
}

return 0;
});
return 0;
}
);

await app.RunAsync(args);
Loading
Loading