1
1
using Logicality . GitHub . Actions . Workflow ;
2
- using System . IO ;
2
+
3
+ Component [ ] components = [
4
+ new ( "ignore-this" , [ "IgnoreThis" ] , [ "IgnoreThis.Tests" ] ) ,
5
+ ] ;
3
6
4
7
void WriteWorkflow ( Workflow workflow , string fileName )
5
8
{
@@ -8,23 +11,15 @@ void WriteWorkflow(Workflow workflow, string fileName)
8
11
Console . WriteLine ( $ "Wrote workflow to { filePath } ") ;
9
12
}
10
13
11
-
12
- Component [ ] components = [
13
- new ( "ignore-this" , [ "IgnoreThis" ] , [ "IgnoreThis.Tests" ] ) ,
14
- ] ;
15
-
16
- ( string Key , string Value ) EnvSecret ( string key ) => ( key , $ "${{secrets.{ key } }}") ;
17
-
18
-
19
- foreach ( var component in components )
14
+ void GenerateCIWorkflow ( Component component )
20
15
{
21
16
var workflow = new Workflow ( $ "{ component . Name } -ci") ;
22
- var paths = new [ ] { $ ".github/workflows/{ component . Name } -ci ", $ "src/{ component . Name } /**" } ;
17
+ var paths = new [ ] { $ ".github/workflows/{ component . Name } -** ", $ "src/{ component . Name } /**" } ;
23
18
24
19
workflow . On . WorkflowDispatch ( ) ;
25
20
workflow . On
26
21
. Push ( )
27
- . Branches ( "main" ) ;
22
+ . Paths ( paths ) ;
28
23
workflow . On
29
24
. PullRequest ( )
30
25
. Paths ( paths ) ;
@@ -37,16 +32,61 @@ void WriteWorkflow(Workflow workflow, string fileName)
37
32
. Job ( "build" )
38
33
. Name ( "Build" )
39
34
. RunsOn ( GitHubHostedRunners . UbuntuLatest )
40
- . Defaults ( ) . Run ( "pwsh " , component . Name )
35
+ . Defaults ( ) . Run ( "bash " , component . Name )
41
36
. Job ;
42
37
43
- job . Step ( ) . ActionsCheckout ( ) ;
38
+ job . Step ( )
39
+ . ActionsCheckout ( ) ;
40
+
41
+ job . Step ( )
42
+ . ActionsSetupDotNet ( "8.0.x" ) ;
43
+
44
+ foreach ( var testProject in component . Tests )
45
+ {
46
+ job . StepTestAndReport ( testProject ) ;
47
+ }
48
+
49
+ job . StepInstallCACerts ( ) ;
50
+
51
+ job . StepToolRestore ( ) ;
52
+
53
+ foreach ( var project in component . Projects )
54
+ {
55
+ job . StepPack ( component . Name , project ) ;
56
+ }
57
+
58
+ job . StepSign ( ) ;
59
+
60
+ job . StepPush ( "MyGet" , "https://www.myget.org/F/duende_identityserver/api/v2/package" , "MYGET" ) ;
61
+
62
+ job . StepPush ( "GitHub" , "https://nuget.pkg.github.com/DuendeSoftware/index.json" , "GITHUB_TOKEN" )
63
+ . Env (
64
+ ( "GITHUB_TOKEN" , "${{ secrets.GITHUB_TOKEN }}" ) ,
65
+ ( "NUGET_AUTH_TOKEN" , "${{ secrets.GITHUB_TOKEN }}" ) ) ;
66
+
67
+ job . StepUploadArtifacts ( component . Name ) ;
68
+
69
+ var fileName = $ "{ component . Name } -ci";
70
+
71
+ WriteWorkflow ( workflow , fileName ) ;
72
+ }
73
+
74
+ foreach ( var component in components )
75
+ {
76
+ GenerateCIWorkflow ( component ) ;
77
+ }
78
+
79
+ record Component ( string Name , string [ ] Projects , string [ ] Tests ) ;
80
+
44
81
45
- job . Step ( ) . ActionsSetupDotNet ( "8.0.x" ) ;
82
+ public static class StepExtensions
83
+ {
84
+ public static Step IfRefMain ( this Step step )
85
+ => step . If ( "github.ref == 'refs/heads/main'" ) ;
46
86
47
- foreach ( var testProject in component . Tests )
87
+ public static void StepTestAndReport ( this Job job , string testProject )
48
88
{
49
- var path = $ "{ component . Name } / test/{ testProject } ";
89
+ var path = $ "test/{ testProject } ";
50
90
var logFileName = "Tests.trx" ;
51
91
var flags = $ "--logger \" console;verbosity=normal\" " +
52
92
$ "--logger \" trx;LogFileName={ logFileName } \" " +
@@ -67,19 +107,70 @@ void WriteWorkflow(Workflow workflow, string fileName)
67
107
( "fail-on-empty" , "true" ) ) ;
68
108
}
69
109
70
- job . Step ( )
71
- . Name ( "Install Sectigo CodeSiging CA certificates" )
72
- . Run ( """
73
- sudo apt-get update
74
- sudo apt-get install -y ca-certificates
75
- sudo cp build/SectigoPublicCodeSigningRootCrossAAA.crt /usr/local/share/ca-certificates/
76
- sudo update-ca-certificates
77
-
78
- """ ) ;
79
-
80
- var fileName = $ "{ component . Name } -ci-gen";
110
+ public static void StepInstallCACerts ( this Job job )
111
+ => job . Step ( )
112
+ . Name ( "Install Sectigo CodeSiging CA certificates" )
113
+ . IfRefMain ( )
114
+ . Run ( """
115
+ sudo apt-get update
116
+ sudo apt-get install -y ca-certificates
117
+ sudo cp build/SectigoPublicCodeSigningRootCrossAAA.crt /usr/local/share/ca-certificates/
118
+ sudo update-ca-certificates
119
+ """ ) ;
120
+
121
+ public static void StepToolRestore ( this Job job )
122
+ => job . Step ( )
123
+ . Name ( "Tool restore" )
124
+ . IfRefMain ( )
125
+ . Run ( "dotnet tool restore" ) ;
126
+
127
+ public static void StepPack ( this Job job , string componentName , string project )
128
+ {
129
+ var path = $ "{ componentName } /src/{ project } ";
130
+ job . Step ( )
131
+ . Name ( $ "Pack { project } ")
132
+ . IfRefMain ( )
133
+ . Run ( $ "dotnet pack -c Release { path } --no-build -o artifacts") ;
134
+ }
81
135
82
- WriteWorkflow ( workflow , fileName ) ;
83
- }
136
+ public static void StepSign ( this Job job )
137
+ {
138
+ var flags = "--file-digest sha256 " +
139
+ "--timestamp-rfc3161 http://timestamp.digicert.com " +
140
+ "--azure-key-vault-url https://duendecodesigning.vault.azure.net/ " +
141
+ "--azure-key-vault-client-id 18e3de68-2556-4345-8076-a46fad79e474 " +
142
+ "--azure-key-vault-tenant-id ed3089f0-5401-4758-90eb-066124e2d907 " +
143
+ "--azure-key-vault-client-secret ${{ secrets.SignClientSecret }} " +
144
+ "--azure-key-vault-certificate CodeSigning" ;
145
+ job . Step ( )
146
+ . Name ( "Sign packages" )
147
+ . IfRefMain ( )
148
+ . Run ( $ """
149
+ for file in artifacts/*.nupkg; do
150
+ dotnet NuGetKeyVaultSignTool sign \"$file\" { flags }
151
+ done
152
+ """ ) ;
153
+ }
84
154
85
- record Component ( string Name , string [ ] Projects , string [ ] Tests ) ;
155
+ public static Step StepPush ( this Job job , string destination , string sourceUrl , string secretName )
156
+ {
157
+ var apiKey = $ "${{ secrets.{ secretName } }}";
158
+ return job . Step ( )
159
+ . Name ( $ "Push packages to { destination } ")
160
+ . Run ( $ "dotnet nuget push artifacts/*.nupkg --source { sourceUrl } --api-key { apiKey } --skip-duplicate") ;
161
+ }
162
+
163
+ public static void StepUploadArtifacts ( this Job job , string componentName )
164
+ {
165
+ var path = $ "{ componentName } /artifacts/*.nupkg";
166
+ job . Step ( )
167
+ . Name ( "Upload Artifacts" )
168
+ . IfRefMain ( )
169
+ . Uses ( "actions/upload-artifact@v4" )
170
+ . With (
171
+ ( "name" , "Upload Artifacts" ) ,
172
+ ( "path" , path ) ,
173
+ ( "overwrite" , "true" ) ,
174
+ ( "retention-days" , "15" ) ) ;
175
+ }
176
+ }
0 commit comments