Repository navigation
fix(hidi): place Pester test inside its test project (#896) #2579
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI/CD Pipeline | |
| on: [push, pull_request, workflow_dispatch] | |
| permissions: | |
| contents: write | |
| jobs: | |
| ci: | |
| name: Continuous Integration | |
| runs-on: ubuntu-latest | |
| outputs: | |
| latest_version: ${{ steps.tag_generator.outputs.new_version }} | |
| is_default_branch: ${{ steps.conditionals_handler.outputs.is_default_branch }} | |
| env: | |
| ARTIFACTS_FOLDER: ${{ github.workspace }}/Artifacts | |
| GITHUB_RUN_NUMBER: ${{ github.run_number }} | |
| steps: | |
| - name: Setup .NET | |
| uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 | |
| with: | |
| dotnet-version: | | |
| 8.0.x | |
| 10.0.x | |
| - name: Data gatherer | |
| id: data_gatherer | |
| shell: pwsh | |
| run: | | |
| # Get default branch | |
| $repo = 'microsoft/OpenAPI.NET.OData' | |
| $defaultBranch = Invoke-RestMethod -Method GET -Uri https://api.github.com/repos/$repo | Select-Object -ExpandProperty default_branch | |
| Write-Output "default_branch=$(echo $defaultBranch) >> $GITHUB_OUTPUT" | |
| - name: Conditionals handler | |
| id: conditionals_handler | |
| shell: pwsh | |
| run: | | |
| $defaultBranch = "${{ steps.data_gatherer.outputs.default_branch }}" | |
| $githubRef = "${{ github.ref }}" | |
| $isDefaultBranch = 'false' | |
| if ( $githubRef -like "*$defaultBranch*" ) { | |
| $isDefaultBranch = 'true' | |
| } | |
| Write-Output "is_default_branch=$(echo $isDefaultBranch) >> $GITHUB_OUTPUT" | |
| - name: Checkout repository | |
| id: checkout_repo | |
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| fetch-depth: 0 | |
| - if: steps.conditionals_handler.outputs.is_default_branch == 'true' | |
| name: Bump GH tag | |
| id: tag_generator | |
| uses: mathieudutour/github-tag-action@af99e60ce8132224b8e6ebab5023449fe256ed46 # v7.0.0 | |
| with: | |
| github_token: ${{ secrets.GITHUB_TOKEN }} | |
| default_bump: false | |
| release_branches: ${{ steps.data_gatherer.outputs.default_branch }} | |
| - name: Build projects | |
| id: build_projects | |
| shell: pwsh | |
| run: | | |
| $projectsArray = @( | |
| '.\src\Microsoft.OpenApi.OData.Reader\Microsoft.OpenAPI.OData.Reader.csproj' | |
| ) | |
| $gitNewVersion = if ("${{ steps.tag_generator.outputs.new_version }}") {"${{ steps.tag_generator.outputs.new_version }}"} else {$null} | |
| $projectCurrentVersion = ([xml](Get-Content .\src\Microsoft.OpenApi.OData.Reader\Microsoft.OpenAPI.OData.Reader.csproj)).Project.PropertyGroup.Version | |
| $projectNewVersion = $gitNewVersion ?? $projectCurrentVersion | |
| $projectsArray | ForEach-Object { | |
| dotnet build $PSItem ` | |
| -c Release # ` | |
| # -o $env:ARTIFACTS_FOLDER ` | |
| # /p:Version=$projectNewVersion | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| } | |
| # Move NuGet packages to separate folder for pipeline convenience | |
| # New-Item Artifacts/NuGet -ItemType Directory | |
| # Get-ChildItem Artifacts/*.nupkg | Move-Item -Destination "Artifacts/NuGet" | |
| - name: Run unit tests | |
| id: run_unit_tests | |
| shell: pwsh | |
| run: | | |
| $testProjectsArray = @( | |
| '.\test\Microsoft.OpenAPI.OData.Reader.Tests\Microsoft.OpenAPI.OData.Reader.Tests.csproj' | |
| ) | |
| $testProjectsArray | ForEach-Object { | |
| dotnet test $PSItem ` | |
| -c Release | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| } | |
| - name: Run hidi tests (Microsoft.Testing.Platform) | |
| shell: pwsh | |
| run: | | |
| dotnet run --project .\test\Microsoft.OpenApi.Hidi.Tests\Microsoft.OpenApi.Hidi.Tests.csproj -c Release -- --minimum-expected-tests 1 | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| - name: Pack and install hidi locally | |
| shell: pwsh | |
| run: | | |
| dotnet pack .\src\Microsoft.OpenApi.Hidi\Microsoft.OpenApi.Hidi.csproj -c Release --no-build -o .\artifacts\hidi\nuget | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| .\install-tool.ps1 | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| $workspace = (Get-Location).Path | |
| $fixtures = Join-Path $workspace 'test' 'Microsoft.OpenApi.Hidi.Tests' 'UtilityFiles' | |
| $outputs = Join-Path $workspace 'artifacts' 'hidi' | |
| $hidi = Join-Path $outputs 'installed' 'hidi' | |
| $sampleInput = Join-Path $fixtures 'SampleOpenApi.yml' | |
| $csdlInput = Join-Path $fixtures 'Todo.xml' | |
| $jsonOutput = Join-Path $outputs 'openapi.json' | |
| $defaultOutput = Join-Path $outputs 'openapi-default.json' | |
| $csdlOutput = Join-Path $outputs 'csdl.yaml' | |
| $diagramOutput = Join-Path $outputs 'diagram.md' | |
| & $hidi --help | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| & $hidi validate --openapi $sampleInput | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| & $hidi transform --openapi $sampleInput --format json --version 3.0 --output $jsonOutput --clean-output | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| & $hidi transform --csdl $csdlInput --format yaml --version 3.0 --output $csdlOutput --clean-output | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| $document = Get-Content $jsonOutput -Raw | ConvertFrom-Json | |
| if ($document.openapi -notlike '3.0.*' -or @($document.paths.PSObject.Properties).Count -eq 0) { | |
| throw "Expected an OpenAPI 3.0 document with paths from SampleOpenApi." | |
| } | |
| & $hidi transform --openapi $sampleInput --format json --output $defaultOutput --clean-output | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| $defaultDocument = Get-Content $defaultOutput -Raw | ConvertFrom-Json | |
| if ($defaultDocument.openapi -notlike '3.2.*' -or @($defaultDocument.paths.PSObject.Properties).Count -eq 0) { | |
| throw "Expected main's default OpenAPI 3.2 behavior with paths." | |
| } | |
| $csdlDocument = Get-Content $csdlOutput -Raw | |
| if ($csdlDocument -notmatch '(?m)^openapi:\s*3\.0\.' -or $csdlDocument -notmatch '(?m)^ /Todos:\s*$' -or $csdlDocument -notmatch '(?m)^ schemas:\s*$') { | |
| throw "Expected OpenAPI 3.0, /Todos paths and schemas in the CSDL YAML output." | |
| } | |
| & $hidi show --openapi $sampleInput --output $diagramOutput | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| if (-not (Select-String $diagramOutput -Pattern 'mermaid' -Quiet)) { throw "Expected a Mermaid diagram from hidi show." } | |
| - name: Upload hidi NuGet artifact (not a release) | |
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 | |
| with: | |
| name: hidi-nuget | |
| path: artifacts/hidi/nuget | |
| if-no-files-found: error | |
| # - if: steps.tag_generator.outputs.new_version != '' | |
| # name: Upload NuGet packages as artifacts | |
| # id: ul_packages_artifact | |
| # uses: actions/upload-artifact@v1 | |
| # with: | |
| # name: NuGet packages | |
| # path: Artifacts/NuGet/ | |
| hidi-windows: | |
| name: Hidi Windows executable | |
| runs-on: windows-latest | |
| permissions: | |
| contents: read | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| - uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 | |
| with: | |
| dotnet-version: | | |
| 8.0.x | |
| 10.0.x | |
| - name: Publish and smoke-test Windows executable | |
| shell: pwsh | |
| run: | | |
| dotnet publish .\src\Microsoft.OpenApi.Hidi\Microsoft.OpenApi.Hidi.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:PackAsTool=false -p:GeneratePackageOnBuild=false -o .\artifacts\hidi\win-x64 | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| & .\artifacts\hidi\win-x64\Microsoft.OpenApi.Hidi.exe --help | |
| if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } | |
| Compress-Archive -Path .\artifacts\hidi\win-x64\* -DestinationPath .\artifacts\hidi\hidi-win-x64.zip | |
| - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 | |
| with: | |
| name: hidi-windows-executable | |
| path: | | |
| artifacts/hidi/hidi-win-x64.zip | |
| artifacts/hidi/win-x64/Microsoft.OpenApi.Hidi.exe | |
| if-no-files-found: error | |
| hidi-docker: | |
| name: Hidi Docker build | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| - name: Build and smoke-test Docker image (no push) | |
| run: | | |
| set -euo pipefail | |
| docker build --tag hidi:ci . | |
| docker run --rm hidi:ci --help | |
| mkdir -p artifacts/hidi/docker | |
| docker run --rm --user "$(id -u):$(id -g)" \ | |
| --mount "type=bind,source=$PWD/test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/SampleOpenApi.yml,target=/app/openapi.yml,readonly" \ | |
| --mount "type=bind,source=$PWD/artifacts/hidi/docker,target=/app/output" \ | |
| hidi:ci transform --openapi /app/openapi.yml --format json --output /app/output/openapi.json --clean-output | |
| docker run --rm --user "$(id -u):$(id -g)" \ | |
| --mount "type=bind,source=$PWD/test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/Todo.xml,target=/app/api.csdl,readonly" \ | |
| --mount "type=bind,source=$PWD/artifacts/hidi/docker,target=/app/output" \ | |
| hidi:ci transform --csdl /app/api.csdl --format yaml --version 3.0 --output /app/output/csdl.yaml --clean-output | |
| - name: Verify Docker transformation outputs | |
| shell: pwsh | |
| run: | | |
| $outputs = Join-Path (Get-Location).Path 'artifacts' 'hidi' 'docker' | |
| $document = Get-Content (Join-Path $outputs 'openapi.json') -Raw | ConvertFrom-Json | |
| if ($document.openapi -notlike '3.2.*' -or @($document.paths.PSObject.Properties).Count -eq 0) { | |
| throw "Expected main's default OpenAPI 3.2 behavior with paths in Docker." | |
| } | |
| $csdlDocument = Get-Content (Join-Path $outputs 'csdl.yaml') -Raw | |
| if ($csdlDocument -notmatch '(?m)^openapi:\s*3\.0\.' -or $csdlDocument -notmatch '(?m)^ /Todos:\s*$' -or $csdlDocument -notmatch '(?m)^ schemas:\s*$') { | |
| throw "Expected OpenAPI 3.0, /Todos paths and schemas in the Docker CSDL YAML output." | |
| } | |
| cd: | |
| if: needs.ci.outputs.is_default_branch == 'true' && needs.ci.outputs.latest_version != '' | |
| name: Continuous Deployment | |
| needs: ci | |
| runs-on: ubuntu-latest | |
| steps: | |
| # - name: Download and extract NuGet packages | |
| # id: dl_packages_artifact | |
| # uses: actions/download-artifact@v2 | |
| # with: | |
| # name: NuGet packages | |
| # path: NuGet/ | |
| # - name: Push NuGet packages to NuGet.org | |
| # id: push_nuget_packages | |
| # continue-on-error: true | |
| # shell: pwsh | |
| # run: | | |
| # Get-ChildItem NuGet/*.nupkg | ForEach-Object { | |
| # nuget push $PSItem ` | |
| # -ApiKey $env:NUGET_API_KEY ` | |
| # -Source https://api.nuget.org/v3/index.json | |
| # } | |
| # env: | |
| # NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} | |
| - name: Create and publish release | |
| id: create_release | |
| uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3 | |
| with: | |
| name: OpenAPI.Net.OData v${{ needs.ci.outputs.latest_version }} | |
| tag_name: v${{ needs.ci.outputs.latest_version }} | |
| # files: | | |
| # NuGet/Microsoft.OpenApi.${{ needs.ci.outputs.latest_version }}.nupkg | |
| # NuGet/Microsoft.OpenApi.Readers.${{ needs.ci.outputs.latest_version }}.nupkg | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| # Built with ❤ by [Pipeline Foundation](https://pipeline.foundation) |