Я изучаю воспроизводимые сборки и хотел бы, чтобы в итоге появился скрипт, который устанавливает постоянный образ виртуальной машины, содержащий мою среду сборки. Сейчас я отложу в сторону проблемы с временными метками и другими источниками различий, поэтому под « константой » я подразумеваю воспроизводимую среду. Мне известно об усилиях Debian ReproducibleBuilds , которые предъявляют требования к версиям пакетов, чтобы гарантировать идентичную сборку. Я хочу что-то подобное, но на системном уровне.
Я начал с Alpine, которая позволяет мне очень легко создать виртуальную машину на основе определенной версии .
Как бы я сделал то же самое для Debian, который предоставляет, например, растягивающие выпуски 9.0 до 9.4?
Лучшее, что я смог придумать, было следующее: я посмотрел журнал изменений релиза, а затем использовал ближайший снимок в качестве источника пакета для debootstrap.
$ wget -q -O- http://ftp.debian.org/debian/dists/stretch/ChangeLog | grep "Debian.*released"
Sat, 10 Mar 2018 - Debian 9.4 released
Sat, 09 Dec 2017 - Debian 9.3 released
Sat, 07 Oct 2017 - Debian 9.2 released
Sat, 22 Jul 2017 - Debian 9.1 released
Sat, 17 Jun 2017 - Debian 9.0 released
$ # Looking at release 9.2
$ wget -q -O- "http://snapshot.debian.org/archive/debian/?year=2017&month=10" | html2text | sed -e 's/[:-]//g' -e 's/_/T/g' | awk '/20171007/ {print "http://snapshot.debian.org/archive/debian/"$1"Z/"}'
http://snapshot.debian.org/archive/debian/20171007T032909Z/
http://snapshot.debian.org/archive/debian/20171007T103908Z/
http://snapshot.debian.org/archive/debian/20171007T213914Z/
$ mkdir -p chroot_stretch_20171007T103908Z
$ sudo debootstrap --arch=amd64 --variant=minbase stretch chroot_stretch_20171007T103908Z http://snapshot.debian.org/archive/debian/20171007T103908Z/
I: Retrieving InRelease
I: Retrieving Release
I: Retrieving Release.gpg
I: Checking Release signature
I: Valid Release signature (key id 067E3C456BAE240ACEE88F6FEF0F382A1A7B6500)
I: Retrieving Packages
(...)
$ find -maxdepth 1 -name "chroot_stretch_2017100*" | sort | while read d; do echo $d; cat $d/etc/debian_version; sudo chroot $d apt-cache policy | grep stretch; echo ""; done
./chroot_stretch_20171006T213452Z
9.1
500 http://snapshot.debian.org/archive/debian/20171006T213452Z stretch/main amd64 Packages
release v=9.1,o=Debian,a=stable,n=stretch,l=Debian,c=main,b=amd64
./chroot_stretch_20171007T032909Z
9.1
500 http://snapshot.debian.org/archive/debian/20171007T032909Z stretch/main amd64 Packages
release v=9.1,o=Debian,a=stable,n=stretch,l=Debian,c=main,b=amd64
./chroot_stretch_20171007T103908Z
9.1
900 http://snapshot.debian.org/archive/debian/20171007T103908Z stretch/main amd64 Packages
release v=9.2,o=Debian,a=stable,n=stretch,l=Debian,c=main,b=amd64
./chroot_stretch_20171007T213914Z
9.1
500 http://snapshot.debian.org/archive/debian/20171007T213914Z stretch/main amd64 Packages
release v=9.2,o=Debian,a=stable,n=stretch,l=Debian,c=main,b=amd64
./chroot_stretch_20171008T032534Z
9.1
500 http://snapshot.debian.org/archive/debian/20171008T032534Z stretch/main amd64 Packages
release v=9.2,o=Debian,a=stable,n=stretch,l=Debian,c=main,b=amd64
Как мы видим, тег release из политики apt-cache меняется между двумя снимками одного дня. Однако /etc/debian_version не обновляется, хотя просмотр версий пакета базового файла показывает, что доступна новая версия. Обратите внимание, что нет явного снимка, сделанного при выпуске, поэтому этот подход является "наилучшим". Следовательно, существует множество способов определить, что на самом деле представляет собой выпуск 9.2 Debian.
Я не вижу смысла в точечных выпусках, если нет простого способа нацеливания на них, поэтому я должен упустить что-то очевидное.