Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
cd3f8c5
Remove yank job; ESRP doesn't have direct programmatic support for that
danieljurek Sep 22, 2025
b7d1bc4
Rough changes to Pack-Crates.ps1 to produce .crate files
danieljurek Sep 23, 2025
bb19629
First cut at ESRP publishing
danieljurek Sep 24, 2025
ce9052c
Use *.crate package pattern, adjust Pack-Crates.ps1 to create package…
danieljurek Sep 24, 2025
dea5220
Extract package information from .crate file
danieljurek Sep 24, 2025
86fdb07
Syntax
danieljurek Sep 24, 2025
da1123e
Syntax
danieljurek Sep 24, 2025
6b8b7ef
Syntax
danieljurek Sep 24, 2025
0eeed2f
Syntax
danieljurek Sep 24, 2025
9480074
Compress-ReleaseCrate.ps1, wire into archetype-rust-release.yml
danieljurek Sep 24, 2025
1f23b8d
Use managed identity
danieljurek Sep 24, 2025
78da130
Redundant line
danieljurek Sep 24, 2025
4ff0c80
Deployment scripts must be inline (no checkout)
danieljurek Sep 24, 2025
2a62b91
Disable repo tagging to iterate on release, inline compression
danieljurek Sep 24, 2025
8064fa0
Create output directory
danieljurek Sep 24, 2025
0adddb2
:
danieljurek Sep 24, 2025
048d022
EsrpRelease@10
danieljurek Sep 24, 2025
194f4a2
Remove redundant keys
danieljurek Sep 24, 2025
155142d
DomainTenantId
danieljurek Sep 24, 2025
d7c351f
Don't nest in zip?
danieljurek Sep 24, 2025
8d8b357
Remove toolchain config
danieljurek Sep 24, 2025
2cb1634
Add KV and signing info
danieljurek Sep 24, 2025
606863c
Use ESRPRELPACMANTEST
danieljurek Sep 25, 2025
c66857d
Check that crate is publishable
danieljurek Sep 25, 2025
c5f84bf
Pack-Crates.ps1: Remove -PackageInfoDirectory, add -RequireDependenci…
danieljurek Sep 26, 2025
465f1df
Wire up release intent
danieljurek Sep 26, 2025
3525680
each artifact
danieljurek Sep 26, 2025
7c399f9
Parameters
danieljurek Sep 26, 2025
a0832ce
Only specify an environment if not in a test pipeline
danieljurek Sep 26, 2025
8f030be
Use environment: none if in TestPipeline
danieljurek Sep 26, 2025
89b48df
Remove Environment param
danieljurek Sep 26, 2025
d9e4c26
(test) Depend on unreleased core
danieljurek Sep 26, 2025
3bc2261
Remove azure_canary_core's dependency on azure_core
danieljurek Sep 26, 2025
ab2b2ab
Check existence
danieljurek Sep 26, 2025
3eccd36
Naming
danieljurek Sep 26, 2025
7ae6ad9
Log file paths
danieljurek Sep 26, 2025
d9e3786
backtick
danieljurek Sep 26, 2025
f302f99
Remove extra logging
danieljurek Sep 26, 2025
40437b4
Test ESRP idempotency
danieljurek Sep 26, 2025
892f1b6
Remove test step
danieljurek Sep 26, 2025
93818a7
Update ci.yml files with release parameters
danieljurek Sep 29, 2025
e0692f3
Also require dependency order
danieljurek Sep 29, 2025
e1a3992
Wire up CHANGELOG.md and README.md
danieljurek Sep 29, 2025
592a672
Test: remove package verison updating from release. Should fail Packing.
danieljurek Sep 29, 2025
9841408
Better testing: turn off TestPipeline
danieljurek Sep 29, 2025
07bfe40
Undo test changes
danieljurek Sep 29, 2025
7a76bfb
Move RequireDependencies into pack.yml
danieljurek Sep 29, 2025
b47a18d
Move RequireDependencies into pack.yml
danieljurek Sep 29, 2025
76e1390
Pack-Crates.ps1: Use PackageInfoDirectory
danieljurek Sep 29, 2025
ac8e1a0
-RequireDependencies
danieljurek Sep 29, 2025
60893c1
Syntax
danieljurek Sep 29, 2025
3526027
Formatting/cleanup
danieljurek Sep 29, 2025
5d61c2f
cspell: allowCompoundWords: true
danieljurek Sep 29, 2025
b9ca6a8
Spelling
danieljurek Sep 29, 2025
c6a900c
Review feedback: No artifacts selected means "just build all artifact…
danieljurek Oct 1, 2025
5ae05c6
convertToJson
danieljurek Oct 1, 2025
2b51b99
Only create the stage if there are artifacts to release
danieljurek Oct 1, 2025
71f0586
'False'
danieljurek Oct 1, 2025
19cbea1
More error throwing
danieljurek Oct 1, 2025
0d00a9e
Review feedback: Don't enable allowCompoundWords, also release_ names…
danieljurek Oct 2, 2025
ea9b318
Artifact ordering for Pack-Crates.ps1
danieljurek Oct 2, 2025
c7d7988
Add support for outputting release order of specified packages
danieljurek Oct 6, 2025
3e51485
Use artifact ordering from artifacts
danieljurek Oct 7, 2025
0c9b166
Log index
danieljurek Oct 7, 2025
ee30182
One PR per-release
danieljurek Oct 7, 2025
164469e
Review feedback: -eq 'True'
danieljurek Oct 7, 2025
24abf38
Test public API change
danieljurek Oct 7, 2025
067a2ff
Cover is_below_freezing
danieljurek Oct 7, 2025
a1c1e4d
Remove TODO, APIView behavior is unchanged
danieljurek Oct 7, 2025
439f703
Formatting
danieljurek Oct 7, 2025
a169a49
Format
danieljurek Oct 7, 2025
3245143
Revert constant_example.rs
danieljurek Oct 7, 2025
f265701
Review feedback: quotes, Join-Path
danieljurek Oct 7, 2025
c405dfa
Build dependencies from source allowing exceptions for crates that ha…
danieljurek Oct 13, 2025
09356e4
Better single package handling
danieljurek Oct 13, 2025
c8457fc
Use simplified packing process for release
danieljurek Oct 15, 2025
2a27745
Output path
danieljurek Oct 15, 2025
06dd993
Syntax
danieljurek Oct 15, 2025
474f902
Comments
danieljurek Oct 15, 2025
0d6f13d
Change releases to default: false
danieljurek Oct 15, 2025
37e78b6
use cspell.json from main
danieljurek Oct 15, 2025
85f5cef
Incorporate typespec into core/ci.yml
danieljurek Oct 15, 2025
530dddf
Remove redundant single quotes in yaml
danieljurek Oct 15, 2025
c15eaf2
Refactor all packing to Pack-Crates.ps1
danieljurek Oct 15, 2025
6eee1c8
Pack-Crates.ps1 artifact output
danieljurek Oct 15, 2025
cc1182f
release-order.json
danieljurek Oct 15, 2025
53b122c
Formatting
danieljurek Oct 15, 2025
08abce5
Review feedback
danieljurek Oct 17, 2025
1ef0c18
$(ArtifactName) needs to have a value or macro syntax just dumps in t…
danieljurek Oct 17, 2025
76aaab8
PowerShell: Edge cases around flattened arrays
danieljurek Oct 17, 2025
952276c
Review feedback
danieljurek Oct 17, 2025
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
55 changes: 46 additions & 9 deletions eng/pipelines/templates/jobs/pack.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,52 @@ jobs:
ServiceDirectory: ${{ parameters.ServiceDirectory }}
PackageInfoDirectory: $(Build.ArtifactStagingDirectory)/PackageInfo

