Skip to content

Commit 3a6c226

Browse files
reset build program to main
1 parent 5761041 commit 3a6c226

10 files changed

+217
-185
lines changed

.github/workflow-gen/Program.cs

Lines changed: 99 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) Duende Software. All rights reserved.
1+
// Copyright (c) Duende Software. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33

44
using Logicality.GitHub.Actions.Workflow;
@@ -33,9 +33,12 @@
3333
GenerateReleaseWorkflow(component);
3434
}
3535

36+
GenerateUploadTestResultsWorkflow();
37+
38+
3639
void GenerateCiWorkflow(Component component)
3740
{
38-
var workflow = new Workflow($"{component.Name}/ci");
41+
var workflow = new Workflow(component.CiWorkflowName);
3942
var paths = new[]
4043
{
4144
$".github/workflows/{component.Name}-**",
@@ -49,7 +52,7 @@ void GenerateCiWorkflow(Component component)
4952
.Push()
5053
.Paths(paths);
5154
workflow.On
52-
.PullRequestTarget()
55+
.PullRequest()
5356
.Paths(paths);
5457

5558
workflow.EnvDefaults();
@@ -76,10 +79,10 @@ void GenerateCiWorkflow(Component component)
7679

7780
foreach (var testProject in component.Tests)
7881
{
79-
job.StepTestAndReport(component.Name, testProject);
82+
job.StepTest(component.Name, testProject);
8083
}
8184

82-
job.StepInstallCACerts();
85+
job.StepUploadTestResultsAsArtifact(component);
8386

8487
job.StepToolRestore();
8588

@@ -90,8 +93,6 @@ void GenerateCiWorkflow(Component component)
9093

9194
job.StepSign();
9295

93-
job.StepPush("MyGet", "https://www.myget.org/F/duende_identityserver/api/v2/package", "MYGET");
94-
9596
job.StepPush("GitHub", "https://nuget.pkg.github.com/DuendeSoftware/index.json", "GITHUB_TOKEN")
9697
.Env(("GITHUB_TOKEN", contexts.Secrets.GitHubToken),
9798
("NUGET_AUTH_TOKEN", contexts.Secrets.GitHubToken));
@@ -104,7 +105,7 @@ void GenerateCiWorkflow(Component component)
104105

105106
void GenerateReleaseWorkflow(Component component)
106107
{
107-
var workflow = new Workflow($"{component.Name}/release");
108+
var workflow = new Workflow(component.ReleaseWorkflowName);
108109

109110
workflow.On
110111
.WorkflowDispatch()
@@ -138,16 +139,14 @@ git config --global user.name ""Duende Software GitHub Bot""
138139
git tag -a {component.TagPrefix}-{contexts.Event.Input.Version} -m ""Release v{contexts.Event.Input.Version}""
139140
git push origin {component.TagPrefix}-{contexts.Event.Input.Version}");
140141

141-
tagJob.StepInstallCACerts();
142-
143142
foreach (var project in component.Projects)
144143
{
145144
tagJob.StepPack(project);
146145
}
147146

148147
tagJob.StepToolRestore();
149148

150-
tagJob.StepSign();
149+
tagJob.StepSign(true);
151150

152151
tagJob.StepPush("MyGet", "https://www.myget.org/F/duende_identityserver/api/v2/package", "MYGET");
153152

@@ -160,8 +159,7 @@ git tag -a {component.TagPrefix}-{contexts.Event.Input.Version} -m ""Release v{c
160159
var publishJob = workflow.Job("publish")
161160
.Name("Publish to nuget.org")
162161
.RunsOn(GitHubHostedRunners.UbuntuLatest)
163-
.Needs("tag")
164-
.Environment("nuget.org", "");
162+
.Needs("tag");
165163

166164
publishJob.Step()
167165
.Uses("actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16") // 4.1.8
@@ -180,20 +178,55 @@ git tag -a {component.TagPrefix}-{contexts.Event.Input.Version} -m ""Release v{c
180178
WriteWorkflow(workflow, fileName);
181179
}
182180

181+
void GenerateUploadTestResultsWorkflow()
182+
{
183+
var workflow = new Workflow("generate-test-reports");
184+
workflow.On
185+
.WorkflowRun()
186+
.Workflows(components.Select(x => x.CiWorkflowName).ToArray())
187+
.Types("completed");
188+
189+
var job = workflow
190+
.Job("report")
191+
.Name("report")
192+
.RunsOn(GitHubHostedRunners.UbuntuLatest);
193+
194+
job.Permissions(
195+
actions: Permission.Read,
196+
contents: Permission.Read,
197+
checks: Permission.Write,
198+
packages: Permission.Write);
199+
200+
foreach (var component in components)
201+
{
202+
foreach (var testProject in component.Tests)
203+
{
204+
job.StepGenerateReportFromTestArtifact(component, testProject);
205+
}
206+
}
207+
208+
var fileName = $"generate-test-reports";
209+
WriteWorkflow(workflow, fileName);
210+
}
211+
183212
void WriteWorkflow(Workflow workflow, string fileName)
184213
{
185214
var filePath = $"../workflows/{fileName}.yml";
186215
workflow.WriteYaml(filePath);
187216
Console.WriteLine($"Wrote workflow to {filePath}");
188217
}
189218

190-
record Component(string Name, string[] Projects, string[] Tests, string TagPrefix);
219+
record Component(string Name, string[] Projects, string[] Tests, string TagPrefix)
220+
{
221+
public string CiWorkflowName => $"{Name}/ci";
222+
public string ReleaseWorkflowName => $"{Name}/release";
223+
}
191224

192225
public static class StepExtensions
193226
{
194227
public static void EnvDefaults(this Workflow workflow)
195228
=> workflow.Env(
196-
("DOTNETT_NOLOGO", "true"),
229+
("DOTNET_NOLOGO", "true"),
197230
("DOTNET_CLI_TELEMETRY_OPTOUT", "true"));
198231

199232
public static void StepSetupDotNet(this Job job)
@@ -204,41 +237,48 @@ public static void StepSetupDotNet(this Job job)
204237
public static Step IfRefMain(this Step step)
205238
=> step.If("github.ref == 'refs/heads/main'");
206239

207-
public static void StepTestAndReport(this Job job, string componentName, string testProject)
240+
public static void StepTest(this Job job, string componentName, string testProject)
208241
{
209242
var path = $"test/{testProject}";
210-
var logFileName = "Tests.trx";
243+
var logFileName = $"{testProject}.trx";
211244
var flags = $"--logger \"console;verbosity=normal\" " +
212245
$"--logger \"trx;LogFileName={logFileName}\" " +
213246
$"--collect:\"XPlat Code Coverage\"";
214247
job.Step()
215248
.Name($"Test - {testProject}")
216249
.Run($"dotnet test -c Release {path} {flags}");
217250

251+
}
252+
253+
internal static void StepUploadTestResultsAsArtifact(this Job job, Component component)
254+
{
218255
job.Step()
219-
.Name($"Test report - {testProject}")
220-
.Uses("dorny/test-reporter@31a54ee7ebcacc03a09ea97a7e5465a47b84aea5") // v1.9.1
256+
.Name($"Test report")
221257
.If("success() || failure()")
258+
.Uses("actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882") // 4.4.3
259+
.With(
260+
("name", "test-results"),
261+
("path", string.Join(Environment.NewLine, component.Tests
262+
.Select(testProject => $"{component.Name}/test/{testProject}/TestResults/{testProject}.trx"))),
263+
("retention-days", "5"));
264+
}
265+
266+
internal static void StepGenerateReportFromTestArtifact(this Job job, Component component, string testProject)
267+
{
268+
var path = $"test/{testProject}";
269+
job.Step()
270+
.Name($"Test report - {component.Name} - {testProject}")
271+
.Uses("dorny/test-reporter@31a54ee7ebcacc03a09ea97a7e5465a47b84aea5") // v1.9.1
272+
.If($"github.event.workflow.name == '{component.CiWorkflowName}'")
222273
.With(
274+
("artifact", "test-results"),
223275
("name", $"Test Report - {testProject}"),
224-
("path", $"{componentName}/{path}/TestResults/{logFileName}"),
276+
("path", $"{testProject}.trx"),
225277
("reporter", "dotnet-trx"),
226278
("fail-on-error", "true"),
227279
("fail-on-empty", "true"));
228280
}
229281

230-
// These intermediate certificates are required for signing and are not installed on the GitHub runners by default.
231-
public static void StepInstallCACerts(this Job job)
232-
=> job.Step()
233-
.Name("Install Sectigo CodeSiging CA certificates")
234-
.WorkingDirectory(".github/workflows")
235-
.Run("""
236-
sudo apt-get update
237-
sudo apt-get install -y ca-certificates
238-
sudo cp SectigoPublicCodeSigningRootCrossAAA.crt /usr/local/share/ca-certificates/
239-
sudo update-ca-certificates
240-
""");
241-
242282
public static void StepToolRestore(this Job job)
243283
=> job.Step()
244284
.Name("Tool restore")
@@ -252,23 +292,33 @@ public static void StepPack(this Job job, string project)
252292
.Run($"dotnet pack -c Release {path} -o artifacts");
253293
}
254294

255-
public static void StepSign(this Job job)
295+
public static void StepSign(this Job job, bool always = false)
256296
{
257-
var flags = "--file-digest sha256 " +
258-
"--timestamp-rfc3161 http://timestamp.digicert.com " +
259-
"--azure-key-vault-url https://duendecodesigning.vault.azure.net/ " +
260-
"--azure-key-vault-client-id 18e3de68-2556-4345-8076-a46fad79e474 " +
261-
"--azure-key-vault-tenant-id ed3089f0-5401-4758-90eb-066124e2d907 " +
262-
"--azure-key-vault-client-secret ${{ secrets.SignClientSecret }} " +
263-
"--azure-key-vault-certificate CodeSigning";
264-
job.Step()
265-
.Name("Sign packages")
266-
.Run($"""
267-
for file in artifacts/*.nupkg; do
268-
dotnet NuGetKeyVaultSignTool sign "$file" {flags}
269-
done
270-
""");
297+
var flags = "--file-digest sha256 " +
298+
"--timestamp-rfc3161 http://timestamp.digicert.com " +
299+
"--azure-key-vault-url https://duendecodesigninghsm.vault.azure.net/ " +
300+
"--azure-key-vault-client-id 18e3de68-2556-4345-8076-a46fad79e474 " +
301+
"--azure-key-vault-tenant-id ed3089f0-5401-4758-90eb-066124e2d907 " +
302+
"--azure-key-vault-client-secret ${{ secrets.SignClientSecret }} " +
303+
"--azure-key-vault-certificate NuGetPackageSigning";
304+
var step = job.Step()
305+
.Name("Sign packages");
306+
if (!always)
307+
{
308+
step = step.IfGithubEventIsPush();
309+
}
310+
step.Run($"""
311+
for file in artifacts/*.nupkg; do
312+
dotnet NuGetKeyVaultSignTool sign "$file" {flags}
313+
done
314+
""");
271315
}
316+
/// <summary>
317+
/// Only run this if the build is triggered on a branch IN the same repo
318+
/// this means it's from a trusted contributor.
319+
/// </summary>
320+
public static Step IfGithubEventIsPush(this Step step)
321+
=> step.If("github.event_name == 'push'");
272322

273323
public static Step StepPush(this Job job, string destination, string sourceUrl, string secretName)
274324
{
@@ -284,7 +334,7 @@ public static void StepUploadArtifacts(this Job job, string componentName)
284334
var path = $"{componentName}/artifacts/*.nupkg";
285335
job.Step()
286336
.Name("Upload Artifacts")
287-
.IfRefMain()
337+
.IfGithubEventIsPush()
288338
.Uses("actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882") // 4.4.3
289339
.With(
290340
("name", "artifacts"),
@@ -326,4 +376,4 @@ public class EventsInputContext() : Context("github.event.inputs")
326376
{
327377
public string Version => Expression($"{Name}.version");
328378
}
329-
}
379+
}

.github/workflows/access-token-management-ci.yml

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ on:
88
- .github/workflows/access-token-management-**
99
- access-token-management/**
1010
- Directory.Packages.props
11-
pull_request_target:
11+
pull_request:
1212
paths:
1313
- .github/workflows/access-token-management-**
1414
- access-token-management/**
1515
- Directory.Packages.props
1616
env:
17-
DOTNETT_NOLOGO: true
17+
DOTNET_NOLOGO: true
1818
DOTNET_CLI_TELEMETRY_OPTOUT: true
1919
jobs:
2020
build:
@@ -43,45 +43,34 @@ jobs:
4343
8.0.x
4444
9.0.x
4545
- name: Test - AccessTokenManagement.Tests
46-
run: dotnet test -c Release test/AccessTokenManagement.Tests --logger "console;verbosity=normal" --logger "trx;LogFileName=Tests.trx" --collect:"XPlat Code Coverage"
47-
- name: Test report - AccessTokenManagement.Tests
46+
run: dotnet test -c Release test/AccessTokenManagement.Tests --logger "console;verbosity=normal" --logger "trx;LogFileName=AccessTokenManagement.Tests.trx" --collect:"XPlat Code Coverage"
47+
- name: Test report
4848
if: success() || failure()
49-
uses: dorny/test-reporter@31a54ee7ebcacc03a09ea97a7e5465a47b84aea5
49+
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
5050
with:
51-
name: Test Report - AccessTokenManagement.Tests
52-
path: access-token-management/test/AccessTokenManagement.Tests/TestResults/Tests.trx
53-
reporter: dotnet-trx
54-
fail-on-error: true
55-
fail-on-empty: true
56-
- name: Install Sectigo CodeSiging CA certificates
57-
run: |-
58-
sudo apt-get update
59-
sudo apt-get install -y ca-certificates
60-
sudo cp SectigoPublicCodeSigningRootCrossAAA.crt /usr/local/share/ca-certificates/
61-
sudo update-ca-certificates
62-
working-directory: .github/workflows
51+
name: test-results
52+
path: access-token-management/test/AccessTokenManagement.Tests/TestResults/AccessTokenManagement.Tests.trx
53+
retention-days: 5
6354
- name: Tool restore
6455
run: dotnet tool restore
6556
- name: Pack AccessTokenManagement
6657
run: dotnet pack -c Release src/AccessTokenManagement -o artifacts
6758
- name: Pack AccessTokenManagement.OpenIdConnect
6859
run: dotnet pack -c Release src/AccessTokenManagement.OpenIdConnect -o artifacts
6960
- name: Sign packages
61+
if: github.event_name == 'push'
7062
run: |-
7163
for file in artifacts/*.nupkg; do
72-
dotnet NuGetKeyVaultSignTool sign "$file" --file-digest sha256 --timestamp-rfc3161 http://timestamp.digicert.com --azure-key-vault-url https://duendecodesigning.vault.azure.net/ --azure-key-vault-client-id 18e3de68-2556-4345-8076-a46fad79e474 --azure-key-vault-tenant-id ed3089f0-5401-4758-90eb-066124e2d907 --azure-key-vault-client-secret ${{ secrets.SignClientSecret }} --azure-key-vault-certificate CodeSigning
64+
dotnet NuGetKeyVaultSignTool sign "$file" --file-digest sha256 --timestamp-rfc3161 http://timestamp.digicert.com --azure-key-vault-url https://duendecodesigninghsm.vault.azure.net/ --azure-key-vault-client-id 18e3de68-2556-4345-8076-a46fad79e474 --azure-key-vault-tenant-id ed3089f0-5401-4758-90eb-066124e2d907 --azure-key-vault-client-secret ${{ secrets.SignClientSecret }} --azure-key-vault-certificate NuGetPackageSigning
7365
done
74-
- name: Push packages to MyGet
75-
if: github.ref == 'refs/heads/main'
76-
run: dotnet nuget push artifacts/*.nupkg --source https://www.myget.org/F/duende_identityserver/api/v2/package --api-key ${{ secrets.MYGET }} --skip-duplicate
7766
- name: Push packages to GitHub
7867
if: github.ref == 'refs/heads/main'
7968
run: dotnet nuget push artifacts/*.nupkg --source https://nuget.pkg.github.com/DuendeSoftware/index.json --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate
8069
env:
8170
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
8271
NUGET_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
8372
- name: Upload Artifacts
84-
if: github.ref == 'refs/heads/main'
73+
if: github.event_name == 'push'
8574
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
8675
with:
8776
name: artifacts

.github/workflows/access-token-management-release.yml

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ on:
1515
required: false
1616
default: 'main'
1717
env:
18-
DOTNETT_NOLOGO: true
18+
DOTNET_NOLOGO: true
1919
DOTNET_CLI_TELEMETRY_OPTOUT: true
2020
jobs:
2121
tag:
@@ -49,13 +49,6 @@ jobs:
4949
git config --global user.name "Duende Software GitHub Bot"
5050
git tag -a atm-${{ github.event.inputs.version }} -m "Release v${{ github.event.inputs.version }}"
5151
git push origin atm-${{ github.event.inputs.version }}
52-
- name: Install Sectigo CodeSiging CA certificates
53-
run: |-
54-
sudo apt-get update
55-
sudo apt-get install -y ca-certificates
56-
sudo cp SectigoPublicCodeSigningRootCrossAAA.crt /usr/local/share/ca-certificates/
57-
sudo update-ca-certificates
58-
working-directory: .github/workflows
5952
- name: Pack AccessTokenManagement
6053
run: dotnet pack -c Release src/AccessTokenManagement -o artifacts
6154
- name: Pack AccessTokenManagement.OpenIdConnect
@@ -65,7 +58,7 @@ jobs:
6558
- name: Sign packages
6659
run: |-
6760
for file in artifacts/*.nupkg; do
68-
dotnet NuGetKeyVaultSignTool sign "$file" --file-digest sha256 --timestamp-rfc3161 http://timestamp.digicert.com --azure-key-vault-url https://duendecodesigning.vault.azure.net/ --azure-key-vault-client-id 18e3de68-2556-4345-8076-a46fad79e474 --azure-key-vault-tenant-id ed3089f0-5401-4758-90eb-066124e2d907 --azure-key-vault-client-secret ${{ secrets.SignClientSecret }} --azure-key-vault-certificate CodeSigning
61+
dotnet NuGetKeyVaultSignTool sign "$file" --file-digest sha256 --timestamp-rfc3161 http://timestamp.digicert.com --azure-key-vault-url https://duendecodesigninghsm.vault.azure.net/ --azure-key-vault-client-id 18e3de68-2556-4345-8076-a46fad79e474 --azure-key-vault-tenant-id ed3089f0-5401-4758-90eb-066124e2d907 --azure-key-vault-client-secret ${{ secrets.SignClientSecret }} --azure-key-vault-certificate NuGetPackageSigning
6962
done
7063
- name: Push packages to MyGet
7164
if: github.ref == 'refs/heads/main'
@@ -77,7 +70,7 @@ jobs:
7770
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
7871
NUGET_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
7972
- name: Upload Artifacts
80-
if: github.ref == 'refs/heads/main'
73+
if: github.event_name == 'push'
8174
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
8275
with:
8376
name: artifacts
@@ -89,8 +82,6 @@ jobs:
8982
needs:
9083
- tag
9184
runs-on: ubuntu-latest
92-
environment:
93-
name: nuget.org
9485
steps:
9586
- uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
9687
with:

0 commit comments

Comments
 (0)