Skip to content

Publish extension #2855

Publish extension

Publish extension #2855

name: Publish extension
on:
workflow_dispatch:
inputs:
extension:
description: Extension JSON object
required: true
type: string
publishContext:
description: Publish context JSON object
required: true
type: string
skipPublish:
description: Skip publishing to Open VSX, only build extensions
type: boolean
required: false
default: false
force:
description: Force publish to Open VSX, even if version is already published
type: boolean
required: false
default: false
jobs:
download_release:
name: Download latest release (${{ fromJson(inputs.extension).id }})
runs-on: ubuntu-latest
permissions:
contents: read
env:
DO_DOWNLOAD: ${{ fromJSON(inputs.publishContext).files != null }}
steps:
- uses: actions/checkout@v5
if: ${{ env.DO_DOWNLOAD == 'true' }}
- uses: actions/[email protected]
if: ${{ env.DO_DOWNLOAD == 'true' }}
with:
node-version: "22.x"
- run: npm install
if: ${{ env.DO_DOWNLOAD == 'true' }}
- run: npm i -g @vscode/vsce pnpm
if: ${{ env.DO_DOWNLOAD == 'true' }}
- id: download_extension
uses: actions/github-script@v7
if: ${{ env.DO_DOWNLOAD == 'true' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
EXTENSION: ${{ inputs.extension }}
PUBLISH_CONTEXT: ${{ inputs.publishContext }}
with:
script: |
const script = require('./scripts/download-extension.js');
await script();
build_extension:
name: Build Extension (${{ fromJson(inputs.extension).id }})
runs-on: ubuntu-latest
needs: download_release
permissions:
actions: none
steps:
- uses: actions/checkout@v5
- uses: actions/[email protected]
with:
node-version: "22.x"
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Set up pyenv
uses: "gabrielfalcao/pyenv-action@32ef4d2c861170ce17ded56d10329d83f4c8f797"
with:
command: python --version
- name: Set default global version
run: |
pyenv install 3.9
pyenv global 3.9
- uses: actions/setup-java@v4
with:
distribution: "microsoft"
java-version: "21"
- name: Install dependencies for native modules
run: |
sudo apt-get update
sudo apt-get install libpango1.0-dev libgif-dev
- run: npm install
- run: npm i -g @vscode/vsce pnpm
- uses: actions/download-artifact@v4
with:
path: /tmp
- id: build_extension
name: Build extension
uses: actions/github-script@v7
env:
FORCE: ${{ inputs.force }}
SKIP_PUBLISH: ${{ inputs.skipPublish }}
EXTENSION: ${{ inputs.extension }}
PUBLISH_CONTEXT: ${{inputs.publishContext}}
with:
script: |
const extension = JSON.parse(process.env.EXTENSION);
const publishContext = JSON.parse(process.env.PUBLISH_CONTEXT);
const buildScript = require('./scripts/build-extension.js');
const extensionFiles = await buildScript(extension, publishContext);
const uploadScript = require('./scripts/upload-artifacts.js');
await uploadScript(extensionFiles);
core.setOutput("extensionFiles", JSON.stringify(extensionFiles));
outputs:
extensionFiles: ${{ steps.build_extension.outputs.extensionFiles }}
publish_extension:
name: Publish Extension (${{ fromJson(inputs.extension).id }})
runs-on: ubuntu-latest
if: ${{ inputs.skipPublish != 'true' }}
needs: build_extension
permissions:
actions: none
steps:
- uses: actions/checkout@v5
- uses: actions/[email protected]
with:
node-version: "22.x"
- run: npm install
- run: npm i -g @vscode/vsce pnpm
- uses: actions/download-artifact@v4
with:
path: /tmp
- uses: actions/github-script@v7
env:
OVSX_PAT: ${{ secrets.OVSX_PAT }}
EXTENSION_ID: ${{ fromJson(inputs.extension).id }}
EXTENSION_FILES: ${{needs.build_extension.outputs.extensionFiles}}
with:
script: |
const extensionId = process.env.EXTENSION_ID;
const extensionFiles = JSON.parse(process.env.EXTENSION_FILES);
const script = require('./scripts/publish-extension.js');
await script(extensionId, extensionFiles);