- task: Powershell@2
displayName: "Pack Crates"
condition: and(succeeded(), ne(variables['NoPackagesChanged'],'true'))
inputs:
pwsh: true
filePath: $(Build.SourcesDirectory)/eng/scripts/Pack-Crates.ps1
arguments: >
-OutputPath '$(Build.ArtifactStagingDirectory)'
-PackageInfoDirectory '$(Build.ArtifactStagingDirectory)/PackageInfo'
- ${{ if eq('auto', parameters.ServiceDirectory) }}:
- task: Powershell@2
displayName: Pack Crates
condition: and(succeeded(), ne(variables['NoPackagesChanged'],'true'))
inputs:
pwsh: true
filePath: $(Build.SourcesDirectory)/eng/scripts/Pack-Crates.ps1
arguments: >
-OutputPath '$(Build.ArtifactStagingDirectory)'
-PackageInfoDirectory '$(Build.ArtifactStagingDirectory)/PackageInfo'

- ${{ else }}:
- pwsh: |
$artifacts = '${{ convertToJson(parameters.Artifacts) }}' | ConvertFrom-Json
$isReleaseBuild = $true
$artifactsToBuild = $artifacts | Where-Object { $_.releaseInBatch -eq 'True' }

if (!$artifactsToBuild) {
Write-Host "No packages to release. Building all packages in the service directory with no dependency validation."
$artifactsToBuild = $artifacts
$isReleaseBuild = $false
}

