09 ピン留め
方針は、バージョン番号ではなく内容ハッシュで固定することである。タグ、ブランチ、 スナップショットを持たないミラーは、いずれも後から内容が変化しうる。
対象
| 対象 | 固定方法 | ロックファイル |
|---|---|---|
| ベースイメージ | レジストリダイジェスト | config/images.lock |
| apt パッケージ | Ubuntu アーカイブスナップショット + 明示バージョン | docker/apt-snapshot.lock, docker/packages.lock |
| Vivado インストーラ | SHA256 | config/vivado-versions.lock |
| 開発ツール (shellcheck, hadolint) | SHA256 | scripts/tools.lock |
| bats とヘルパ | git commit ID | scripts/tools.lock |
| GitHub Actions | commit SHA | .github/workflows/*.yml |
scripts/verify-pinning.sh # 固定状況を検査する (CI と vvd doctor が実行する)
apt スナップショットによる固定
トップレベルのパッケージバージョンのみを固定しても、推移的な依存は固定されない。
libx11-6=2:1.8.7-1build1 を指定しても、それが依存する libxcb1 のバージョンは
その時点のアーカイブの内容に依存する。
そのため https://snapshot.ubuntu.com を使用する。これはある時刻の
archive.ubuntu.com をバイト単位で再現する不変のビューであり、これを固定すると
依存の全閉包が固定される。
# docker/apt-snapshot.lock
APT_SNAPSHOT=20260801T000000Z
docker/packages.lock に記録したバージョンは、その上に重ねた二重の固定である。
スナップショットを更新した際の変更内容を、レビュー可能な差分として提示することを
目的とする。
各 .deb の完全性は apt 自身が担保する。署名された InRelease → Packages →
各パッケージの SHA256 という連鎖が検証される。packages.lock に記録した sha256 は
監査用である。
唯一の例外: CA ブートストラップ
snapshot.ubuntu.com は HTTPS 専用であり、ubuntu:24.04 はルート証明書を持たない。
最初の TLS 接続に必要な証明書束のみを、ピン留め前のアーカイブから取得する
ca-bootstrap ステージで生成する。この束は /opt/vvd/pin/ca-bootstrap.crt に配置し、
使用した同一レイヤ内で削除する。最終イメージには何も残らない。
パッケージの完全性はこの証明書に依存しない。apt の GPG 連鎖はバイト列の取得経路と
無関係に検証されるため、この証明書は転送路に関わるものにとどまる。
scripts/verify-pinning.sh はこの 1 箇所のみを例外として許可し、それ以外の
apt-get install と、ブートストラップ束の削除漏れを検出する。
更新する
scripts/lock-apt.sh # 現在のスナップショットで再解決
scripts/lock-apt.sh --snapshot 20260901T000000Z # スナップショットを進める
scripts/lock-apt.sh --check # 古くなっていれば失敗
パッケージを追加する場合は、docker/packages.list に名前を追記して再ロックする。
packages.list に存在して packages.lock に存在しないパッケージは
verify-pinning.sh が検出する。
イメージダイジェスト
scripts/lock-images.sh # config/images.list のタグをダイジェストに解決
scripts/lock-images.sh --check # ドリフト検査
docker/Dockerfile の ARG BASE_IMAGE の既定値と config/images.lock の base
エントリが一致するかも検査する。docker build を直接実行した場合と vvd build を
実行した場合とで、異なるベースイメージが使用されることを防ぐためである。
Vivado インストーラ
AMD はインストーラをログイン必須で配布しており、本リポジトリはこれを一切 ダウンロードしない。利用者が自身で取得し、SHA256 を記録する。
sha256sum FPGAs_AdaptiveSoCs_Unified_SDI_2025.2_1030_1755.tar
# config/vivado-versions.lock
2025.2|FPGAs_AdaptiveSoCs_Unified_SDI_2025.2_1030_1755.tar|<sha256>
照合は 2 か所で行う。ビルド開始前にホスト側で vvd build が、イメージ内で
docker/install-vivado.sh が、それぞれ照合する。vvd を経由せず docker build を
直接実行した場合でも、未検証のインストーラは使用できない。
開発ツール
scripts/fetch-tools.sh が scripts/tools.lock に従って .tools/ へ取得する。
ダウンロードしたファイルは sha256 で、git チェックアウトは commit ID で検証する。
ネットワークから取得した内容をシェルへ直接パイプするコードは、リポジトリ内に存在
しない。これも verify-pinning.sh が検査する。
git の commit ID は内容アドレスであるため、リリース tarball より強固な固定となる。 tarball のバイト列はフォージ側で再生成されうる。
GitHub Actions
uses: はすべて 40 桁の commit SHA。バージョンは行末コメントで残す。
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
verify-pinning.sh が .github/workflows/ 全体を走査し、SHA でない参照が存在する
場合は失敗させる。
固定していないもの
- Vivado 本体の内容 — AMD の配布物であり、固定できるのはインストーラの SHA256 までである
- ホスト側の Vivado インストール (
mountモード) — 定義上ホストに属する。 完全に固定する場合はimageモードを使用する - ランナーのベース OS — GitHub Actions の
ubuntu-24.04イメージ。コンテナの 内容には影響しない - CA ブートストラップ束 — 前述のとおり、最終イメージに残らない転送路の構成要素 である
検査を回す
scripts/verify-pinning.sh # 固定状況を検査する
make lock-check # ロックファイルが最新かを検査する
vvd doctor # 上記を含む環境全体を検査する