Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
This article explains how to publish your tool, service, or product that integrates with Azure DevOps on the Visual Studio Marketplace. Publishing on the Marketplace helps users discover solutions that extend and enhance their Azure DevOps experience. The Marketplace serves as the central hub for individuals and teams to find integrations and extensions.
Browse the Marketplace to see examples of other integrations and extensions.
Note
For packaging and publishing information for extensions, see Package & Publish Extensions.
Prerequisites
The following list of requirements must be met before you publish to the Marketplace.
Category | Requirements |
---|---|
Packaging tool | Install the extension packaging tool (TFX). Run npm install -g tfx-cli from a command prompt. |
Image permissions | Ensure you have proper permissions to use any images, like icons, logos, screenshots, and so on. |
Marketplace overview | Include a thorough overview.md file to describe your listing in the Marketplace. |
Extension icon | Include an icon for your extension that represents your integration, company, or organization, at least 128x128 pixels in size (PNG or JPEG). |
Microsoft product names | Use full names for Microsoft products (for example, Azure DevOps instead of AzDO or other abbreviations). |
Brand names | Don't use brand names in the name of your extension. |
Gather required assets
- At least one screenshot of your integration.
- Call-to-action or get started URL for users.
Note
- The term
extension
is used in referenced documentation. Extensions are another type of Marketplace item and share many similarities with integrations. - Need help getting your integration on the Marketplace? Contact us.
Create a publisher account
Every extension or integration, including those from Microsoft, must have a publisher. Anyone can create a publisher and publish extensions under it. You can also share publisher access with other users, such as your development team.
Sign in to the Visual Studio Marketplace Publishing Portal.
If you aren't part of an existing publisher, select + Create a publisher.
Enter a publisher name; the ID field autofills based on your entry.Note
- Ensure your publisher name is within 16 characters for multibyte characters.
- Save the publisher ID—you need it in your extension's manifest file.
If you aren't prompted to create a publisher, scroll to Publish extensions under Related sites.
- Set a unique publisher identifier, such as
mycompany-myteam
. Use this value for thepublisher
attribute in your manifest. - Set a display name, such as
My Team
.
Review the Marketplace Publisher Agreement, then select Create.
After you create the publisher, you can manage items, although no items appear until you publish.
Organize your manifest and assets
To organize your manifest and assets, do the following steps:
- Create a
home
folder to store required assets. - Create an
images
folder for:- Your integration logo (128x128 pixels)
- Screenshots (1366x768 pixels)
- Create an
overview.md
file to describe your integration. For more information, see GitHub Flavored Markdown. - Create a
vss-integration.json
file, which is your Marketplace listing's manifest file. For more information, see the extension manifest reference.
Complete the extension manifest
Publishing to the Marketplace starts with creating a manifest file that defines your integration and its key discovery details (screenshots, logos, overview content). This information is used to present your integration to users on the Marketplace.
Fill your
vss-integration.json
file with the following JSON:{ "manifestVersion": 1, "id": "myservice", "version": "1.0.0", "name": "My Service", "publisher": "mycompany", "description": "Awesome tools to help you and your team do great things everyday.", "targets": [ { "id": "Microsoft.VisualStudio.Services.Integration" } ], "icons": { "default": "images/service-logo.png" }, "categories": [ "Plan and track" ], "tags": [ "working", "people person", "search" ], "screenshots": [ { "path": "images/screen1.png" }, { "path": "images/screen2.png" } ], "content": { "details": { "path": "overview.md" }, "license": { "path": "fabrikam-license-terms.md" } }, "links": { "getstarted": { "uri": "https://www.mycompany.com/help/getstarted" }, "learn": { "uri": "https://www.mycompany.com/features" }, "support": { "uri": "https://www.mycompany.com/support" } }, "branding": { "color": "rgb(34, 34, 34)", "theme": "dark" } }
Update the JSON using the following references:
The following properties are required:
Property | Description | Notes |
---|---|---|
manifestVersion | A number corresponding to the version of the manifest format. | Should be 1 . |
ID | The extension's identifier. | Th ID is a string that must be unique among extensions from the same publisher. It must start with an alphabetic or numeric character and contain 'A' through 'Z', 'a' through 'z', '0' through '9', and '-' (hyphen). Example: sample-extension . |
version | A string specifying the version of an extension. | Should be in the format major.minor.patch , for example 0.1.2 or 1.0.0 . You can also add a fourth number for the following format: 0.1.2.3 |
name | A short, human-readable name of the extension. Limited to 200 characters. | Example: "Fabrikam Agile Board Extension" . |
publisher | The identifier of the publisher. | This identifier must match the identifier the extension is published under. See Create and manage a publisher. |
categories | Array of strings representing the categories your extension belongs to. At least one category must be provided and there's no limit to how many categories you may include. | Valid values: Azure Repos , Azure Boards , Azure Pipelines , Azure Test Plans , and Azure Artifacts .Notes:
- If you're using Azure DevOps Extension Tasks extension to publish, ensure that its version is >= 1.2.8. You might have to approve the extension update because of recent scope changes. - The categories previously mentioned are natively present in Visual Studio Marketplace and Azure DevOps Server 2019 & above. |
targets | The products and services supported by your integration or extension. For more information, see installation targets. | An array of objects, where each object has an id field indicating one of the following:
Microsoft.VisualStudio.Services (extensions that works with Azure DevOps),- Microsoft.TeamFoundation.Server (extension that works with Azure DevOps Server),- Microsoft.VisualStudio.Services.Integration , - Microsoft.TeamFoundation.Server.Integration (integrations that work with Azure DevOps Server) |
The following optional properties help users discover and learn about your extension:
Property | Description | Notes |
---|---|---|
description | A few sentences describing the extensions. Limited to 200 characters. | The description should be your extension's "elevator pitch" - a couple of lines to describe your extension in the Marketplace and make people want to install it. See the example below |
icons | Dictionary of icons representing the extension. | Valid keys: default (128x128 pixels) of type BMP, GIF, EXIF, JPG, PNG and TIFF). Other keys such as large (512x512 pixels) may be supported in the future. The value of each key is the path to the icon file in the extension |
tags | Array of string tags to help users find your extension. | Examples: agile , project management , task timer , and so on. |
screenshots | Array of images that couldn't be included in your content. | Screenshots are more valuable when featured in your content, and should be used there to help make a quality market details page for your extension. Use screenshots for less important images not featured in your content. Each image should be 1366x768 pixels. The path of each item is the path to the file in the extension. |
content | Dictionary of content files that describe your extension to users. | Every extension should include solid content. This is how you'll show users what your extension can do. Make it rich, consumable, and include screenshots where necessary. Include an overview.md file as your base content piece. Each file is assumed to be in GitHub Flavored Markdown format. The path of each item is the path to the Markdown file in the extension. Valid keys: details . Other keys may be supported in the future. |
links | Dictionary of links that help users learn more about your extension, get support, and move. | Valid keys: getstarted - first steps, how to setup or use. learn - deeper content to help users better understand your extension or service. license - end-user license agreement. privacypolicy - privacy policy for an extension. support - get help and support for an extension. The value of each key is an object with a uri field, which is the absolute URL of the link |
repository | Dictionary of properties describing the source code repository for the extension | Valid Keys: type - Type of repository. Example: git. uri - Absolute URL of the repository. |
badges | Array of links to external metadata badges like TravisCI, Appveyor, and so on, from the approved badges sites | Valid keys: href - Link the user navigates to when selecting the badge. uri - The absolute URL of the badge image to be displayed. description - Description of the badge, to be displayed on hover. |
branding | Dictionary of brand-related properties. | Valid keys: color - primary color of the extension or publisher; can be a hex (#ff00ff), RGB (rgb(100,200,50)), or supported HTML color names (blue). theme - complements the color; use dark for dark branding colors, or light for lighter branding colors. |
Understand the details page
- 1 - description
- 2 - icon
- 3 - categories
- 4 - screenshots
- 5 - content (details)
- 6 - links
- 7 - branding
Warning
Set the public
attribute to false
or omit it to prevent your integration from becoming visible to all Marketplace users before you're ready.
Package your manifest and assets
Install the package tool (tfx-cli)
Install or update the cross-platform CLI for Azure DevOps (tfx-cli) using npm
:
npm i -g tfx-cli
Package your integration in a .vsix file
tfx extension create --manifest-globs vss-extension.json
Note
Increment the version of your extension or integration with every update.
If you haven't updated the version in your manifest, use the --rev-version
command line switch. This switch automatically increments the patch version number and saves the new version to your manifest.
Publish your integration to the Marketplace
Once your extension is packaged, you can upload it to the Marketplace under a publisher. The publisher
identifier specified in your extension's manifest file must match the identifier of the publisher the extension is uploaded under.
From the management portal, select your publisher from the drop-down menu at the top of the page.
Select New extension > Azure DevOps.
Drag and drop your file or select it to find your VSIX file, which you created in the previous packaging step, and then choose Upload.
After quick validation, your extension appears in the list of published extensions. Don't worry, the extension is only visible to you.
At this point, your extension isn't visible to any accounts. To make it visible to others, you need to share the extension.
Note
Microsoft runs a virus scan on each new and updated extension package published. Until the scan is all clear, we don't publish the extension in the Marketplace for public usage. This way we also avoid surfacing inappropriate or offensive content on the Marketplace pages.
Share your integration
Before installing an integration in an Azure DevOps organization, share it with that organization. Sharing is required for development and testing, as it's the only way to run an integration during these stages.
To share an integration do the following steps:
- Select an integration from the list of displayed items
- Select the Share button
- Specify the name of the organization to make this integration visible to. For example, to make an integration visible to the dev.azure.com/fabrikam-fiber-inc organization, specify
fabrikam-fiber-inc
.
Update an item
To update an extension you already published, do the following steps:
Tip
Update your extension instead of removing and re-uploading it. We recommend maintaining two extensions: publisher.extension
, public in the Marketplace for customers, and publisher.extension-dev
, private, shared only with your organization for development and testing.
You don't need two copies of your source code—just maintain separate manifest files for each extension. When packaging, provide the appropriate manifest file to the tfx-cli tool. For more information, see TFX extension commands.
- Select your extension from the list of displayed items.
- Right-click and select Update for the development version, such as
publisher.extension-dev
. - Validate your extension.
- Apply the same updates to the production version, such as
publisher.extension
. - Browse to the .vsix file for your extension and upload it.
Azure DevOps automatically installs the updated version for all accounts that already have the extension. New installations also receive the latest version.
Make your integration public
For information on making your integration visible to everyone, see Make your listing public.