Есть ли способ автоматически публиковать расширение кода Visual Studio через конвейер DevOps Azure?
Конечно, да!
Чтобы получить хороший опытдля CI / CD в Azure Devops я рекомендую хранить исходный код в Azure Devops или Github.
В сборке большая часть работы заключается в обновлении версии, которая в манифесте VSIX, сборка \ создание пакета. Для увеличения версии здесь я использую функцию выражения counter
, которая поддерживается в VSTS для достижения этой цели:
counter('name', seed)
Используйте это выражение в блоке объявления переменных. Подробный и завершенный процесс сборки приведен в моем примере кода YAML:
trigger:
- '*'
pool:
vmImage: 'windows-2019'
variables:
VersionPatch: $[counter('versioncount', 24)]
solution: '**/*.sln'
BuildPlatform: 'Any CPU'
BuildConfiguration: 'Release'
name: 2.0.$(VersionPatch)
steps:
- task: UseDotNet@2
inputs:
packageType: 'sdk'
version: '3.0.100'
includePreviewVersions: true
- task: NuGetToolInstaller@1
inputs:
versionSpec: 5.1.0
- task: PowerShell@2
displayName: Update version
inputs:
filePath: 'Build\VersionUpdate.ps1'
arguments: '$(Build.BuildNumber)'
pwsh: true
- task: NuGetCommand@2
inputs:
command: 'restore'
- task: DotNetCoreCLI@2
displayName:
inputs:
command: 'restore'
projects: 'tests/**/*.csproj'
vstsFeed: '{My feed ID}'
includeNuGetOrg: false
- task: VSBuild@1
inputs:
solution: '**\*.sln'
maximumCpuCount: true
platform: '$(BuildPlatform)'
configuration: '$(BuildConfiguration)'
- task: VSTest@2
inputs:
platform: '$(BuildPlatform)'
configuration: '$(BuildConfiguration)'
- task: CopyFiles@2
inputs:
SourceFolder: '$(Build.SourcesDirectory)'
Contents: |
Build/**
**/*.vsix
**/*.nupkg
README.md
TargetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishPipelineArtifact@0
inputs:
artifactName: 'ExtensionDrop'
targetPath: '$(Build.ArtifactStagingDirectory)'
В файле UpdateVersion.ps1:
$VerbosePreference="Continue"
$version = $args[0]
if (!$version) {
$version = "0.0.0"
}
Write-Host "This Version is: $version"
$FullPath = Resolve-Path $PSScriptRoot\..\src\Merlin.Compiler.Vsix\source.vsixmanifest
Write-Host $FullPath
[xml]$content = Get-Content $FullPath
$content.PackageManifest.Metadata.Identity.Version = $version
$content.Save($FullPath)
После успешного завершения сборки установите конвейер выпуска для этих репозиториев. В релизе используйте сценарий powershell и VsixPublisher.exe
для публикации файла vsix
.
$PAToken = $args[0]
$VsixPath = "$PSScriptRoot\..\src\Merlin.Compiler.Vsix\bin\Release\Merlin.Compiler.Vsix"
$ManifestPath = "$PSScriptRoot\ExtensionManifest.json"
$Installation = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -format json | ConvertFrom-Json
$Path = $Installation.installationPath
$VsixPublisher = Join-Path -Path $Path -ChildPath "VSSDK\VisualStudioIntegration\Tools\Bin\VsixPublisher.exe" -Resolve
& $VsixPublisher publish -payload $VsixPath -publishManifest $ManifestPath -personalAccessToken $PAToken -ignoreWarnings "VSIXValidatorWarning01,VSIXValidatorWarning02,VSIXValidatorWarning08"
На компакт-диске используйте VsixPublisher.exe
, существующие в VS, для публикации файла vsix
.
Вы можете установить PAToken на вкладке Variable, затем установить его как секретный . Таким образом, это не будет публичным для других. Здесь токен PAT является необходимым, который не может быть заменен другими. А также, когда генерируется токен, нужно выбрать Все доступные организации . Или это приведет к ошибке разрешения.