This repository hosts GitHub Actions and Azure Pipelines tasks to package, publish, and manage Azure DevOps extensions in the Visual Studio Marketplace.
- Package: Package an Azure DevOps extension into a
.vsixfile. - Publish: Optionally package and publish an extension to the Visual Studio Marketplace.
- Unpublish: Remove an extension from the Visual Studio Marketplace.
- Share: Share an extension with an Azure DevOps organization.
- Unshare: Remove sharing for an extension from one or more Azure DevOps organizations.
- Install: Install an extension into an Azure DevOps organization.
- Show: Query extension metadata from the marketplace.
- Query version: Query the current extension version and optionally increment it.
- Wait for validation: Wait for Marketplace validation to finish.
- Wait for installation: Wait until extension tasks are available in target organizations.
- v6 docs index
- Using v6 in Azure Pipelines
- Using v6 in GitHub Actions
- Authentication and OIDC
- Design and architecture
- Contributing guide
- Migrate Azure Pipelines from v5 to v6
- Migrate Azure Pipelines to GitHub Actions
- Migrate Azure Pipelines v5 to GitHub Actions
When creating a PAT for pipeline automation, include at least the following scopes:
- Publish:
Marketplace (publish) - Unpublish:
Marketplace (manage) - Share:
Marketplace (publish) - Unshare:
Marketplace (publish) - Install:
Extensions (read and manage),Marketplace (acquire) - Show:
Marketplace (read) - Query version:
Marketplace (read) - Wait for validation:
Marketplace (read) - Wait for installation:
Extensions (read and manage),Agent Pools (read)
- uses: jessehouwing/azdo-marketplace@v6
id: publish
with:
operation: publish
auth-type: pat
token: ${{ secrets.MARKETPLACE_TOKEN }}
publisher-id: my-publisher
extension-id: my-extension
manifest-file: vss-extension.json
- run: echo "VSIX: ${{ steps.publish.outputs.vsix-file }}"
- run: echo "VSIX file name: ${{ steps.publish.outputs.vsix-file-name }}"- uses: jessehouwing/azdo-marketplace@v6
with:
operation: package
working-directory: tests/sample-extension
manifest-file: vss-extension.jsonFor manifest-based operations, manifest-file patterns are resolved from working-directory when specified. If working-directory is omitted, the current working directory is used.
operation: Selects which command to run (package,publish,install,share,unshare,unpublish,show,query-version,wait-for-validation,wait-for-installation).
auth-type: Chooses authentication mode (pat,basic,oidc) for authenticated operations.service-url: Overrides the Azure DevOps/Marketplace endpoint for supported operations.token: Provides the secret token used forpatandbasicauthentication.tfx-version: Selects thetfx-clisource (built-in,path, or npm version spec);built-inuses the bundled version, whilepathusestfxfrom PATH.username: Provides the username whenauth-typeisbasic.
extension-id: Sets or overrides the extension identifier inside the publisher namespace (required forshow, optional forinstall/share/unshare/unpublish/wait-for-validation/query-versionwhen inferred from manifest or VSIX inputs).publisher-id: Sets or overrides the extension publisher identifier (required forshow, optional forinstall/share/unshare/unpublish/wait-for-validation/query-versionwhen inferred from manifest or VSIX inputs).
manifest-file: Points to one or more manifest files used for manifest-based operations and identity fallback in install/share/unshare/unpublish/wait-for-validation/query-version.working-directory: Sets the base directory for manifest-based operations.manifest-filepatterns are resolved from this directory when specified.manifest-file-js: Points to a JS manifest module fortfx --manifest-js.overrides-file: Points to an overrides JSON file merged into manifest packaging/publishing.use: Chooses publish input source (manifestorvsix).vsix-file: Points to a pre-built VSIX file when publishing from VSIX source.vsix-file: Provides a VSIX file for identity/task discovery in install/share/unshare/validation flows.
bypass-validation: Skips package-time validation checks.extension-name: Overrides extension display name during package/publish.extension-pricing: Overrides pricing behavior (default,free,paid).extension-version: Overrides extension version during package/publish/validation flows.extension-visibility: Overrides marketplace visibility (private,public, preview variants).localization-root: Points to localization resources for package/publish.no-wait-validation: Skips waiting for marketplace validation after publish.output-path: Sets where generated VSIX files are written.update-tasks-id: Regenerates deterministic task IDs for extension variants.update-tasks-version: Controls task version update strategy (none,major,minor,patch).
accounts: Provides newline-separated Azure DevOps organizations for install/share/unshare/verification operations.
marketplace-version-action: Controls how the queried marketplace version is transformed (None,Major,Minor,Patch).version-source: Specifies which version sources to consider (newline-separated); highest valid semver wins. Values:marketplace,manifest,vsix, or a semver literal. Defaults tomarketplace.
polling-interval-seconds: Sets polling interval between checks.timeout-minutes: Sets total wait time.
expected-tasks: Provides task/version expectations to verify.
vsix-file: Returns path to the generated VSIX file.vsix-file-name: Returns the generated VSIX filename (for examplepublisher.extension-1.2.3.vsix).
metadata: Returns extension metadata JSON.
current-version: Returns the current version before any increment is applied.proposed-version: Returns the computed version after applying the version action.version-source: Returns the source that provided the winning version (marketplace,manifest,vsix, orliteral).
- uses: jessehouwing/azdo-marketplace/package@v6
id: package
with:
publisher-id: my-publisher
extension-id: my-extension
working-directory: extension
manifest-file: vss-extension.json
- run: echo "Packaged: ${{ steps.package.outputs.vsix-file }}"
- run: echo "Packaged filename: ${{ steps.package.outputs.vsix-file-name }}"- uses: jessehouwing/azdo-marketplace/publish@v6
with:
token: ${{ secrets.MARKETPLACE_TOKEN }}
publisher-id: my-publisher
extension-id: my-extension
working-directory: extension
manifest-file: vss-extension.json- uses: jessehouwing/azdo-marketplace/install@v6
with:
token: ${{ secrets.MARKETPLACE_TOKEN }}
working-directory: extension
manifest-file: vss-extension.json
accounts: myorg- uses: jessehouwing/azdo-marketplace/share@v6
with:
token: ${{ secrets.MARKETPLACE_TOKEN }}
working-directory: extension
manifest-file: vss-extension.json
accounts: customer-org- uses: jessehouwing/azdo-marketplace/unshare@v6
with:
token: ${{ secrets.MARKETPLACE_TOKEN }}
working-directory: extension
manifest-file: vss-extension.json
accounts: old-customer-org- uses: jessehouwing/azdo-marketplace/unpublish@v6
with:
token: ${{ secrets.MARKETPLACE_TOKEN }}
working-directory: extension
manifest-file: vss-extension.json- uses: jessehouwing/azdo-marketplace/show@v6
id: show
with:
token: ${{ secrets.MARKETPLACE_TOKEN }}
publisher-id: my-publisher
extension-id: my-extension
- run: echo '${{ steps.show.outputs.metadata }}'- uses: jessehouwing/azdo-marketplace/query-version@v6
id: query
with:
token: ${{ secrets.MARKETPLACE_TOKEN }}
publisher-id: my-publisher
extension-id: my-extension
working-directory: extension
manifest-file: vss-extension.json
marketplace-version-action: Patch
- run: echo "Next: ${{ steps.query.outputs.proposed-version }}"- uses: jessehouwing/azdo-marketplace/wait-for-validation@v6
with:
token: ${{ secrets.MARKETPLACE_TOKEN }}
working-directory: extension
manifest-file: vss-extension.json- uses: jessehouwing/azdo-marketplace/wait-for-installation@v6
with:
token: ${{ secrets.MARKETPLACE_TOKEN }}
publisher-id: my-publisher
extension-id: my-extension
accounts: myorg
working-directory: extension
manifest-file: vss-extension.json- From the root of the repo run
npm run initdev. This will pull down the necessary modules and TypeScript declare files. - Run
npm run buildto compile the build tasks. - Run
npm run packageto create a .vsix extension package that includes the build tasks.
