Заметки · 19.01.2024

Всегда свежий release

Сегодня речь пойдёт о вечно свежих релизах с того самого котоосьминога на примере отличного браузера Chromium-GOST (здесь сайт, а здесь гит). Благо, у котоосьминога есть свой api и очень полезная конструкция releases/latest.

Вооружившись боевой магией PowerShell, начинаем кастовать конвейер командлетов. Для начала получим всё, чем богата api-ветвь последнего релиза репозитория. Применяем Invoke-RestMethod:

$release = "https://api.github.com/repos/deemru/chromium-gost/releases/latest"
Invoke-RestMethod -uri $release

Просмотрев выдачу, обращаем внимание, что всё нужное хранится в массиве assets. Производим соответствующую выборку:

$release = "https://api.github.com/repos/deemru/chromium-gost/releases/latest"
Invoke-RestMethod -uri $release | Select -ExpandProperty assets

Вновь получаем ответ, в котором нужно произвести отбор до ключа browser_download_url. Добавляем в конвейер ещё один Select:

$release = "https://api.github.com/repos/deemru/chromium-gost/releases/latest"
Invoke-RestMethod -uri $release | Select -ExpandProperty assets | Select -ExpandProperty browser_download_url

В этот раз ответом будет перечень ссылок для прямого скачивания релиза программы. Разумеется, нам нужно выделить строку по шаблону в имени объекта, чтобы получить ссылку на конкретный файл. В моём случае этим шаблоном является постфикс -windows-amd64-installer.exe. В итоге можно запихнуть ссылку в переменную:

$release = "https://api.github.com/repos/deemru/chromium-gost/releases/latest"
$link = Invoke-RestMethod -uri $release `
        | Select -ExpandProperty assets `
        | Select -ExpandProperty browser_download_url `
        | Select-String -Pattern "-windows-amd64-installer.exe"

Теперь скачаем файл c помощью Start-BitsTransfer, но сначала немного приукрасим конструкцию и обозначим куда именно скачивать и как назвать итоговый файл:

$appname = "chromium.exe"
$path = [Environment]::GetFolderPath("Desktop") + "\$appname"
$release = "https://api.github.com/repos/deemru/chromium-gost/releases/latest"
$link = Invoke-RestMethod -uri $release `
        | Select -ExpandProperty assets `
        | Select -ExpandProperty browser_download_url `
        | Select-String -Pattern "-windows-amd64-installer.exe"
Start-BitsTransfer -Source $link -Destination $path

В скрипте местом назначения (переменная $path) я использовал рабочий стол текущего пользователя, а имя файла обозначил лаконичным chromium.exe (переменная $appname). Таким образом, при каждом скачивании файл chromium.exe будет заменятся свежей версией установщика Chromium-GOST.

Если консоль вернёт ошибку «Запрос был прерван: не удалось создать защищенный канал SSL/TLS.» необходимо явно указать метод шифрования в шапке скрипта:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Кстати, ещё один любопытный момент: чтобы установить браузер Chromium-GOST от имени администратора и для всех пользователей надо использовать параметры запуска:

chromium.exe --system-level --install

На этапе подготовки машины проще всего производить установку браузера с помощью батника. Если, к примеру, установочный файл и батник будут расположены на целевом хосте в одном расположении — можно провести установку и удалить с машины скрипт вместе с установочником:

cd %~dp0
chromium.exe --system-level --install
del chromium.exe
del %0

А про самоудаляющийся батник у меня даже был отдельный пост.