らいむぎばたけ

つかまえなくてだいじょうぶ

ecspresso をより安全に使うために

この記事は 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 が使えず自前でインストールしている
  • f:id:lime1024:20211202103737p:plain
  • 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 で比較する

バイナリをキャッシュする

CircleCI の restore_cachesave_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_cachepermission denied でコケる
    • 代わりに ~/projects/.bin 以下にした
  • 注意点として checkout してから ecspresso をインストール する必要がある
    • まっさらな状態じゃないと checkout できないことを忘れていてハマった
    • これは今回に限った話じゃなくて、キャッシュを使う場合に気をつける

便利なツールはたくさんありますが、安全に使っていけるようにこれからも気をつけていきたいと思います。

明日は @youichiro さんです!