From dff8131f68fb0b44420626abe04781b0e53c2f8c Mon Sep 17 00:00:00 2001 From: m-nash <64171366+m-nash@users.noreply.github.com> Date: Wed, 24 Apr 2024 08:04:47 -0700 Subject: [PATCH] Add regen test to csharp stages (#3208) Fixes https://github.com/microsoft/typespec/issues/3206 --- .../pipelines/templates/jobs/test-job.yml | 19 ++++++++++-- .../templates/stages/emitter-stages.yml | 29 ++++++++++++++++--- .../pipelines/templates/steps/test-step.yml | 7 +++-- .../eng/pipeline/templates/ci-stages.yml | 3 ++ .../eng/scripts/Check-GitChanges.ps1 | 22 ++++++++++++++ .../eng/scripts/Test-Packages.ps1 | 16 ++++++++++ 6 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 packages/http-client-csharp/eng/scripts/Check-GitChanges.ps1 diff --git a/eng/emitters/pipelines/templates/jobs/test-job.yml b/eng/emitters/pipelines/templates/jobs/test-job.yml index 7ba3a9335..e22d1e0b7 100644 --- a/eng/emitters/pipelines/templates/jobs/test-job.yml +++ b/eng/emitters/pipelines/templates/jobs/test-job.yml @@ -8,13 +8,20 @@ parameters: - name: PackagePath type: string - # Arguments needed to run unit tests - - name: UnitTestArgs + # Arguments needed to run tests + - name: TestArgs type: string + default: "" + + # Indicates the build matrix to use for post-build autorest validation + - name: TestMatrix + type: object + default: {} # Node version - name: NodeVersion type: string + default: "20.x" # Operation system to use - name: Os @@ -37,13 +44,19 @@ jobs: name: $(WINDOWSPOOL) image: $(WINDOWSVMIMAGE) os: windows + ${{ if ne(length(parameters.TestMatrix), 0) }}: + strategy: + matrix: ${{ parameters.TestMatrix }} steps: - template: /eng/emitters/pipelines/templates/steps/test-step.yml parameters: AdditionalInitializeSteps: ${{ parameters.AdditionalInitializeSteps }} PackagePath: ${{ parameters.PackagePath }} NodeVersion: $(nodeVersion) - UnitTestArgs: ${{ parameters.UnitTestArgs }} + ${{ if ne(length(parameters.TestMatrix), 0) }}: + TestArgs: $(TestArguments) + ${{ else }}: + TestArgs: ${{ parameters.TestArgs }} ${{ if parameters.EmitArtifacts }}: templateContext: outputs: diff --git a/eng/emitters/pipelines/templates/stages/emitter-stages.yml b/eng/emitters/pipelines/templates/stages/emitter-stages.yml index 9c2982a46..89876ffe7 100644 --- a/eng/emitters/pipelines/templates/stages/emitter-stages.yml +++ b/eng/emitters/pipelines/templates/stages/emitter-stages.yml @@ -196,7 +196,7 @@ stages: parameters: AdditionalInitializeSteps: ${{ parameters.AdditionalInitializeSteps }} PackagePath: ${{ parameters.PackagePath }} - UnitTestArgs: ${{ parameters.UnitTestArgs }} + TestArgs: ${{ parameters.UnitTestArgs }} NodeVersion: 20.x Os: linux EmitArtifacts: true # Emit artifacts only for the first job @@ -204,20 +204,41 @@ stages: parameters: AdditionalInitializeSteps: ${{ parameters.AdditionalInitializeSteps }} PackagePath: ${{ parameters.PackagePath }} - UnitTestArgs: ${{ parameters.UnitTestArgs }} + TestArgs: ${{ parameters.UnitTestArgs }} NodeVersion: 18.x Os: linux - template: /eng/emitters/pipelines/templates/jobs/test-job.yml parameters: AdditionalInitializeSteps: ${{ parameters.AdditionalInitializeSteps }} PackagePath: ${{ parameters.PackagePath }} - UnitTestArgs: ${{ parameters.UnitTestArgs }} + TestArgs: ${{ parameters.UnitTestArgs }} NodeVersion: 20.x Os: windows - template: /eng/emitters/pipelines/templates/jobs/test-job.yml parameters: AdditionalInitializeSteps: ${{ parameters.AdditionalInitializeSteps }} PackagePath: ${{ parameters.PackagePath }} - UnitTestArgs: ${{ parameters.UnitTestArgs }} + TestArgs: ${{ parameters.UnitTestArgs }} NodeVersion: 18.x Os: windows + + # Regen Test stage + # Responsible for running any regen tests needed to validate no manual changes were done. + # The contents of the artifact `build_artifacts` are available under the path `$(buildArtifactsPath)`. + - ${{ if ne(length(parameters.TestMatrix), 0) }}: + - stage: ${{ parameters.StagePrefix }}_Regen_Test + displayName: ${{ parameters.StagePrefix }} - Regen - Test + condition: and(succeeded(), ${{ parameters.Condition }}) + dependsOn: + - ${{ parameters.DependsOn }} + - ${{ parameters.StagePrefix }}_Build + variables: + selfRepositoryPath: $(Build.SourcesDirectory) + buildArtifactsPath: $(Pipeline.Workspace)/build_artifacts + jobs: + - template: /eng/emitters/pipelines/templates/jobs/test-job.yml + parameters: + AdditionalInitializeSteps: ${{ parameters.AdditionalInitializeSteps }} + PackagePath: ${{ parameters.PackagePath }} + Os: windows + TestMatrix: ${{ parameters.TestMatrix }} diff --git a/eng/emitters/pipelines/templates/steps/test-step.yml b/eng/emitters/pipelines/templates/steps/test-step.yml index 13da0b377..fcf0dc058 100644 --- a/eng/emitters/pipelines/templates/steps/test-step.yml +++ b/eng/emitters/pipelines/templates/steps/test-step.yml @@ -12,9 +12,10 @@ parameters: # Currently not installing node in this template, but keeping this parameter for future use - name: NodeVersion type: string + default: "20.x" - # Arguments needed to run unit tests - - name: UnitTestArgs + # Arguments needed to run tests + - name: TestArgs type: string steps: @@ -39,5 +40,5 @@ steps: inputs: pwsh: true filePath: $(selfRepositoryPath)${{ parameters.PackagePath }}/eng/scripts/Test-Packages.ps1 - arguments: ${{ parameters.UnitTestArgs }} + arguments: ${{ parameters.TestArgs }} workingDirectory: $(selfRepositoryPath) diff --git a/packages/http-client-csharp/eng/pipeline/templates/ci-stages.yml b/packages/http-client-csharp/eng/pipeline/templates/ci-stages.yml index 6bb3fc58d..92b66bb62 100644 --- a/packages/http-client-csharp/eng/pipeline/templates/ci-stages.yml +++ b/packages/http-client-csharp/eng/pipeline/templates/ci-stages.yml @@ -20,5 +20,8 @@ stages: file: typespec-http-client-csharp-*.tgz type: npm UnitTestArgs: -UnitTests + TestMatrix: + RegenCheck: + TestArguments: -GenerationChecks Condition: ${{ parameters.Condition }} DependsOn: ${{ parameters.DependsOn }} diff --git a/packages/http-client-csharp/eng/scripts/Check-GitChanges.ps1 b/packages/http-client-csharp/eng/scripts/Check-GitChanges.ps1 new file mode 100644 index 000000000..c4bde91a4 --- /dev/null +++ b/packages/http-client-csharp/eng/scripts/Check-GitChanges.ps1 @@ -0,0 +1,22 @@ +#Requires -Version 7.0 + +param( + [string] $Exceptions +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 3.0 +$packageRoot = (Resolve-Path "$PSScriptRoot/../..").Path.Replace('\', '/') +. "$packageRoot/../../eng/emitters/scripts/CommandInvocation-Helpers.ps1" +Set-ConsoleEncoding + +$diffExcludes = @( + "$packageRoot/package.json" + "$packageRoot/package-lock.json" +) | ForEach-Object { "`":(exclude)$_`"" } | Join-String -Separator ' ' + +Invoke-LoggedCommand "git -c core.safecrlf=false diff --ignore-space-at-eol --exit-code -- $diffExcludes" -IgnoreExitCode + +if($LastExitCode -ne 0) { + throw "Changes detected" +} diff --git a/packages/http-client-csharp/eng/scripts/Test-Packages.ps1 b/packages/http-client-csharp/eng/scripts/Test-Packages.ps1 index f67755f7b..4779ac4ac 100644 --- a/packages/http-client-csharp/eng/scripts/Test-Packages.ps1 +++ b/packages/http-client-csharp/eng/scripts/Test-Packages.ps1 @@ -28,6 +28,22 @@ try { Pop-Location } } + if ($GenerationChecks) { + Set-StrictMode -Version 1 + # run E2E Test for TypeSpec emitter + Write-Host "Generating test projects ..." + & "$packageRoot/eng/scripts/Generate.ps1" + Write-Host 'Code generation is completed.' + + try { + Write-Host 'Checking for differences in generated code...' + & "$packageRoot/eng/scripts/Check-GitChanges.ps1" + Write-Host 'Done. No code generation differences detected.' + } + catch { + Write-Error 'Generated code is not up to date. Please run: eng/Generate.ps1' + } + } } finally { Pop-Location