使用 CI/CD 和 update.xml 在开发期间自动更新 Chrome 扩展

Auto update Chrome extension during development with CI/CD and update.xml

我在本地有一个 Chrome 扩展,它是一个 React 应用程序。

我已经设置了一个 CI/CD 管道,以便使用 yarn build 构建 React 应用程序以生成包含应用程序文件和 manifest.jsondist 目录。管道然后使用 this npm package 创建 .crx 文件并将其与 update.xml 文件一起上传到 public 存储位置,该文​​件已更新为新版本号和 URL 到新的 .crx 文件。

我在本地创建了私钥 (key.pem) 并存储在密钥库中,因此 CI 管道中的“打包”作业每次都使用相同的私钥。 public 键已添加到 manifest.json 中,因此应用 ID 每次都保持相同。

Update2.xml

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='blahblahooaejaldnohkhmaedknkfogn'>
    <updatecheck codebase='https://mypubliccrxstorage.blob.core.windows.net/crx/myapp-1.0.20210702.22.crx' version='1.0.20210702.22' />
  </app>
</gupdate>

manifest.json

{
...
    "manifest_version": 2,
    "version": "1.0.20210702.22",
    "key": "<my-public-key",
...
    "update_url": "https://mypubliccrxstorage.blob.core.windows.net/crx/update2.xml"
}

安装和更新步骤:

  1. 转到 chrome://extensions/ > 开发人员模式 > 加载解压 > select 本地 dist 目录。
  2. 解压后的扩展出现在扩展列表中,app id:blahblahooaejaldnohkhmaedknkfogn
  3. Select 扩展并点击“更新”

预期结果:

Chrome 查询远程 update.xml 文件,发现版本比最初安装的版本晚,从指定位置下载并安装新的 crx 文件。

实际结果:

扩展没有更新。

注意:我从存储位置下载了CI/CD生成的crt,上传了here。该在线工具显示的 public 键与 manifest.json 中 key 的值匹配,计算出的应用程序 ID 与 update.xml.

中的值匹配

为了更深入地挖掘,我打开了 Fiddler4 并嗅探了 Chrome 发出的调用。虽然我不是全部都理解,但其中的部分回复是:

<?xml version="1.0" encoding="UTF-8"?><gupdate xmlns="http://www.google.com/update2/response" protocol="2.0" server="prod"><daystart elapsed_days="5296" elapsed_seconds="28389"/><app appid="mgndgikekgjfcpckkfioiadnlibdjbkf" status="error-unknownApplication"/><app appid="apbllhlpimnkljppmmdbiipfbjjimjgj" cohort="1::" cohortname="" status="ok"><updatecheck _esbAllowlist="false" status="noupdate"/></app></gupdate>

那个“app id”不是我的(或者是 Chrome app id?),但是“error-unknownApplication”的状态可能给出了一些关于正在发生的事情的提示。

通过 chrome://extensions 处的“加载解压”按钮安装 chrome 扩展,将安装“绑定”到文件系统并且不允许更新。

扩展需要通过 .crt 文件安装才能更新。 出于安全原因,Chrome 中删除了执行此操作的功能。

但是您可以使用 Chrome 的开发者版本,Chromium 通过拖放来安装 .crt 文件。以这种方式安装允许使用原始问题中的方法更新扩展(如果一切配置正确)。

这个变通方法在我的案例中是可以接受的。

Chrome 中的保护设置不允许扩展更新。此设置还允许将 .crx 拖放到 chromium 扩展中。