内网安全合规?不想把插件发到 JetBrains Marketplace?想把团队内部的 IntelliJ 系列插件(IDEA、PyCharm、WebStorm、GoLand…)放到自建插件仓库里统一分发?不想每次都手动维护 updatePlugins.xml?这就是 jetbrains-plugin-publisher 的使命:拖拽上传 / 一条 Gradle 命令,自动生成与更新 updatePlugins.xml,立即可被 IDE 识别安装。

项目地址:https://github.com/xooooooooox/jetbrains-plugin-publisher


这是什么?

Jetbrains Plugin Publisher 是一个开箱即用的小工具,用来把 IntelliJ 平台插件(IntelliJ IDEA、PyCharm、WebStorm、Rider 等)发布到自建插件仓库(如 Artifactory、MinIO/S3 或任何支持 HTTP PUT/S3 API 的存储)。

它提供两种使用方式:

  • Web UI(Bridge 模式): 拖拽.jar/.zip插件包,所见即所得地上传、生成 updatePlugins.xml;
  • 命令行/无头模式:容器内直接执行gradle uploadPlugin -Pfile=... 一条命令。 

效果预览(Web UI)

在这里插入图片描述
• 左侧:选择 Bridge 模式 → 拖拽上传插件包;
• 右侧:配置发布目标(Base URL、下载前缀、认证等);
• 下方:进度、日志与结果。


为什么要用自建插件仓库?

JetBrains 官方文档明确支持自定义插件仓库:只要在一个可访问的 HTTPS 地址上提供 updatePlugins.xml,IDE 就能像连官方市场一样安装/更新你的插件。  

这带来几个典型场景价值:
• 内网/保密环境:插件只给公司内部用;
• 更快发布:无需等待 Marketplace 审核;
• 多渠道:按“稳定版/灰度版/内部测试版”等划分渠道分发(JetBrains 也支持自定义发布渠道)。 

适用场景

  • 企业/组织内部发布专有插件(合规与权限可控)
  • 开发/测试/预发布多渠道分发(多 Bucket/多路径)
  • 离线/半离线网络(镜像在内网,IDE 只需能访问仓库)
  • 与现有制品库打通(Artifactory、S3、MinIO 等)

一图看懂工作流

[Plugin JAR/ZIP]
        |
        v   (拖拽 / 一条 Gradle 命令)
+-----------------------------+
| jetbrains-plugin-publisher |
|  - Web UI / Gradle Task    |
+-----------------------------+
        |  上传 (PUT/S3)
        v
 [Artifactory / MinIO / S3]
        |
        +--> [updatePlugins.xml] <--- 自动生成/更新
                          |
                          v
               JetBrains IDE (Settings -> Plugins -> Manage Repositories)

IDE 配置自定义仓库后,可像连接 Marketplace 一样安装/搜索/更新插件。


3 分钟快速上手

只要 Docker 即可起飞。

方式 A:docker run 一键启动

docker run --rm --name jetbrains-plugin-publisher \
  -p 9876:9876 \
  -e ARTIFACTORY_TOKEN=*********** \
  -e PUBLISHER_BASE_URL='https://artifactory.example.com/artifactory/jetbrains-plugin-local' \
  -e PUBLISHER_DOWNLOAD_PREFIX='https://artifactory.example.com/artifactory/jetbrains-plugin-local' \
  -e PUBLISHER_REPO='artifactory' \
  -e PUBLISHER_XML_NAME='updatePlugins.xml' \
  -v "$PWD:/work" \
  xooooooooox/jetbrains-plugin-publisher

打开浏览器访问 http://127.0.0.1:9876/,拖拽 .jar/.zip 即可上传,updatePlugins.xml 也会自动生成/更新。 

方式 B:docker compose 启动

