Автоматическое обновление расширения Chrome во время разработки с помощью CI / CD и update.xml

У меня в разработке находится расширение Chrome, локально являющееся приложением React.

Я настроил конвейер CI / CD, чтобы приложение React было построено с yarn buildдля создания каталога, содержащего файлы приложения и. Затем конвейер использует этот пакет npm для создания файла и загрузки его в общедоступное хранилище вместе с файлом, который был обновлен с новым номером версии и URL-адресом для нового .crx файл.

Я создал закрытый ключ ( key.pem) локально и хранится в хранилище ключей, поэтому задание «упаковки» в конвейере CI каждый раз использует один и тот же закрытый ключ. Открытый ключ добавлен в manifest.json так что идентификатор приложения каждый раз остается неизменным.

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/ > режим разработчика> загрузить распакованный> выбрать локальный dist каталог.
  2. Распакованное расширение появится в списке расширений с идентификатором приложения: blahblahooaejaldnohkhmaedknkfogn
  3. Выберите расширение и нажмите «Обновить».

Ожидаемый результат:

Chrome запрашивает удаленный файл, видит версию, более позднюю, чем изначально установленная, загружает и устанавливает новую crx файл из указанного места.

Фактический результат:

Расширение не обновляется.

Примечание: я загрузил crtсгенерированный CI / CD из места хранения и загруженный сюда. Открытый ключ, показанный этим онлайн-инструментом, соответствует значению key в manifest.json, и вычисленный идентификатор приложения совпадает с идентификатором в 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>

Этот «идентификатор приложения» не мой (или это идентификатор приложения Chrome?), Но статус «error-unknownApplication», возможно, дает намек на то, что происходит.

2 ответа

Решение

Никакие настройки защиты в Chrome не позволяют обновлять расширения. Этот параметр также позволяет перетаскивать .crx в расширения Chrome.

Установка расширения chrome кнопкой "Загрузить распакованный" на chrome://extensions «привязывает» установку к файловой системе и не допускает обновлений.

Расширение необходимо установить через файл, чтобы обновление работало. Возможность сделать это была удалена в Chrome по соображениям безопасности.

Однако вы можете использовать версию разработчика Chrome, Chromium, чтобы установить .crtфайл путем перетаскивания. Установка таким образом позволяет обновлять расширение, используя метод, указанный в исходном вопросе (если все настроено правильно).

В моем случае этот обходной путь был приемлемым.