Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 63 additions & 25 deletions .azure-pipelines/ci-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ extends:
name: Azure-Pipelines-1ESPT-ExDShared
image: windows-2022
os: windows
settings:
# Direct NuGet.org publishing is blocked by CFSClean. Keep later CFS policies enabled.
networkIsolationPolicy: Permissive, CFSClean2, CFSClean3
customBuildTags:
- ES365AIMigrationTooling
stages:
Expand Down Expand Up @@ -71,13 +74,6 @@ extends:
inputs:
useGlobalJson: true

# Install the nuget tool.
- task: NuGetToolInstaller@1
displayName: 'Use NuGet >=6.11.0'
inputs:
versionSpec: '>=6.11.0'
checkLatest: true

# Build the Product project
- task: NuGetAuthenticate@1
displayName: 'Authenticate to Azure Artifacts'
Expand All @@ -93,11 +89,20 @@ extends:
</configuration>
"@ | Set-Content -Path "$(Build.SourcesDirectory)/nuget.config" -Encoding UTF8
displayName: 'Create nuget.config (central feed)'

- task: DotNetCoreCLI@2
displayName: 'restore'
inputs:
command: restore
projects: '$(Build.SourcesDirectory)\Microsoft.OpenApi.slnx'
feedsToUse: config
nugetConfigPath: '$(Build.SourcesDirectory)\nuget.config'

- task: DotNetCoreCLI@2
displayName: 'build'
inputs:
projects: '$(Build.SourcesDirectory)\Microsoft.OpenApi.slnx'
arguments: '--configuration $(BuildConfiguration) --no-incremental'
arguments: '--configuration $(BuildConfiguration) --no-incremental --no-restore'

# Run the Unit test
- task: DotNetCoreCLI@2
Expand All @@ -107,7 +112,7 @@ extends:
projects: '$(Build.SourcesDirectory)\Microsoft.OpenApi.slnx'
arguments: '--configuration $(BuildConfiguration) --no-build'

- task: EsrpCodeSigning@5
- task: EsrpCodeSigning@6
displayName: 'ESRP CodeSigning binaries'
inputs:
ConnectedServiceName: 'Federated DevX ESRP Managed Identity Connection'
Expand Down Expand Up @@ -162,18 +167,18 @@ extends:
PendingAnalysisWaitTimeoutMinutes: '5'

# Pack core lib
- pwsh: dotnet pack $(Build.SourcesDirectory)/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj -o $(Build.ArtifactStagingDirectory) --configuration $(BuildConfiguration) --no-build --include-symbols --include-source /p:SymbolPackageFormat=snupkg
- pwsh: dotnet pack $(Build.SourcesDirectory)/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj -o $(Build.ArtifactStagingDirectory) --configuration $(BuildConfiguration) --no-build --no-restore --include-symbols --include-source /p:SymbolPackageFormat=snupkg
displayName: 'pack OpenAPI'

# Pack YamlReader
- pwsh: dotnet pack $(Build.SourcesDirectory)/src/Microsoft.OpenApi.YamlReader/Microsoft.OpenApi.YamlReader.csproj -o $(Build.ArtifactStagingDirectory) --configuration $(BuildConfiguration) --no-build --include-symbols --include-source /p:SymbolPackageFormat=snupkg
- pwsh: dotnet pack $(Build.SourcesDirectory)/src/Microsoft.OpenApi.YamlReader/Microsoft.OpenApi.YamlReader.csproj -o $(Build.ArtifactStagingDirectory) --configuration $(BuildConfiguration) --no-build --no-restore --include-symbols --include-source /p:SymbolPackageFormat=snupkg
displayName: 'pack YamlReader'

# Pack hidi
- pwsh: dotnet pack $(Build.SourcesDirectory)/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj -o $(Build.ArtifactStagingDirectory) --configuration $(BuildConfiguration) --no-build --include-symbols --include-source /p:SymbolPackageFormat=snupkg
- pwsh: dotnet pack $(Build.SourcesDirectory)/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj -o $(Build.ArtifactStagingDirectory) --configuration $(BuildConfiguration) --no-build --no-restore --include-symbols --include-source /p:SymbolPackageFormat=snupkg
displayName: 'pack Hidi'

