機能
ccamのアップデート
このページは英語から機械翻訳されています。修正を歓迎します。 GitHubでこのページを編集
このページの内容
ccam updateは、GitHubからccamのリリースをダウンロードし、リリースのchecksums.txtで検証してから、実行中のバイナリを1回のrenameで置き換えます。インストールスクリプトやアーカイブからccamをインストールした場合に使います。ccamが自分から更新を確認することはありません。GitHubに接続するのはこのコマンドだけなので、ほかのコマンドはすべてオフラインでも同じように動作します。
使い方
ccam update # install the latest release
ccam update --check # only say whether a newer release exists
ccam update --version v0.3.0 # install that release, also an older one
ccam --dry-run update # show what would be downloaded and replaced$ ccam update --check
ccam 0.5.0 is available (you have 0.4.0). Run `ccam update`.
$ ccam --dry-run update
Would update ccam 0.4.0 → 0.5.0:
download https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/ccam_linux_amd64.tar.gz
verify with https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/checksums.txt
replace /home/you/.local/bin/ccam
$ ccam update
→ downloading https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/ccam_linux_amd64.tar.gz
✓ Updated ccam 0.4.0 → 0.5.0 (/home/you/.local/bin/ccam)新しいリリースがない場合、ccamはccam 0.4.0 is up to date.と表示し、何も変更しません。--versionに実行中のバージョンを指定した場合は、ccam 0.4.0 is already installed.と表示します。
オプション
| オプション | 効果 | デフォルト |
|---|---|---|
--check |
新しいリリースがあるかどうかを報告するだけです | オフ |
--version <tag> |
v0.3.0のようなリリースタグをインストールします。現在のものより新しくても古くてもかまいません |
最新 |
--dry-run |
対応しています。最新のタグを調べ(--versionで指定した場合を除く)、バイナリに対して同じ確認を行い、ダウンロードせずに、ダウンロード、チェックサム、置き換えのパスを表示します |
オフ |
--checkと--versionは同時に使えません。タグはvMAJOR.MINOR.PATCHの形式で、プレリリースやビルドの接尾辞を付けてもかまいません。先頭のvは省略できます。それ以外は失敗します。たとえば--version takes a release tag such as v0.3.0, not "1.2"のようになります。
環境変数CCAM_RELEASES_URLは、ミラーやテストのためにhttps://github.com/jhyunwoo/ccam/releasesを置き換えます。構成は同じでなければなりません。<url>/latestが<url>/tag/<tag>にリダイレクトし、アセットは<url>/download/<tag>/<asset>にある必要があります。
しくみ
コードはinternal/updateにあり、これをインポートするのはccam updateだけです。起動経路から呼び出されることはありません。
cli.updateCmdがos.Executableで実行中のバイナリを見つけ、filepath.EvalSymlinksでシンボリックリンクを解決します。置き換えられるのは、この実際のパスです。--versionがない場合、Updater.Latestはリダイレクトをたどらずに<releases>/latestにリクエストを送り、Locationヘッダー(…/tag/v0.5.0)からタグを読み取ります。GitHub APIではなくリリースのページを使うので、APIの1時間あたり60リクエストの制限は適用されません。この問い合わせの制限時間は10秒です。parseVersionがタグを厳密なパターンで確認します。タグはダウンロードURLや表示されるシェルコマンドに入るため、/、%、空白、シェルの特殊文字を含むものは通しません。compareVersionsが実行中のバージョンと比較します。プレリリースは、そのリリースより前として扱われます。managed()とwritable()が、そもそもccamがバイナリを置き換えてよいかを判断します(後述)。Updater.Fetchがccam_<os>_<arch>.tar.gzとchecksums.txtを同時にダウンロードします。制限時間は両方合わせて2分です。各ダウンロードの上限は256 MBです。- ほかの処理を行う前に、アーカイブのSHA-256が
checksums.txtの該当行と一致する必要があります。行がない場合やチェックサムが異なる場合は、nothing was changedで更新を停止します。 extract()がtarを読み、ccamという名前の最初の通常ファイルを取り出します。ディレクトリ、リンク、その他の項目は無視し、バイナリにも256 MBの上限があります。Updater.Installがfsutil.AtomicWriteで新しいバイナリを書き込みます。バイナリの隣に、古いファイルと同じ権限ビットで一時ファイル.ccam.tmp*を作り、ディスクにフラッシュしてから、古いファイルの上にrenameします。
タグの問い合わせからrenameまでの全体の流れは次のとおりです。
アーカイブとchecksums.txtは並行してダウンロードされ、チェックサムが一致するまで何も書き込まれません。renameはアトミックなので、クラッシュやディスクの容量不足が起きても、残るのは古いバイナリか新しいバイナリのどちらかで、中途半端なものが残ることはありません。~/.local/bin/ccworkのようなショートカットコマンドはccamのバイナリへのシンボリックリンクなので、何も変更しなくても新しいバージョンが実行されます。
パッケージでインストールした場合
.debからインストールしたccamはaptの管理下にあり、aptを通さずに置き換えるとパッケージのデータベースが不正確になります。ダウンロードする前に、ccamはバイナリの所有者を確認します。
/usr/bin、/bin、/usr/sbin、/sbinにあるバイナリは、パッケージで管理されているとみなします。- それ以外の場所でも、
dpkgがインストールされていてdpkg -S <path>が成功すれば、パッケージで管理されているとみなします。 - それ以外の場合、ccamはバイナリの隣に一時ファイル
.ccam-update-*を作成して削除し、そこに書き込めることを確認します。
パッケージで管理されているバイナリの場合、ccamは停止し、aptでの手順を表示します。
$ ccam update
ccam: /usr/bin/ccam was installed by a package, so `ccam update` leaves it alone.
To update the .deb, download ccam_0.5.0_linux_amd64.deb from https://github.com/jhyunwoo/ccam/releases/tag/v0.5.0 and run:
sudo apt install ./ccam_0.5.0_linux_amd64.deb
Or install a copy in ~/.local/bin with the install script:
curl -fsSL https://raw.githubusercontent.com/jhyunwoo/ccam/main/install.sh | shLinux以外のシステムでは、インストールスクリプトの行だけが表示されます。フォルダーに書き込めない場合、ccamはインストールスクリプトをもう一度実行するよう提案します。インストールスクリプトはccamを~/.local/binにインストールします。
安全性と特殊なケース
- 開発版のビルドはバージョンを
devと報告し、比較するリリースがないので、ccam updateとccam update --checkは拒否します。ccam update --version vX.Y.Zなら、その上にリリースをインストールできます。 - ダウンロードの失敗、使っているプラットフォーム用のアセットがない場合、チェックサムの不一致では、インストール済みのバイナリはそのまま残ります。
- 存在しないリリースは
there is no release <tag>で失敗します。GitHubがHTTP 403や429で拒否した場合、ccamはレート制限の可能性が高いことを伝え、しばらくしてから再試行するよう求めます。 --checkは読み取るだけです。バイナリがパッケージで管理されているか、書き込めるかは確認しません。- 以前のバージョンに戻すには、
--versionに古いタグを指定します。