Публикация расширения VS Code через Azure DevOps - PullRequest
2 голосов
/ 02 октября 2019

После прочтения VSCode Publish Extension документов мне удалось опубликовать расширение VSCode вручную с помощью vsce.

. Мне интересно, есть ли способ автоматически публиковать расширения? через конвейеры Azure DevOps (сборка или выпуск) вместо того, чтобы делать это вручную.

Я пытался использовать vsce там, но получаю ошибку аутентификации

Ресурс недоступны для анонимного доступа. Требуется проверка подлинности клиента.

Использование vsce publish -p <access_token> невозможно, поскольку конвейер является общедоступным, и каждый может видеть токен доступа ...

Итак, есть ли способ опубликоватьРасширение кода Visual Studio автоматически через Azure DevOps Pipeline или даже Travis CI?

Ответы [ 3 ]

4 голосов
/ 02 октября 2019

Вы можете добавить личный токен доступа в качестве секретной переменной, тогда никто не сможет его увидеть.

Перейдите в Azure DevOps к вашему конвейеру и нажмите «Изменить», а не в левом верхнем углу. на «Переменные»:

enter image description here

Теперь нажмите на значок + и добавьте переменную, отметьте флажок «Сохранить это значение в секрете»:

enter image description here

Теперь вы можете использовать его следующим образом: $(PAT), например:

vsce publish -p $(PAT)

Значение переменной не будетпоявляются в YAML:)

3 голосов
/ 02 октября 2019

Есть ли способ автоматически публиковать расширение кода Visual Studio через конвейер DevOps Azure?

Конечно, да!

Чтобы получить хороший опытдля CI / CD в Azure Devops я рекомендую хранить исходный код в Azure Devops или Github.

  • Build \ CI

В сборке большая часть работы заключается в обновлении версии, которая в манифесте 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)
  • Release \ CD

После успешного завершения сборки установите конвейер выпуска для этих репозиториев. В релизе используйте сценарий 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 является необходимым, который не может быть заменен другими. А также, когда генерируется токен, нужно выбрать Все доступные организации . Или это приведет к ошибке разрешения.

enter image description here

2 голосов
/ 02 октября 2019

Далее @ ответ Шайки, есть еще несколько шагов, потому что вы не можете просто запустить vsce publish -p $(PAT).

  1. Необходимо установить vsce (может быть в devDependencies)
  2. Добавьте сценарий развертывания (или назовите его как хотите) в сценарии package.json .
"deploy": "vsce publish -p"
Добавить шаг «публикации» в файл azure-pipeline.yml . condition предназначен для запуска сценария публикации только на master, поэтому запросы на извлечение не будут опубликованы. Также запускайте его только в сборке Linux, если вы настроили несколько платформ. Если вы настроили только одну (например, Windows), замените Linux этой платформой
- bash: |
   echo ">>> Publish"
   yarn deploy $(token)
 displayName: Publish
 condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Agent.OS'], 'Linux'))

Пример azure-pipeline.yml

...