- task: EsrpCodeSigning@5
- task: EsrpCodeSigning@6
displayName: 'ESRP CodeSigning Nuget Packages'
inputs:
ConnectedServiceName: 'Federated DevX ESRP Managed Identity Connection'
Expand Down Expand Up @@ -212,7 +217,7 @@ extends:
displayName: publish Hidi as executable
inputs:
command: 'publish'
arguments: -c Release --runtime win-x64 /p:PublishSingleFile=true /p:PackAsTool=false --self-contained --output $(Build.ArtifactStagingDirectory)/Microsoft.OpenApi.Hidi
arguments: -c Release --runtime win-x64 -p:RestoreConfigFile=$(Build.SourcesDirectory)\nuget.config /p:PublishSingleFile=true /p:PackAsTool=false --self-contained --output $(Build.ArtifactStagingDirectory)/Microsoft.OpenApi.Hidi
projects: 'src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj'
publishWebProjects: False
zipAfterPublish: false
Expand Down Expand Up @@ -252,7 +257,7 @@ extends:
inputs:
- input: pipelineArtifact
artifactName: Nugets
targetPath: '$(Pipeline.Workspace)'
targetPath: '$(Pipeline.Workspace)/Nugets'
dependsOn: []
environment: nuget-org
strategy:
Expand All @@ -264,10 +269,12 @@ extends:
- task: 1ES.PublishNuget@1
displayName: 'NuGet push'
inputs:
packagesToPush: '$(Pipeline.Workspace)/Microsoft.OpenApi.Hidi.*.nupkg'
packageParentPath: '$(Pipeline.Workspace)'
packagesToPush: '$(Pipeline.Workspace)/Nugets/Microsoft.OpenApi.Hidi.*.nupkg'
packageParentPath: '$(Pipeline.Workspace)/Nugets'
nuGetFeedType: external
publishFeedCredentials: 'OpenAPI Nuget Connection'
publishPackageMetadata: true
retryCountOnTaskFailure: 2

