Home

Awesome

Publish VS Code Extension — GitHub Action

Build, Lint, Test and Deploy Coverage Status
License Stars
Donate

GitHub action to publish your VS Code Extension to the Open VSX Registry or the Visual Studio Marketplace.

All breaking changes of v1 are listed in the changelog

Usage

To use the GitHub Action, just reference the action in your workflow file.

Example

The following example shows a workflow that publishes an extension to the Open VSX Registry as well as to the Visual Studio Marketplace when a new tag was created:

on:
  push:
    tags:
      - "*"

name: Deploy Extension
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm ci
      - name: Publish to Open VSX Registry
        uses: HaaLeo/publish-vscode-extension@v1
        with:
          pat: ${{ secrets.OPEN_VSX_TOKEN }}
      - name: Publish to Visual Studio Marketplace
        uses: HaaLeo/publish-vscode-extension@v1
        with:
          pat: ${{ secrets.VS_MARKETPLACE_TOKEN }}
          registryUrl: https://marketplace.visualstudio.com

To package the extension only once and publish the identical .vsix file to both registries one can use the following two steps instead:

- name: Publish to Open VSX Registry
  uses: HaaLeo/publish-vscode-extension@v1
  id: publishToOpenVSX
  with:
    pat: ${{ secrets.OPEN_VSX_TOKEN }}
- name: Publish to Visual Studio Marketplace
  uses: HaaLeo/publish-vscode-extension@v1
  with:
    pat: ${{ secrets.VS_MARKETPLACE_TOKEN }}
    registryUrl: https://marketplace.visualstudio.com
    extensionFile: ${{ steps.publishToOpenVSX.outputs.vsixPath }}

For a more complete and complex example one can check out the workflow of HaaLeo/vscode-timing.

Open VSX Registry

To publish to the Open VSX Registry ensure that your extension's namespace was created beforehand. You need to set the pat parameter to your Open VSX access token. Further, you should ensure that you only publish an extension which is licensed. For more information regarding Open VSX' timeline and its extensions' licensing check out Brian King's blog (section "Licensing" and "Timeline").

Currently, this GitHub action allows you to publish extensions which do not state their license terms. However, this behavior is deprecated and a future release of this action will reject unlicensed extensions. Therefore, I heavily encourage you to publish an extension with a (permissive) license such as the MIT license.

Visual Studio Marketplace

In order to upload your extension to the VS Marketplace you need to set the pat option to the corresponding access token. Further, the registryUrl must be set to https://marketplace.visualstudio.com.

Input Parameters

You can set any or all of the following input parameters:

NameTypeRequired?DefaultDescription
patstringyes-The personal access token to the corresponding registry.
extensionFilestringno-Path to the vsix file to be published. This option will be preferred when set together with packagePath.
registryUrlstringnohttps://open-vsx.orgUse the registry API at this base URL
packagePathstringno./Path to the extension to be packaged and published. When extensionFile is set too packagePath is ignored.
baseContentUrlstringno-Prepend all relative links in README.md with this URL.
baseImagesUrlstringno-Prepend all relative image links in README.md with this URL.
yarnbooleannofalseUse yarn instead of npm while packing extension files.
dryRunbooleannofalseSet this option to true to package your extension but do not publish it. When using this option set the pat option to a stub value.
noVerifybooleannofalseAllow publishing extensions to the visual studio marketplace which use a proposed API (enableProposedApi: true). Similar to vsce's --noVerify command line argument.
preReleasebooleannofalseMark the extensions release as pre-release. Is only considered when packaging an extension.
dependenciesbooleannotrueCheck that dependencies defined in package.json exist in node_modules. Set to false if using pnpm or yarn v2+ with PnP.
skipDuplicatebooleannofalseFail silently if version already exists on the marketplace. Equivalent to the --skip-duplicate option of the vsce CLI.
targetstringno-Target architecture(s) the extension should run on. Separate multiple targets with spaces. E.g.: 'win32-x64 linux-x64'

Outputs

The action exposes the following outputs:

NameTypeDescription
vsixPathstringThe path to the packaged and published VSIX file.

Contribution

If you found a bug or are missing a feature do not hesitate to file an issue.
Pull Requests are welcome! To get started submitting code changes please take a look at the CONTRIBUTING.md file first.

Support

When you like this extension make sure to star the repo. I am always looking for new ideas and feedback.
In addition, it is possible to donate via paypal.