docs(readme): add JetBrains Marketplace badge #18
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release | |
| on: | |
| push: | |
| tags: | |
| - 'v*' | |
| permissions: | |
| contents: write # create GitHub Releases | |
| id-token: write # npm provenance | |
| packages: write # GitHub Packages | |
| jobs: | |
| # ── 1. Gate: all tests must pass ───────────────────────────────────────── | |
| test: | |
| name: Test (Node 20) | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Run test suite | |
| run: node test/run.js | |
| # ── 2. Publish to npmjs.com ─────────────────────────────────────────────── | |
| publish-npm: | |
| name: Publish → npmjs.com | |
| needs: test | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| registry-url: 'https://registry.npmjs.org' | |
| - name: Verify package version matches tag | |
| run: | | |
| PKG_VERSION="v$(node -p "require('./package.json').version")" | |
| TAG_VERSION="${GITHUB_REF_NAME}" | |
| if [ "$PKG_VERSION" != "$TAG_VERSION" ]; then | |
| echo "ERROR: package.json version ($PKG_VERSION) does not match tag ($TAG_VERSION)" | |
| exit 1 | |
| fi | |
| echo "✓ version check passed: $PKG_VERSION" | |
| - name: Publish to npm | |
| run: npm publish --provenance --access public | |
| env: | |
| NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
| # ── 3. Publish to GitHub Packages (scoped) ─────────────────────────────── | |
| publish-github: | |
| name: Publish → GitHub Packages | |
| needs: test | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| registry-url: 'https://npm.pkg.github.com' | |
| scope: '@manojmallick' | |
| - name: Publish to GitHub Packages | |
| run: | | |
| node -e " | |
| const fs = require('fs'); | |
| const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); | |
| pkg.name = '@manojmallick/sigmap'; | |
| pkg.publishConfig = { registry: 'https://npm.pkg.github.com' }; | |
| fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n'); | |
| " | |
| npm publish --access public | |
| env: | |
| NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| # ── 4. Publish VS Code extension ───────────────────────────────────────── | |
| publish-vscode: | |
| name: Publish → VS Code Marketplace | |
| needs: test | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Install vsce | |
| run: npm install -g @vscode/vsce | |
| - name: Sync extension version with tag | |
| run: | | |
| TAG_VERSION="${GITHUB_REF_NAME#v}" | |
| node -e " | |
| const fs = require('fs'); | |
| const v = process.env.TAG_VERSION; | |
| const pkg = JSON.parse(fs.readFileSync('vscode-extension/package.json', 'utf8')); | |
| pkg.version = v; | |
| fs.writeFileSync('vscode-extension/package.json', JSON.stringify(pkg, null, 2) + '\n'); | |
| console.log('✓ extension version set to', v); | |
| " | |
| env: | |
| TAG_VERSION: ${{ github.ref_name }} | |
| - name: Package and publish extension | |
| working-directory: vscode-extension | |
| run: | | |
| vsce publish --no-dependencies 2>&1 | tee /tmp/vsce-out.txt | |
| EXIT=${PIPESTATUS[0]} | |
| if [ $EXIT -ne 0 ] && grep -q "already exists" /tmp/vsce-out.txt; then | |
| echo "✓ Version already on Marketplace — skipping (not an error)" | |
| exit 0 | |
| fi | |
| exit $EXIT | |
| env: | |
| VSCE_PAT: ${{ secrets.VSCE_PAT }} | |
| # ── 5. Publish to Open VSX Registry ────────────────────────────────────── | |
| publish-openvsx: | |
| name: Publish → Open VSX Registry | |
| needs: test | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Install ovsx | |
| run: npm install -g ovsx | |
| - name: Sync extension version with tag | |
| run: | | |
| TAG_VERSION="${GITHUB_REF_NAME#v}" | |
| node -e " | |
| const fs = require('fs'); | |
| const v = process.env.TAG_VERSION; | |
| const pkg = JSON.parse(fs.readFileSync('vscode-extension/package.json', 'utf8')); | |
| pkg.version = v; | |
| fs.writeFileSync('vscode-extension/package.json', JSON.stringify(pkg, null, 2) + '\n'); | |
| console.log('✓ extension version set to', v); | |
| " | |
| env: | |
| TAG_VERSION: ${{ github.ref_name }} | |
| - name: Package extension (.vsix) | |
| working-directory: vscode-extension | |
| run: | | |
| npm install -g @vscode/vsce | |
| vsce package --no-dependencies | |
| - name: Publish to Open VSX | |
| working-directory: vscode-extension | |
| run: | | |
| VSIX_FILE=$(ls *.vsix | head -1) | |
| ovsx publish "$VSIX_FILE" --pat "$OVSX_PAT" 2>&1 | tee /tmp/ovsx-out.txt | |
| EXIT=${PIPESTATUS[0]} | |
| if [ $EXIT -ne 0 ] && grep -q "already exists" /tmp/ovsx-out.txt; then | |
| echo "✓ Version already on Open VSX — skipping (not an error)" | |
| exit 0 | |
| fi | |
| exit $EXIT | |
| env: | |
| OVSX_PAT: ${{ secrets.OVSX_PAT }} | |
| # ── 6. Publish JetBrains Plugin ─────────────────────────────────────────── | |
| publish-jetbrains: | |
| name: Publish → JetBrains Marketplace | |
| needs: test | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Setup Gradle | |
| uses: gradle/gradle-build-action@v3 | |
| - name: Verify plugin version matches tag | |
| run: | | |
| TAG_VERSION="${GITHUB_REF_NAME#v}" | |
| PLUGIN_VERSION=$(grep '^version = ' jetbrains-plugin/build.gradle.kts | sed 's/version = "\(.*\)"/\1/') | |
| if [ "$PLUGIN_VERSION" != "$TAG_VERSION" ]; then | |
| echo "ERROR: plugin version ($PLUGIN_VERSION) does not match tag ($TAG_VERSION)" | |
| exit 1 | |
| fi | |
| echo "✓ plugin version check passed: $PLUGIN_VERSION" | |
| - name: Build and verify plugin | |
| working-directory: jetbrains-plugin | |
| run: | | |
| ./gradlew buildPlugin verifyPlugin | |
| echo "✓ Plugin built and verified successfully" | |
| - name: Publish plugin to JetBrains Marketplace | |
| working-directory: jetbrains-plugin | |
| run: | | |
| ./gradlew publishPlugin 2>&1 | tee /tmp/jetbrains-out.txt | |
| EXIT=${PIPESTATUS[0]} | |
| if [ $EXIT -ne 0 ] && grep -q "already exists" /tmp/jetbrains-out.txt; then | |
| echo "✓ Version already on JetBrains Marketplace — skipping (not an error)" | |
| exit 0 | |
| fi | |
| exit $EXIT | |
| env: | |
| PUBLISH_TOKEN: ${{ secrets.JETBRAINS_PUBLISH_TOKEN }} | |
| # ── 7. Create GitHub Release (after all publishes succeed) ──────────────── | |
| release: | |
| name: Create GitHub Release | |
| needs: [publish-npm, publish-github, publish-vscode, publish-openvsx, publish-jetbrains] | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Build .vsix for release attachment | |
| run: | | |
| npm install -g @vscode/vsce | |
| TAG_VERSION="${GITHUB_REF_NAME#v}" | |
| node -e " | |
| const fs = require('fs'); | |
| const pkg = JSON.parse(fs.readFileSync('vscode-extension/package.json', 'utf8')); | |
| pkg.version = process.env.TAG_VERSION; | |
| fs.writeFileSync('vscode-extension/package.json', JSON.stringify(pkg, null, 2) + '\n'); | |
| " | |
| cd vscode-extension && vsce package --no-dependencies | |
| env: | |
| TAG_VERSION: ${{ github.ref_name }} | |
| - name: Create GitHub Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| generate_release_notes: true | |
| make_latest: true | |
| files: vscode-extension/*.vsix |