services:
  jpp:
    container_name: jetbrains-plugin-publisher
    image: xooooooooox/jetbrains-plugin-publisher
    ports: ["9876:9876"]
    environment:
      ARTIFACTORY_TOKEN: ${ARTIFACTORY_TOKEN:-}
      PUBLISHER_BASE_URL: ${PUBLISHER_BASE_URL:-https://artifactory-oss.example.com/artifactory/jetbrains-plugin-local}
      PUBLISHER_DOWNLOAD_PREFIX: ${PUBLISHER_DOWNLOAD_PREFIX:-https://artifactory-oss.example.com/artifactory/jetbrains-plugin-local}
      PUBLISHER_REPO: ${PUBLISHER_REPO:-artifactory}
      PUBLISHER_XML_NAME: ${PUBLISHER_XML_NAME:-updatePlugins.xml}
    volumes:
      - $PWD:/work
    restart: unless-stopped

方式 C:命令行(容器内 Gradle 一条龙)

# 进入已运行容器
docker exec -it jetbrains-plugin-publisher bash

# 上传单个插件(最简)
gradle -q uploadPlugin -Pfile=/work/your-plugin-1.2.3.jar

# 或者带上完整参数(覆盖 since/until、feed 文件名等)
gradle -q uploadPlugin \
  -Pfile=/work/your-plugin-1.2.3.jar \
  -PpluginId=com.yourco.yourplugin \
  -PpluginVersion=1.2.3 \
  -PsinceBuild=241 \
  -PuntilBuild=251.* \
  -PpluginName=com.yourco.yourplugin \
  -PbaseUrl="$PUBLISHER_BASE_URL" \
  -PdownloadUrlPrefix="$PUBLISHER_DOWNLOAD_PREFIX" \
  -PxmlName="${PUBLISHER_XML_NAME:-updatePlugins.xml}"

认证优先级:-Ptoken/-Pbasic(命令行)→ 环境变量 → gradle.properties~/.config/jpp/jpp.properties。 


配置一览(常用项对照)

用途 Gradle 属性 环境变量 说明
仓库类型 repo / publisher.repo PUBLISHER_REPO artifactory(REST PUT)、s3minio
基础 URL(上传) baseUrl / publisher.baseUrl PUBLISHER_BASE_URL 二进制文件和 updatePlugins.xml 的目标根路径
下载 URL 前缀 downloadUrlPrefix / publisher.downloadUrlPrefix PUBLISHER_DOWNLOAD_PREFIX IDE 在订阅源中看到的内容
订阅文件 xmlName / publisher.xmlName PUBLISHER_XML_NAME 默认为 updatePlugins.xml
令牌(Bearer) token / publisher.token ARTIFACTORY_TOKENPUBLISHER_TOKEN 首选
基本认证 basic / publisher.basic PUBLISHER_BASIC 格式 user:pass(少见)
S3/MinIO 密钥 auth / publisher.minioAuth MINIO_AUTHAWS_ACCESS_KEY_ID 用于 S3/MinIO 模式

让 IDE 识别你的私有仓库

  1. IDE 中打开 Settings → Plugins;
  2. 点击齿轮图标 → Manage Plugin Repositories;
  3. 添加你的 feed 地址(直接指向 updatePlugins.xml);
  4. 之后就能在 Marketplace 页签里看到你仓库中的插件了。

在这里插入图片描述
在这里插入图片描述

与其他方案的对比

  • 手工维护 updatePlugins.xml

    容易出错、费时费力。该项目自动 upsert,发布即更新清单。

  • 直接使用第三方上传脚本/库

    比如 plugin_uploader。本项目将其作为引擎集成,提供Web UI + 容器化一体化体验,开箱即用。

  • 只发到 JetBrains Marketplace

    适合公开分发。若需要私有/内网/灰度渠道合规管控,自建仓库更合适。官方文档明确支持自定义仓库。


常见问答(FAQ)

Q1:必须手写 updatePlugins.xml 吗?
不需要。上传后项目会自动创建或更新该文件。

Q2:是否支持解析 plugin.xml 自动填参数?
支持。UI 会解析 plugin.xml 预填 ID/版本/IDE Build 范围。

Q3:只能用 Artifactory 吗?
不,只要能通过 HTTP PUT 或 S3 API 上传即可(如 MinIO/S3)。

Q4:IDE 怎么配置使用?
Manage Plugin Repositories 里添加 updatePlugins.xml URL 即可。


参与贡献 & 交流

欢迎 Star / PR / Issue

https://github.com/xooooooooox/jetbrains-plugin-publisher

如果这个项目为你的团队节省了时间,也欢迎在 CSDN/博客/公众号分享你的落地实践 : )

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