- deployment: deploy_lib
condition: and(contains(variables['build.SourceBranch'], 'refs/tags/v'), succeeded())
Expand All @@ -277,7 +284,7 @@ extends:
inputs:
- input: pipelineArtifact
artifactName: Nugets
targetPath: '$(Pipeline.Workspace)'
targetPath: '$(Pipeline.Workspace)/Nugets'
dependsOn: []
environment: nuget-org
strategy:
Expand All @@ -287,7 +294,7 @@ extends:
vmImage: ubuntu-latest
steps:
- pwsh: |
$fileNames = "$(Pipeline.Workspace)/Microsoft.OpenApi.Hidi.*.nupkg", "$(Pipeline.Workspace)/Microsoft.OpenApi.YamlReader.*.nupkg", "$(Pipeline.Workspace)/Microsoft.OpenApi.Workbench.*.nupkg"
$fileNames = "$(Pipeline.Workspace)/Nugets/Microsoft.OpenApi.Hidi.*.nupkg", "$(Pipeline.Workspace)/Nugets/Microsoft.OpenApi.YamlReader.*.nupkg", "$(Pipeline.Workspace)/Nugets/Microsoft.OpenApi.Workbench.*.nupkg"
foreach($fileName in $fileNames) {
if(Test-Path $fileName) {
Remove-Item $fileName -Verbose
Expand All @@ -297,10 +304,12 @@ extends:
- task: 1ES.PublishNuget@1
displayName: 'NuGet push'
inputs:
packagesToPush: '$(Pipeline.Workspace)/Microsoft.OpenApi.*.nupkg'
packageParentPath: '$(Pipeline.Workspace)'
packagesToPush: '$(Pipeline.Workspace)/Nugets/Microsoft.OpenApi.*.nupkg'
packageParentPath: '$(Pipeline.Workspace)/Nugets'
nuGetFeedType: external
publishFeedCredentials: 'OpenAPI Nuget Connection'
publishPackageMetadata: true
retryCountOnTaskFailure: 2

- deployment: deploy_yaml_reader
condition: and(contains(variables['build.SourceBranch'], 'refs/tags/v'), succeeded())
Expand All @@ -310,7 +319,7 @@ extends:
inputs:
- input: pipelineArtifact
artifactName: Nugets
targetPath: '$(Pipeline.Workspace)'
targetPath: '$(Pipeline.Workspace)/Nugets'
dependsOn: deploy_lib
environment: nuget-org
strategy:
Expand All @@ -322,10 +331,12 @@ extends:
- task: 1ES.PublishNuget@1
displayName: 'NuGet push'
inputs:
packagesToPush: '$(Pipeline.Workspace)/Microsoft.OpenApi.YamlReader.*.nupkg'
packageParentPath: '$(Pipeline.Workspace)'
packagesToPush: '$(Pipeline.Workspace)/Nugets/Microsoft.OpenApi.YamlReader.*.nupkg'
packageParentPath: '$(Pipeline.Workspace)/Nugets'
nuGetFeedType: external
publishFeedCredentials: 'OpenAPI Nuget Connection'
publishPackageMetadata: true
retryCountOnTaskFailure: 2

- deployment: create_github_release
condition: and(contains(variables['build.SourceBranch'], 'refs/tags/v'), succeeded())
Expand Down Expand Up @@ -386,6 +397,9 @@ extends:
scriptLocation: inlineScript
inlineScript: |
az acr login --name $(REGISTRY)

- task: NuGetAuthenticate@1
displayName: 'Authenticate Docker build to Azure Artifacts'

- pwsh: |
$content = [XML](Get-Content $(Pipeline.Workspace)/Directory.Build.props)
Expand Down Expand Up @@ -471,27 +485,51 @@ extends:
- bash: |
echo "Building Docker image..."
echo "Using build date: ${BUILDDATE}"
if [ -z "${VSS_NUGET_ACCESSTOKEN:-}" ]; then
echo "##vso[task.logissue type=error]VSS_NUGET_ACCESSTOKEN is not available. Ensure NuGetAuthenticate@1 ran successfully before docker build."
exit 1
fi
# Using quotes around tags to prevent flag interpretation
docker buildx build \
--platform linux/amd64,linux/arm64/v8 \
--push \
--build-arg VSS_NUGET_EXTERNAL_FEED_ENDPOINTS \
--build-arg VSS_NUGET_URI_PREFIXES \
--secret id=vss_nuget_accesstoken,env=VSS_NUGET_ACCESSTOKEN \
--secret id=nuget_config,src="$(Pipeline.Workspace)/nuget.config" \
-t "$(REGISTRY)/$(IMAGE_NAME):nightly" \
-t "$(REGISTRY)/$(IMAGE_NAME):${VERSION}.${BUILDDATE}${RUNNUMBER}" \
"$(Pipeline.Workspace)"

displayName: 'Build and Push Nightly Image'
condition: eq(variables['Build.SourceBranch'], variables['PREVIEW_BRANCH'])
env:
VSS_NUGET_ACCESSTOKEN: $(VSS_NUGET_ACCESSTOKEN)
VSS_NUGET_EXTERNAL_FEED_ENDPOINTS: $(VSS_NUGET_EXTERNAL_FEED_ENDPOINTS)
VSS_NUGET_URI_PREFIXES: $(VSS_NUGET_URI_PREFIXES)

- bash: |
echo "Building Docker image for release..."
docker buildx build\
if [ -z "${VSS_NUGET_ACCESSTOKEN:-}" ]; then
echo "##vso[task.logissue type=error]VSS_NUGET_ACCESSTOKEN is not available. Ensure NuGetAuthenticate@1 ran successfully before docker build."
exit 1
fi
docker buildx build \
--platform linux/amd64,linux/arm64/v8 \
--push \
--build-arg VSS_NUGET_EXTERNAL_FEED_ENDPOINTS \
--build-arg VSS_NUGET_URI_PREFIXES \
--secret id=vss_nuget_accesstoken,env=VSS_NUGET_ACCESSTOKEN \
--secret id=nuget_config,src="$(Pipeline.Workspace)/nuget.config" \
-t "$(REGISTRY)/$(IMAGE_NAME):latest" \
-t "$(REGISTRY)/$(IMAGE_NAME):${VERSION}" \
"$(Pipeline.Workspace)"
displayName: 'Build and Push Release Image'
condition: contains(variables['Build.SourceBranch'], 'refs/tags/v')
env:
VSS_NUGET_ACCESSTOKEN: $(VSS_NUGET_ACCESSTOKEN)
VSS_NUGET_EXTERNAL_FEED_ENDPOINTS: $(VSS_NUGET_EXTERNAL_FEED_ENDPOINTS)
VSS_NUGET_URI_PREFIXES: $(VSS_NUGET_URI_PREFIXES)

# once the nuget has been released, fill this form to get the public documentation updated.
# https://dev.azure.com/msft-skilling/Content/_workitems/create/User%20Story?templateId=39fb91e3-64a2-4c8a-83db-b2bdf3603dd3&ownerId=c4a28f90-17ae-4384-b514-7273392b082b
Expand Down
15 changes: 13 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
# syntax=docker/dockerfile:1.2
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build-env
WORKDIR /app
ARG VSS_NUGET_URI_PREFIXES
ARG VSS_NUGET_EXTERNAL_FEED_ENDPOINTS

COPY ./src ./hidi/src
COPY ./Directory.Build.props ./hidi/Directory.Build.props
COPY ./README.md ./hidi/README.md
WORKDIR /app/hidi
RUN dotnet publish ./src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj -c Release
RUN --mount=type=secret,id=vss_nuget_accesstoken,target=/run/secrets/vss_nuget_accesstoken,required=false \
--mount=type=secret,id=nuget_config,target=/run/secrets/nuget_config,required=false \
if [ -f /run/secrets/nuget_config ]; then \
wget -qO- https://aka.ms/install-artifacts-credprovider.sh | bash && \
VSS_NUGET_ACCESSTOKEN="$(cat /run/secrets/vss_nuget_accesstoken)" \
dotnet publish ./src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj -c Release -p:RestoreConfigFile=/run/secrets/nuget_config; \

Check warning on line 16 in Dockerfile

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Line is too long. Split it into multiple lines using backslash continuations.

See more on https://sonarcloud.io/project/issues?id=microsoft_OpenAPI.NET&issues=AZ_2BZ9NXgDmGUzTPv6w&open=AZ_2BZ9NXgDmGUzTPv6w&pullRequest=3012
else \
dotnet publish ./src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj -c Release; \
fi

FROM mcr.microsoft.com/dotnet/runtime:8.0-jammy-chiseled AS runtime
WORKDIR /app
Expand Down
Loading