Edit

Share via


Package and publish an integration to the Marketplace

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.

  1. Sign in to the Visual Studio Marketplace Publishing Portal.

  2. 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.

    Screenshot showing highlighted button, Create publisher.

    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 the publisher attribute in your manifest.
    • Set a display name, such as My Team.
  3. Review the Marketplace Publisher Agreement, then select Create.

    Create publisher for extension

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:

  1. Create a home folder to store required assets.
  2. Create an images folder for:
    • Your integration logo (128x128 pixels)
    • Screenshots (1366x768 pixels)
  3. Create an overview.md file to describe your integration. For more information, see GitHub Flavored Markdown.
  4. 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.

  1. 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"
        }
    }
    
  2. 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:
    - Use version >=0.6.3 of the tfx-cli if you're publishing the extension programmatically.
    - 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

Screenshot shows details card for extension in the Visual Studio Marketplace.

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.

  1. From the management portal, select your publisher from the drop-down menu at the top of the page.

  2. Select New extension > Azure DevOps.

    Screenshot showing New extension  dropdown menu and highlighted Azure DevOps selection.

  3. 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.

    Screenshot showing Upload of new extension for Azure DevOps.

    After quick validation, your extension appears in the list of published extensions. Don't worry, the extension is only visible to you.

    Screenshot showing extension in the list of published extensions.

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:

  1. Select an integration from the list of displayed items
  2. Select the Share button
  3. 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.

  1. Select your extension from the list of displayed items.
  2. Right-click and select Update for the development version, such as publisher.extension-dev.
  3. Validate your extension.
  4. Apply the same updates to the production version, such as publisher.extension.
  5. 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.