Skip to content

Commit f777f75

Browse files
authored
Create CI/CD pipeline (#8)
1 parent d623586 commit f777f75

File tree

1 file changed

+162
-0
lines changed

1 file changed

+162
-0
lines changed

.github/workflows/ci-cd.yml

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
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

Comments
 (0)