この記事は Classi developers Advent Calendar 2021 5 日目の記事です。 adventar.org
昨日は Sab さん の iOS15からのキーボード回避[UIKit] でした。
Classi でサーバサイドエンジニアとして働きながら週末は野菜を育てているらいむです。我が家の畑は夏野菜が終わり、最近は秋・冬野菜を育てています。白菜が無事結球したのでホッとしています。
今回は野菜ではなくて、業務で使っている ecspresso をより安全に使うために行ったことを書きます。本記事は ecspresso を例に書きますが、ecspresso に限った話ではないので、CircleCI でバイナリの checksum を比較したり、バイナリをキャッシュしたいときに同じやり方が使えると思います。
はじめに
- 元々は CircleCI 上で都度 ecspresso をインストールして、それをそのまま使っていた
- 弊社では 3rd party orb を許可しないポリシーなので、ecspresso の CircleCI orb が使えず自前でインストールしている
- id:aereal さんの発言を見てたしかにとなった 🦀
- 提供元の checksum と CircleCI で落としてきたファイルの checksum を比較することで、経路上で不正にファイルが書き換えられていないかを確認できる
と思ったので実際にやってみました。
バイナリの checksum を比較する
CircleCI で ecspresso をインストールする command に以下を加えました。
FILENAME="ecspresso_<< parameters.ecspresso_version >>_linux_amd64.tar.gz" curl -fsSLo /tmp/checksums.txt "https://github.com/kayac/ecspresso/releases/download/v<< parameters.ecspresso_version >>/checksums.txt" cd /tmp && cat /tmp/checksums.txt | grep ${FILENAME} | sha256sum -c
- ecspresso では tar で圧縮された状態の checksum がバージョン毎に用意されている
- Releases · kayac/ecspresso
- v1.6.0 からなので、それ以前を使っている場合は別の方法でやらないといけない
- 公式の checksum と CircleCI 内で落としてきた圧縮された状態のファイルの checksum で比較する
- 公式の checksum は GoReleaser で用意されている ʕ◔ϖ◔ʔ
- 指定していない場合、デフォルトでは
sha256
が使われている
バイナリをキャッシュする
CircleCI の restore_cache
と save_cache
を使いました。key は今回 ecspresso の version にしましたが、ここは実行ファイルの checksum でも良いと思います。
- restore_cache: name: Restore ecspresso cache key: ecspresso-v<< parameters.ecspresso_version >> - save_cache: name: Save ecspresso cache key: ecspresso-v<< parameters.ecspresso_version >> paths: - .bin
バイナリのキャッシュを扱う
ここが一番ハマりどころが多かったです。
before
steps: - checkout - run: name: Install ecspresso command: | FILENAME=ecspresso_<< parameters.ecspresso_version >>_linux_amd64.tar.gz cd /tmp curl -sLO https://github.com/kayac/ecspresso/releases/download/<< parameters.ecspresso_version >>/${FILENAME} tar xzvf ${FILENAME} sudo install ${FILENAME} /usr/local/bin/ecspresso
after
steps: - checkout - run: name: Install ecspresso command: | if [ ! -x .bin/ecspresso ]; then FILENAME=ecspresso_<< parameters.ecspresso_version >>_linux_amd64.tar.gz mkdir .bin curl -fsSLo /tmp/${FILENAME} https://github.com/kayac/ecspresso/releases/download/v<< parameters.ecspresso_version >>/${FILENAME} tar xzvf /tmp/${FILENAME} -C .bin curl -fsSLo /tmp/checksums.txt https://github.com/kayac/ecspresso/releases/download/v<< parameters.ecspresso_version >>/checksums.txt cd /tmp && cat /tmp/checksums.txt | grep ${FILENAME} | sha256sum -c fi
- 実行ファイルがあるかの判定が必要
- キャッシュがないときだけ、インストールをしたいので条件分岐を追加した
-x
じゃなくて-f
とか-e
でも良よさそう
- 元々
sudo install
で/usr/local/bin
以下にコピーしていたのをやめたrestore_cache
でpermission denied
でコケる- 代わりに
~/projects/.bin
以下にした
- 注意点として
checkout
してから ecspresso をインストール する必要がある- まっさらな状態じゃないと
checkout
できないことを忘れていてハマった - これは今回に限った話じゃなくて、キャッシュを使う場合に気をつける
- まっさらな状態じゃないと
便利なツールはたくさんありますが、安全に使っていけるようにこれからも気をつけていきたいと思います。
明日は @youichiro さんです!