Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 58 additions & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: ci
name: CI

on:
push:
Expand All @@ -11,6 +11,7 @@ on:

jobs:
lint:
name: Lint
runs-on: ubuntu-22.04

steps:
Expand All @@ -19,6 +20,7 @@ jobs:
- uses: actions/setup-node@v6
with:
node-version: "22"
cache: "yarn"

- run: yarn

Expand All @@ -29,6 +31,7 @@ jobs:
- run: yarn build

test:
name: Test
runs-on: ubuntu-22.04

steps:
Expand All @@ -37,7 +40,61 @@ jobs:
- uses: actions/setup-node@v6
with:
node-version: "22"
cache: "yarn"

- run: yarn

- run: yarn test:ci

package:
name: Package
runs-on: ubuntu-22.04
needs: [lint, test]
steps:
- uses: actions/checkout@v5

- uses: actions/setup-node@v6
with:
node-version: "22"
cache: "yarn"

- name: Install dependencies
run: |
yarn
npm install -g @vscode/vsce

- name: Get version from package.json
id: version
run: |
VERSION=$(node -e "console.log(require('./package.json').version)")
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Version: $VERSION"

- name: Setup package path
id: setup
run: |
EXTENSION_NAME=$(node -e "console.log(require('./package.json').name)")
# Add commit SHA for CI builds
SHORT_SHA=$(git rev-parse --short HEAD)
PACKAGE_NAME="${EXTENSION_NAME}-${{ steps.version.outputs.version }}-${SHORT_SHA}.vsix"
echo "packageName=$PACKAGE_NAME" >> $GITHUB_OUTPUT

- name: Package extension
run: vsce package --out "${{ steps.setup.outputs.packageName }}"

- name: Upload artifact (PR)
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@v4
with:
name: extension-pr-${{ github.event.pull_request.number }}
path: ${{ steps.setup.outputs.packageName }}
if-no-files-found: error
retention-days: 7

- name: Upload artifact (main)
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: actions/upload-artifact@v4
with:
name: extension-main-${{ github.sha }}
path: ${{ steps.setup.outputs.packageName }}
if-no-files-found: error
78 changes: 78 additions & 0 deletions .github/workflows/pre-release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Pre-Release
on:
push:
tags:
- "v*-pre"

permissions:
# Required to publish a release
contents: write
pull-requests: read

jobs:
package:
name: Package
runs-on: ubuntu-22.04
outputs:
version: ${{ steps.version.outputs.version }}
steps:
- uses: actions/checkout@v5

- uses: actions/setup-node@v6
with:
node-version: "22"

