Перейти к содержимому

Установка

Если пользуешься только GitHub Action, ставить ничего не надо: Action сам скачивает и кэширует бинарь.

Окно терминала
brew install jtprogru/tap/notiflow

Покрывает macOS на Apple silicon и Intel, Linux на x86_64 и arm64. Автодополнения шелла ставятся вместе с формулой.

Окно терминала
cargo install notiflow

Собирает из исходников, поэтому работает на любой платформе, которую поддерживает Rust — включая те, которых нет в релизной матрице. Нужен Rust 1.85 или новее.

Окно терминала
curl -fsSL https://raw.githubusercontent.com/jtprogru/notiflow/main/scripts/install.sh | sh

Скрипт определяет платформу, резолвит последний релиз, сверяет архив с checksums.txt из того же релиза и ставит в /usr/local/bin. На системе без glibc сам выбирает статическую сборку musl.

Окно терминала
curl -fsSL .../install.sh | sh -s -- --version v2.0.1 --bin-dir ~/.local/bin

Скачать скрипт из интернета прямо в шелл — ровно столько доверия, сколько это и звучит. Прочитай его сначала или возьми другой канал.

Каждый релиз публикует статический бинарь на платформу плюс checksums.txt и cosign-бандл на каждый архив.

Окно терминала
VERSION=v2.0.1
TARGET=aarch64-apple-darwin # таблица ниже
BASE="https://github.com/jtprogru/notiflow/releases/download/${VERSION}"
curl -fsSLO "${BASE}/notiflow-${TARGET}.tar.gz"
curl -fsSLO "${BASE}/checksums.txt"
grep " notiflow-${TARGET}.tar.gz$" checksums.txt | shasum -a 256 -c -
tar -xzf "notiflow-${TARGET}.tar.gz"
sudo install -m 0755 notiflow /usr/local/bin/notiflow
Платформа Target
Linux x86_64 (glibc) x86_64-unknown-linux-gnu
Linux arm64 (glibc) aarch64-unknown-linux-gnu
Linux x86_64 (статика) x86_64-unknown-linux-musl
Linux arm64 (статика) aarch64-unknown-linux-musl
macOS Apple silicon aarch64-apple-darwin
macOS Intel x86_64-apple-darwin
Windows x86_64 x86_64-pc-windows-msvc

Сборки musl полностью статические — то, что нужно внутри контейнера на alpine или scratch.

Контрольная сумма лежит там же, где архив, поэтому сама по себе она доказывает только целостность закачки. Чтобы доказать, что архив собран релизным workflow:

Окно терминала
cosign verify-blob "notiflow-${TARGET}.tar.gz" \
--bundle "notiflow-${TARGET}.tar.gz.bundle" \
--certificate-identity-regexp '^https://github.com/jtprogru/notiflow/\.github/workflows/release\.yml@refs/tags/' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com'

На релизы также выпускаются build provenance attestations:

Окно терминала
gh attestation verify "notiflow-${TARGET}.tar.gz" --repo jtprogru/notiflow

Релизы начиная с v2.0.0 дополнительно несут отсоединённые GPG-подписи (файлы .asc рядом с артефактами), сделанные ключом мейнтейнера:

pub ed25519 2025-04-14 [SC] [годен до: 2035-04-12]
6FE5 73A7 0EEF 276F CAB6 9C64 13B9 59D0 0CED AC9D
uid Mikhail Savin (jtprogru) <jtprogru@gmail.com>

Импортируйте ключ и проверьте подпись:

Окно терминала
curl -fsSL https://jtprogru.github.io/notiflow/notiflow-signing-key.asc | gpg --import
curl -fsSLO "${BASE}/notiflow-${TARGET}.tar.gz.asc"
gpg --verify "notiflow-${TARGET}.tar.gz.asc" "notiflow-${TARGET}.tar.gz"

Тот же ключ лежит на keys.openpgp.org — эту копию стоит предпочесть, её раздаёт не проект:

Окно терминала
gpg --keyserver hkps://keys.openpgp.org --recv-keys 6FE573A70EEF276FCAB69C6413B959D00CEDAC9D

В любом случае сверьте отпечаток с приведённым выше. Ключ, скачанный тем же каналом, что и подписанный им файл, — это удобство, а не доказательство: доказательством служит отпечаток, сверенный с копией из другого источника.

Пре-релизы 2.0.0-alpha.1 и 2.0.0-alpha.2 старше ключа, .asc у них нет. cosign и attestation есть у всех релизов, включая эти два.

Окно терминала
notiflow completions bash > /etc/bash_completion.d/notiflow
notiflow completions zsh > "${fpath[1]}/_notiflow"
notiflow completions fish > ~/.config/fish/completions/notiflow.fish

powershell и elvish тоже поддерживаются.

Action резолвит версию, скачивает нужный архив, проверяет sha256 и кладёт в tool cache раннера. Чтобы дополнительно требовать проверку подписи cosign, поставь cosign раньше и включи вход:

- uses: sigstore/cosign-installer@v3
- uses: jtprogru/notiflow@v2
with:
verify_signature: true
# ...

По приоритету:

  1. вход version, если задан;
  2. файл VERSION в дереве Action — штампуется при релизе, поэтому @v2, @v2.1.0 и @<sha> дают детерминированный результат;
  3. GITHUB_ACTION_REF, если это semver-тег;
  4. последний релиз через сеть, с предупреждением.

Только последний вариант может дать разный ответ двум запускам одного и того же запиненного workflow — поэтому он и предупреждает.