1
+ name : CI/CD Pipeline
2
+
3
+ on : [push, pull_request, workflow_dispatch]
4
+
5
+ jobs :
6
+ ci :
7
+ name : Continuous Integration
8
+ runs-on : ubuntu-latest
9
+ outputs :
10
+ latest_version : ${{ steps.tag_generator.outputs.new_version }}
11
+ is_default_branch : ${{ steps.conditionals_handler.outputs.is_default_branch }}
12
+ env :
13
+ ARTIFACTS_FOLDER : ${{ github.workspace }}/Artifacts
14
+ GITHUB_RUN_NUMBER : ${{ github.run_number }}
15
+ steps :
16
+ - name : Setup .NET
17
+ uses : actions/setup-dotnet@v1
18
+ with :
19
+ dotnet-version : 5.0.x
20
+
21
+ - name : Data gatherer
22
+ id : data_gatherer
23
+ shell : pwsh
24
+ run : |
25
+ # Get default branch
26
+ $repo = 'microsoft/OpenAPI.NET'
27
+ $defaultBranch = Invoke-RestMethod -Method GET -Uri https://api.github.com/repos/$repo | Select-Object -ExpandProperty default_branch
28
+ Write-Output "::set-output name=default_branch::$(echo $defaultBranch)"
29
+
30
+ - name : Conditionals handler
31
+ id : conditionals_handler
32
+ shell : pwsh
33
+ run : |
34
+ $defaultBranch = "${{ steps.data_gatherer.outputs.default_branch }}"
35
+ $githubRef = "${{ github.ref }}"
36
+ $isDefaultBranch = 'false'
37
+ if ( $githubRef -like "*$defaultBranch*" ) {
38
+ $isDefaultBranch = 'true'
39
+ }
40
+ Write-Output "::set-output name=is_default_branch::$(echo $isDefaultBranch)"
41
+
42
+ - name : Checkout repository
43
+ id : checkout_repo
44
+ uses : actions/checkout@v2
45
+ with :
46
+ token : ${{ secrets.GITHUB_TOKEN }}
47
+ fetch-depth : 0
48
+
49
+ - if : steps.conditionals_handler.outputs.is_default_branch == 'true'
50
+ name : Bump GH tag
51
+ id : tag_generator
52
+ uses :
mathieudutour/[email protected]
53
+ with :
54
+ github_token : ${{ secrets.GITHUB_TOKEN }}
55
+ default_bump : false
56
+ release_branches : ${{ steps.data_gatherer.outputs.default_branch }}
57
+
58
+ - name : Build projects
59
+ id : build_projects
60
+ shell : pwsh
61
+ run : |
62
+ $projectsArray = @(
63
+ '.\src\Microsoft.OpenApi\Microsoft.OpenApi.csproj',
64
+ '.\src\Microsoft.OpenApi.Readers\Microsoft.OpenApi.Readers.csproj',
65
+ '.\src\Microsoft.OpenApi.Tool\Microsoft.OpenApi.Tool.csproj'
66
+ )
67
+ $gitNewVersion = if ("${{ steps.tag_generator.outputs.new_version }}") {"${{ steps.tag_generator.outputs.new_version }}"} else {$null}
68
+ $projectCurrentVersion = ([xml](Get-Content .\src\Microsoft.OpenApi\Microsoft.OpenApi.csproj)).Project.PropertyGroup.Version
69
+ $projectNewVersion = $gitNewVersion ?? $projectCurrentVersion
70
+
71
+ $projectsArray | ForEach-Object {
72
+ dotnet build $PSItem `
73
+ -c Release `
74
+ -o $env:ARTIFACTS_FOLDER `
75
+ /p:Version=$projectNewVersion
76
+ }
77
+
78
+ # Move NuGet packages to separate folder for pipeline convenience
79
+ New-Item Artifacts/NuGet -ItemType Directory
80
+ Get-ChildItem Artifacts/*.nupkg | Move-Item -Destination "Artifacts/NuGet"
81
+
82
+ - name : Run unit tests
83
+ id : run_unit_tests
84
+ shell : pwsh
85
+ run : |
86
+ $testProjectsArray = @(
87
+ '.\test\Microsoft.OpenApi.Tests\Microsoft.OpenApi.Tests.csproj',
88
+ '.\test\Microsoft.OpenApi.Readers.Tests\Microsoft.OpenApi.Readers.Tests.csproj',
89
+ '.\test\Microsoft.OpenApi.SmokeTests\Microsoft.OpenApi.SmokeTests.csproj'
90
+ )
91
+
92
+ $testProjectsArray | ForEach-Object {
93
+ dotnet test $PSItem `
94
+ -c Release
95
+ }
96
+
97
+ - if : steps.tag_generator.outputs.new_version != ''
98
+ name : Upload NuGet packages as artifacts
99
+ id : ul_packages_artifact
100
+ uses : actions/upload-artifact@v1
101
+ with :
102
+ name : NuGet packages
103
+ path : Artifacts/NuGet/
104
+
105
+ cd :
106
+ if : needs.ci.outputs.is_default_branch == 'true' && needs.ci.outputs.latest_version != ''
107
+ name : Continuous Deployment
108
+ needs : ci
109
+ runs-on : ubuntu-latest
110
+ steps :
111
+ - name : Download and extract NuGet packages
112
+ id : dl_packages_artifact
113
+ uses : actions/download-artifact@v2
114
+ with :
115
+ name : NuGet packages
116
+ path : NuGet/
117
+
118
+ - name : Push NuGet packages to NuGet.org
119
+ id : push_nuget_packages
120
+ continue-on-error : true
121
+ shell : pwsh
122
+ run : |
123
+ Get-ChildItem NuGet/*.nupkg | ForEach-Object {
124
+ nuget push $PSItem `
125
+ -ApiKey $env:NUGET_API_KEY `
126
+ -Source https://api.nuget.org/v3/index.json
127
+ }
128
+ env :
129
+ NUGET_API_KEY : ${{ secrets.NUGET_API_KEY }}
130
+
131
+ - name : Create and publish release
132
+ id : create_release
133
+ uses : actions/create-release@v1
134
+ with :
135
+ tag_name : v${{ needs.ci.outputs.latest_version }}
136
+ release_name : OpenApi v${{ needs.ci.outputs.latest_version }}
137
+ env :
138
+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
139
+
140
+ - name : Upload OpenAPI package as release asset
141
+ id : upload_openapi_pckg
142
+ uses : actions/upload-release-asset@v1
143
+ with :
144
+ upload_url : ${{ steps.create_release.outputs.upload_url }}
145
+ asset_path : NuGet/Microsoft.OpenApi.${{ needs.ci.outputs.latest_version }}.nupkg
146
+ asset_name : Microsoft.OpenApi.${{ needs.ci.outputs.latest_version }}.nupkg
147
+ asset_content_type : application/zip
148
+ env :
149
+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
150
+
151
+ - name : Upload OpenAPI.Readers package as release asset
152
+ id : upload_openapi_readers_pckg
153
+ uses : actions/upload-release-asset@v1
154
+ with :
155
+ upload_url : ${{ steps.create_release.outputs.upload_url }}
156
+ asset_path : NuGet/Microsoft.OpenApi.Readers.${{ needs.ci.outputs.latest_version }}.nupkg
157
+ asset_name : Microsoft.OpenApi.Readers.${{ needs.ci.outputs.latest_version }}.nupkg
158
+ asset_content_type : application/zip
159
+ env :
160
+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
161
+
162
+ # Built with ❤ by [Pipeline Foundation](https://pipeline.foundation)
0 commit comments