- name: Extract version from tag
id: version
run: |
# Extract version from tag (remove 'v' prefix and '-pre' suffix)
TAG_NAME=${GITHUB_REF#refs/tags/v}
VERSION=${TAG_NAME%-pre}
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Pre-release version: $VERSION"

- name: Validate version matches package.json
run: |
TAG_VERSION="${{ steps.version.outputs.version }}"
PACKAGE_VERSION=$(node -e "console.log(require('./package.json').version)")

if [ "$TAG_VERSION" != "$PACKAGE_VERSION" ]; then
echo "Error: Tag version ($TAG_VERSION) does not match package.json version ($PACKAGE_VERSION)"
echo "Please ensure the tag version matches the version in package.json"
exit 1
fi

echo "Version validation successful: $TAG_VERSION"

- name: Install dependencies
run: |
yarn
npm install -g @vscode/vsce

- name: Setup package path
id: setup
run: |
EXTENSION_NAME=$(node -e "console.log(require('./package.json').name)")
PACKAGE_NAME="${EXTENSION_NAME}-${{ steps.version.outputs.version }}-pre.vsix"
echo "packageName=$PACKAGE_NAME" >> $GITHUB_OUTPUT

- name: Package extension
run: vsce package --pre-release --out "${{ steps.setup.outputs.packageName }}"

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: extension-${{ steps.version.outputs.version }}
path: ${{ steps.setup.outputs.packageName }}
if-no-files-found: error

publish:
name: Publish Extension and Create Pre-Release
needs: package
uses: ./.github/workflows/publish-extension.yaml
with:
version: ${{ needs.package.outputs.version }}
isPreRelease: true
secrets:
VSCE_PAT: ${{ secrets.VSCE_PAT }}
OVSX_PAT: ${{ secrets.OVSX_PAT }}
125 changes: 125 additions & 0 deletions .github/workflows/publish-extension.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
name: Publish Extension

on:
workflow_call:
inputs:
version:
required: true
type: string
description: "Version to publish"
isPreRelease:
required: false
type: boolean
default: false
description: "Whether this is a pre-release"
secrets:
VSCE_PAT:
required: false
OVSX_PAT:
required: false

jobs:
setup:
name: Setup
runs-on: ubuntu-22.04
outputs:
packageName: ${{ steps.package.outputs.packageName }}
hasVscePat: ${{ steps.check-secrets.outputs.hasVscePat }}
hasOvsxPat: ${{ steps.check-secrets.outputs.hasOvsxPat }}
steps:
- uses: actions/checkout@v5

- uses: actions/setup-node@v6
with:
node-version: "22"

- name: Construct package name
id: package
run: |
EXTENSION_NAME=$(node -e "console.log(require('./package.json').name)")
if [ "${{ inputs.isPreRelease }}" = "true" ]; then
PACKAGE_NAME="${EXTENSION_NAME}-${{ inputs.version }}-pre.vsix"
else
PACKAGE_NAME="${EXTENSION_NAME}-${{ inputs.version }}.vsix"
fi
echo "packageName=$PACKAGE_NAME" >> $GITHUB_OUTPUT
echo "Package name: $PACKAGE_NAME"

- name: Check secrets
id: check-secrets
env:
VSCE_PAT: ${{ secrets.VSCE_PAT }}
OVSX_PAT: ${{ secrets.OVSX_PAT }}
run: |
echo "hasVscePat=$([ -n "$VSCE_PAT" ] && echo true || echo false)" >> $GITHUB_OUTPUT
echo "hasOvsxPat=$([ -n "$OVSX_PAT" ] && echo true || echo false)" >> $GITHUB_OUTPUT

publishMS:
name: Publish to VS Marketplace
needs: setup
runs-on: ubuntu-22.04
if: ${{ needs.setup.outputs.hasVscePat == 'true' }}
steps:
- uses: actions/setup-node@v6
with:
node-version: "22"

- name: Install vsce
run: npm install -g @vscode/vsce

- uses: actions/download-artifact@v5
with:
name: extension-${{ inputs.version }}

- name: Publish to VS Marketplace
run: |
echo "Publishing version ${{ inputs.version }} to VS Marketplace"
if [ "${{ inputs.isPreRelease }}" = "true" ]; then
vsce publish --pre-release --packagePath "./${{ needs.setup.outputs.packageName }}" -p ${{ secrets.VSCE_PAT }}
else
vsce publish --packagePath "./${{ needs.setup.outputs.packageName }}" -p ${{ secrets.VSCE_PAT }}
fi

publishOVSX:
name: Publish to Open VSX
needs: setup
runs-on: ubuntu-22.04
if: ${{ needs.setup.outputs.hasOvsxPat == 'true' }}
steps:
- uses: actions/setup-node@v6
with:
node-version: "22"

- name: Install ovsx
run: npm install -g ovsx

- uses: actions/download-artifact@v5
with:
name: extension-${{ inputs.version }}

- name: Publish to Open VSX
run: |
echo "Publishing version ${{ inputs.version }} to Open VSX"
if [ "${{ inputs.isPreRelease }}" = "true" ]; then
ovsx publish "./${{ needs.setup.outputs.packageName }}" --pre-release -p ${{ secrets.OVSX_PAT }}
else
ovsx publish "./${{ needs.setup.outputs.packageName }}" -p ${{ secrets.OVSX_PAT }}
fi

publishGH:
name: Create GitHub ${{ inputs.isPreRelease && 'Pre-' || '' }}Release
needs: setup
runs-on: ubuntu-22.04
steps:
- uses: actions/download-artifact@v5
with:
name: extension-${{ inputs.version }}

- name: Create ${{ inputs.isPreRelease && 'Pre-' || '' }}Release
uses: marvinpinto/action-automatic-releases@latest
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
prerelease: ${{ inputs.isPreRelease }}
draft: true
title: "${{ inputs.isPreRelease && 'Pre-' || '' }}Release v${{ inputs.version }}"
files: ${{ needs.setup.outputs.packageName }}
67 changes: 56 additions & 11 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
@@ -1,33 +1,78 @@
name: Release
on:
push:
tags:
- "v*"

name: release
- "!v*-pre"

permissions:
# Required to publish a release
contents: write
pull-requests: "read"
pull-requests: read

jobs:
package:
name: Package
runs-on: ubuntu-22.04
outputs:
version: ${{ steps.version.outputs.version }}
steps:
- uses: actions/checkout@v5

- uses: actions/setup-node@v6
with:
node-version: "22"

- run: yarn
- name: Extract version from tag
id: version
run: |
# Extract version from tag (remove 'v' prefix)
VERSION=${GITHUB_REF#refs/tags/v}
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Release version: $VERSION"

- name: Validate version matches package.json
run: |
TAG_VERSION="${{ steps.version.outputs.version }}"
PACKAGE_VERSION=$(node -e "console.log(require('./package.json').version)")

if [ "$TAG_VERSION" != "$PACKAGE_VERSION" ]; then
echo "Error: Tag version ($TAG_VERSION) does not match package.json version ($PACKAGE_VERSION)"
echo "Please ensure the tag version matches the version in package.json"
exit 1
fi

echo "Version validation successful: $TAG_VERSION"

- run: npx @vscode/vsce package
- name: Install dependencies
run: |
yarn
npm install -g @vscode/vsce

- uses: "marvinpinto/action-automatic-releases@latest"
- name: Setup package path
id: setup
run: |
EXTENSION_NAME=$(node -e "console.log(require('./package.json').name)")
PACKAGE_NAME="${EXTENSION_NAME}-${{ steps.version.outputs.version }}.vsix"
echo "packageName=$PACKAGE_NAME" >> $GITHUB_OUTPUT

- name: Package extension
run: vsce package --out "${{ steps.setup.outputs.packageName }}"

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: false
draft: true
files: |
*.vsix
name: extension-${{ steps.version.outputs.version }}
path: ${{ steps.setup.outputs.packageName }}
if-no-files-found: error

publish:
name: Publish Extension and Create Release
needs: package
uses: ./.github/workflows/publish-extension.yaml
with:
version: ${{ needs.package.outputs.version }}
isPreRelease: false
secrets:
VSCE_PAT: ${{ secrets.VSCE_PAT }}
OVSX_PAT: ${{ secrets.OVSX_PAT }}