$packageNames = $artifactsToBuild.name

Write-Host "##vso[task.setvariable variable=PackageNames]$($packageNames -join ',')"
if ($isReleaseBuild) {
Write-Host "##vso[task.setvariable variable=AdditionalPackageParams]-Release"
} else {
Write-Host "##vso[task.setvariable variable=AdditionalPackageParams]"
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may be cleaner to just invoke Pack-Crates here rather than setting devops variables and invoking them in a following step.

Unless you want to track the error rates for the step separately

displayName: Configure crate packing
condition: and(succeeded(), ne(variables['NoPackagesChanged'],'true'))

- task: Powershell@2
displayName: Pack Crates
condition: and(succeeded(), ne(variables['NoPackagesChanged'],'true'))
inputs:
pwsh: true
filePath: $(Build.SourcesDirectory)/eng/scripts/Pack-Crates.ps1
arguments: >
-OutputPath '$(Build.ArtifactStagingDirectory)'
-PackageNames $(PackageNames)
-OutBuildOrderFile '$(Build.ArtifactStagingDirectory)/release-order.json'
$(AdditionalPackageParams)


- template: /eng/common/pipelines/templates/steps/publish-1es-artifact.yml
parameters:
Expand Down
207 changes: 107 additions & 100 deletions eng/pipelines/templates/stages/archetype-rust-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,13 @@ parameters:
- name: DevFeedName
type: string
default: 'public/azure-sdk-for-rust'
- name: Environment
type: string
default: 'cratesio'

stages:
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- ${{ if in(variables['Build.Reason'], 'Manual', '') }}:
- ${{ each artifact in parameters.Artifacts }}:
- stage: Release_${{artifact.safeName}}
displayName: "Release: ${{artifact.name}}"
- ${{ if gt(length(parameters.Artifacts), 0) }}:
- stage: Release_Batch
displayName: "Releasing: ${{length(parameters.Artifacts)}} crates"
dependsOn: ${{parameters.DependsOn}}
condition: and(succeeded(), ne(variables['SetDevVersion'], 'true'), ne(variables['Skip.Release'], 'true'), ne(variables['Build.Repository.Name'], 'Azure/azure-sdk-for-rust-pr'))
variables:
Expand All @@ -50,16 +47,17 @@ stages:

- template: /eng/common/pipelines/templates/steps/retain-run.yml

- script: |
echo "##vso[build.addbuildtag]${{artifact.name}}"
displayName: Add build tag '${{artifact.name}}'
- ${{ each artifact in parameters.Artifacts }}:
- script: |
echo "##vso[build.addbuildtag]${{artifact.name}}"
displayName: Add build tag '${{artifact.name}}'

- template: /eng/common/pipelines/templates/steps/create-tags-and-git-release.yml
parameters:
ArtifactLocation: $(Pipeline.Workspace)/${{parameters.PipelineArtifactName}}/${{artifact.name}}
PackageRepository: Crates.io
ReleaseSha: $(Build.SourceVersion)
WorkingDirectory: $(Pipeline.Workspace)/_work
- template: /eng/common/pipelines/templates/steps/create-tags-and-git-release.yml
parameters:
ArtifactLocation: $(Pipeline.Workspace)/${{parameters.PipelineArtifactName}}/${{artifact.name}}
PackageRepository: Crates.io
ReleaseSha: $(Build.SourceVersion)
WorkingDirectory: $(Pipeline.Workspace)/_work

- deployment: PublishPackage
displayName: "Publish to Crates.io"
Expand All @@ -71,7 +69,10 @@ stages:
- input: pipelineArtifact # Required, type of the input artifact
artifactName: ${{parameters.PipelineArtifactName}} # Required, name of the pipeline artifact
targetPath: $(Pipeline.Workspace)/drop # Optional, specifies where the artifact is downloaded to
environment: ${{parameters.Environment}}
${{if parameters.TestPipeline}}:
environment: none
${{else}}:
environment: package-publish
# This timeout shouldn't be necessary once we're able to parallelize better. Right now,
# this is here to ensure larger areas (30+) libraries don't time out.
timeoutInMinutes: 120
Expand All @@ -84,33 +85,76 @@ stages:
runOnce:
deploy:
steps:
- template: /eng/pipelines/templates/steps/use-rust.yml@self
parameters:
Toolchain: stable

- pwsh: |
$additionalOwners = @('heaths', 'hallipr')
$token = $env:CARGO_REGISTRY_TOKEN
$crateName = '${{artifact.name}}'

$manifestPath = "$(Pipeline.Workspace)/drop/$crateName/contents/Cargo.toml"
Write-Host "> cargo publish --manifest-path `"$manifestPath`""
cargo publish --manifest-path $manifestPath
if (!$?) {
Write-Error "Failed to publish package: '$crateName'"
exit 1
}

$existingOwners = (cargo owner --list $crateName) -replace " \(.*", ""
$missingOwners = $additionalOwners | Where-Object { $existingOwners -notcontains $_ }

foreach ($owner in $missingOwners) {
Write-Host "> cargo owner --add $owner $crateName"
cargo owner --add $owner $crateName
}
displayName: Publish Crate
env:
CARGO_REGISTRY_TOKEN: $(azure-sdk-cratesio-token)
Write-Host "Setting ArtifactName to empty"
Write-Host "##vso[task.setvariable variable=ArtifactName;]"
displayName: Initialize ArtifactName variable

# This loop over artifacts is used to produce the correct number
# of ESRP release tasks. It has the side effect of also setting
# the artifact name by looking up the index of the current
# "artifact.name" in the parameters.Artifacts array, using that
# as an "index" and then using that same index to look up the
# actual artifact to release in the release-order.json file.
- ${{ each artifact in parameters.Artifacts }}:
- pwsh: |
# From the DevOps template artifact loop calculate the current index
$indexItem = '${{ artifact.name }}'
[array] $indexList = ConvertFrom-Json '${{ convertToJson(parameters.Artifacts.*.name) }}'
$index = $indexList.IndexOf($indexItem)
Write-Host "Index of template artifact: $index"

[array] $artifacts = Get-Content '$(Pipeline.Workspace)/drop/release-order.json' | ConvertFrom-Json

$artifactName = $artifacts[$index]

Write-Host "Releasing artifact: $artifactName"

$artifactRootPath = '$(Pipeline.Workspace)/drop'
$outDir = '$(Pipeline.Workspace)/esrp-release'

if (Test-Path $outDir) {
Write-Host "Cleaning output directory: $outDir"
Remove-Item -Path $outDir -Recurse -Force
}
New-Item -ItemType Directory -Path $outDir -Force | Out-Null

$packageMetadataPath = "$artifactRootPath/PackageInfo/$artifactName.json"
if (!(Test-Path $packageMetadataPath)) {
Write-Error "Package metadata file not found: $packageMetadataPath"
exit 1
}

$packageMetadata = Get-Content -Raw $packageMetadataPath | ConvertFrom-Json
$packageVersion = $packageMetadata.version
Write-Host "Package version: $packageVersion"

$cratePath = "$artifactRootPath/$artifactName/$artifactName-$packageVersion.crate"
Copy-Item `
-Path $cratePath `
-Destination $outDir
Write-Host "Contents of $outDir"
Get-ChildItem -Path $outDir | ForEach-Object { Write-Host $_.FullName }
displayName: 'Copy crate for ESRP'

- task: EsrpRelease@10
displayName: 'ESRP Release'
inputs:
connectedservicename: 'Azure SDK PME Managed Identity'
ClientId: '5f81938c-2544-4f1f-9251-dd9de5b8a81b'
DomainTenantId: '975f013f-7f24-47e8-a7d3-abc4752bf346'
Usemanagedidentity: true
KeyVaultName: 'kv-azuresdk-codesign'
SignCertName: 'azure-sdk-esrp-release-certificate'
intent: 'packagedistribution'
contenttype: 'Rust'
contentsource: 'Folder'
folderlocation: '$(Pipeline.Workspace)/esrp-release'
waitforreleasecompletion: true
owners: ${{ coalesce(variables['Build.RequestedForEmail'], '[email protected]') }}
approvers: ${{ coalesce(variables['Build.RequestedForEmail'], '[email protected]') }}
serviceendpointurl: 'https://api.esrp.microsoft.com/'
mainpublisher: 'ESRPRELPACMANTEST'

- job: UpdatePackageVersion
displayName: "API Review and Package Version Update"
Expand All @@ -130,69 +174,32 @@ stages:
displayName: Download ${{parameters.PipelineArtifactName}} artifact
artifact: ${{parameters.PipelineArtifactName}}

- template: /eng/common/pipelines/templates/steps/create-apireview.yml
parameters:
ArtifactPath: $(Pipeline.Workspace)/${{parameters.PipelineArtifactName}}
Artifacts: ${{parameters.Artifacts}}
ConfigFileDir: $(Pipeline.Workspace)/${{parameters.PipelineArtifactName}}/PackageInfo
MarkPackageAsShipped: true
ArtifactName: ${{parameters.PipelineArtifactName}}
SourceRootPath: $(System.DefaultWorkingDirectory)
PackageName: ${{artifact.name}}

# Apply the version increment to each library, which updates the Cargo.toml and changelog files.
- task: PowerShell@2
displayName: Increment ${{artifact.name}} version
inputs:
targetType: filePath
filePath: $(Build.SourcesDirectory)/eng/scripts/Update-PackageVersion.ps1
arguments: >
-ServiceDirectory '${{parameters.ServiceDirectory}}'
-PackageName '${{artifact.name}}'
- ${{ each artifact in parameters.Artifacts }}:
- template: /eng/common/pipelines/templates/steps/create-apireview.yml
parameters:
ArtifactPath: $(Pipeline.Workspace)/${{parameters.PipelineArtifactName}}
Artifacts: ${{parameters.Artifacts}}
ConfigFileDir: $(Pipeline.Workspace)/${{parameters.PipelineArtifactName}}/PackageInfo
MarkPackageAsShipped: true
ArtifactName: ${{parameters.PipelineArtifactName}}
SourceRootPath: $(System.DefaultWorkingDirectory)
PackageName: ${{artifact.name}}

# Apply the version increment to each library, which updates the Cargo.toml and changelog files.
- task: PowerShell@2
displayName: Increment ${{artifact.name}} version
inputs:
targetType: filePath
filePath: $(Build.SourcesDirectory)/eng/scripts/Update-PackageVersion.ps1
arguments: >
-ServiceDirectory '${{parameters.ServiceDirectory}}'
-PackageName '${{artifact.name}}'

- template: /eng/common/pipelines/templates/steps/create-pull-request.yml
parameters:
PRBranchName: increment-package-version-${{parameters.ServiceDirectory}}-$(Build.BuildId)
CommitMsg: "Increment package version after release of ${{ artifact.name }}"
CommitMsg: "Increment package version after release of ${{ join(', ', parameters.Artifacts.*.name) }}"
PRTitle: "Increment versions for ${{parameters.ServiceDirectory}} releases"
CloseAfterOpenForTesting: '${{parameters.TestPipeline}}'
${{ if startsWith(variables['Build.SourceBranch'], 'refs/pull/') }}:
BaseBranchName: main

- ${{ if eq(parameters.TestPipeline, true) }}:
- job: ManualApproval
displayName: "Manual approval"
dependsOn: PublishPackage
condition: ne(variables['Skip.PublishPackage'], 'true')
pool: server
timeoutInMinutes: 120 # 2 hours
steps:
- task: ManualValidation@1
timeoutInMinutes: 60 # 1 hour
inputs:
notifyUsers: '' # Required, but empty string allowed
allowApproversToApproveTheirOwnRuns: true
instructions: "Approve yank of ${{ artifact.name }}"
onTimeout: 'resume'

- job: YankCrates
displayName: "Yank Crates"
dependsOn: ManualApproval
condition: and(succeeded(), ne(variables['Skip.PublishPackage'], 'true'))
steps:
- template: /eng/common/pipelines/templates/steps/sparse-checkout.yml

- download: current
displayName: Download ${{parameters.PipelineArtifactName}} artifact
artifact: ${{parameters.PipelineArtifactName}}

- task: PowerShell@2
displayName: Yank Crates
env:
CARGO_REGISTRY_TOKEN: $(azure-sdk-cratesio-token)
inputs:
targetType: filePath
filePath: $(Build.SourcesDirectory)/eng/scripts/Yank-Crates.ps1
arguments:
-CrateNames '${{artifact.name}}'
-PackageInfoDirectory '$(Pipeline.Workspace)/${{parameters.PipelineArtifactName}}/PackageInfo'
5 changes: 4 additions & 1 deletion eng/pipelines/templates/stages/archetype-sdk-client.yml
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,9 @@ extends:
parameters:
DependsOn: "Build"
ServiceDirectory: ${{ parameters.ServiceDirectory }}
Artifacts: ${{ parameters.Artifacts }}
Artifacts:
- ${{ each artifact in parameters.Artifacts }}:
- ${{ if ne(artifact.releaseInBatch, 'false')}}:
- ${{ artifact }}
TestPipeline: ${{ eq(parameters.ServiceDirectory, 'canary') }}
PipelineArtifactName: packages
27 changes: 22 additions & 5 deletions eng/scripts/Language-Settings.ps1
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
$Language = "rust"
$LanguageDisplayName = "Rust"
$PackageRepository = "crates.io"
$packagePattern = "Cargo.toml"
$packagePattern = "*.crate"
#$MetadataUri = "https://raw.githubusercontent.com/Azure/azure-sdk/main/_data/releases/latest/rust-packages.csv"
$GithubUri = "https://github.com/Azure/azure-sdk-for-rust"
$PackageRepositoryUri = "https://crates.io/crates"
Expand Down Expand Up @@ -139,15 +139,32 @@ function Get-rust-AdditionalValidationPackagesFromPackageSet ($packagesWithChang
return $additionalPackages ?? @()
}

# $GetPackageInfoFromPackageFileFn = "Get-${Language}-PackageInfoFromPackageFile"
function Get-rust-PackageInfoFromPackageFile([IO.FileInfo]$pkg, [string]$workingDirectory) {
#$pkg will be a FileInfo object for the Cargo.toml file in a package artifact directory
$package = cargo read-manifest --manifest-path $pkg.FullName | ConvertFrom-Json
# Create a temporary folder for extraction
$extractionPath = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName())
New-Item -ItemType Directory -Path $extractionPath | Out-Null

# Extract the .crate file (which is a tarball) to the temporary folder
tar -xvf $pkg.FullName -C $extractionPath
$cargoTomlPath = [System.IO.Path]::Combine($extractionPath, $pkg.BaseName, 'Cargo.toml')

Write-Host "Reading package info from $cargoTomlPath"
if (!(Test-Path $cargoTomlPath)) {
$message = "The Cargo.toml file was not found in the package artifact at $cargoTomlPath"
LogError $message
throw $message
}

$package = cargo read-manifest --manifest-path $cargoTomlPath | ConvertFrom-Json

$packageName = $package.name
$packageVersion = $package.version

$changeLogLoc = Get-ChildItem -Path $pkg.DirectoryName -Filter "CHANGELOG.md" | Select-Object -First 1
$readmeContentLoc = Get-ChildItem -Path $pkg.DirectoryName -Filter "README.md" | Select-Object -First 1
$packageAssetPath = [System.IO.Path]::Combine($extractionPath, "$packageName-$packageVersion")

$changeLogLoc = Get-ChildItem -Path $packageAssetPath -Filter "CHANGELOG.md" | Select-Object -First 1
$readmeContentLoc = Get-ChildItem -Path $packageAssetPath -Filter "README.md" | Select-Object -First 1

if ($changeLogLoc) {
$releaseNotes = Get-ChangeLogEntryAsString -ChangeLogLocation $changeLogLoc -VersionString $packageVersion
Expand Down
Loading
Loading