Skip to content

Commit 9a85750

Browse files
committed
fix: make repo images reproducible
1 parent 0f43cd9 commit 9a85750

4 files changed

Lines changed: 21 additions & 3 deletions

File tree

images/hdc-0.12.img.xz

-16 Bytes
Binary file not shown.

images/manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
"size": 196769
66
},
77
"hdc-0.12.img.xz": {
8-
"sha256": "8ac159be9cec2ab3fd1625fc725f0caedfaff47a7b0583229485128d22b6a670",
9-
"size": 11692
8+
"sha256": "d2c72fd2f4d58d8740e95480e2c4154ea9b61b09de5b23eeab3cf8dbf2ecfceb",
9+
"size": 11676
1010
}
1111
},
1212
"download_base_url": "https://github.com/yaochao/linux-012/releases/download/v1.0.0",

rebuild/container/build_images.sh

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ ROOTFS_TAR="$CONTAINER_WORK_ROOT/rootfs.tar"
2020
STAGING_DIR="$CONTAINER_WORK_ROOT/rootfs"
2121
USERLAND_BUILD="$CONTAINER_WORK_ROOT/userland"
2222
ROOT_PARTITION_IMAGE="$CONTAINER_WORK_ROOT/rootfs.img"
23+
REFERENCE_TIMESTAMP="$CONTAINER_WORK_ROOT/rootfs.timestamp"
2324
export LIBGUESTFS_BACKEND=direct
25+
export LC_ALL=C
26+
export TZ=UTC
2427

2528
cleanup() {
2629
rm -rf "$CONTAINER_WORK_ROOT"
@@ -68,6 +71,7 @@ chmod 755 "$STAGING_DIR/bin/sh" "$STAGING_DIR/bin/ls"
6871

6972
truncate -s 62447616 "$DISK_IMAGE"
7073
sfdisk "$DISK_IMAGE" < "$ROOTFS_DIR/layout.sfdisk" >>"$BUILD_LOG" 2>&1
74+
printf '\0\0\0\0' | dd of="$DISK_IMAGE" bs=1 seek=440 conv=notrunc >>"$BUILD_LOG" 2>&1
7175
ROOT_PARTITION_SECTORS=$(awk -F'[=, ]+' '/size=/{for (i = 1; i <= NF; i++) if ($i == "size") {print $(i + 1); exit}}' "$ROOTFS_DIR/layout.sfdisk")
7276
[ -n "$ROOT_PARTITION_SECTORS" ]
7377
truncate -s "$((ROOT_PARTITION_SECTORS * 512))" "$ROOT_PARTITION_IMAGE"
@@ -81,7 +85,10 @@ while IFS=' ' read -r kind mode major minor relative_path; do
8185
chmod "$mode" "$STAGING_DIR/$relative_path"
8286
done < "$DEVICES_FILE"
8387

84-
tar -C "$STAGING_DIR" -cpf "$ROOTFS_TAR" . >>"$BUILD_LOG" 2>&1
88+
touch -t 199301010000.00 "$REFERENCE_TIMESTAMP"
89+
find "$STAGING_DIR" -exec touch -h -r "$REFERENCE_TIMESTAMP" {} +
90+
tar --sort=name --mtime="1993-01-01 00:00:00Z" --owner=0 --group=0 --numeric-owner \
91+
-C "$STAGING_DIR" -cpf "$ROOTFS_TAR" . >>"$BUILD_LOG" 2>&1
8592

8693
guestfish --format=raw -a "$ROOT_PARTITION_IMAGE" >>"$BUILD_LOG" 2>&1 <<EOF
8794
run

tests/test_rebuild_driver.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,17 @@ def test_build_script_stages_rootfs_inside_container_workdir_for_device_nodes(se
262262
self.assertIn('STAGING_DIR="$CONTAINER_WORK_ROOT/rootfs"', text)
263263
self.assertIn('USERLAND_BUILD="$CONTAINER_WORK_ROOT/userland"', text)
264264

265+
def test_build_script_normalizes_rootfs_metadata_for_reproducible_images(self) -> None:
266+
root = pathlib.Path(__file__).resolve().parents[1]
267+
text = (root / "rebuild" / "container" / "build_images.sh").read_text()
268+
269+
self.assertIn('REFERENCE_TIMESTAMP="$CONTAINER_WORK_ROOT/rootfs.timestamp"', text)
270+
self.assertIn('touch -t 199301010000.00 "$REFERENCE_TIMESTAMP"', text)
271+
self.assertIn('find "$STAGING_DIR" -exec touch -h -r "$REFERENCE_TIMESTAMP" {} +', text)
272+
self.assertIn('tar --sort=name --mtime="1993-01-01 00:00:00Z"', text)
273+
self.assertIn('--owner=0 --group=0 --numeric-owner', text)
274+
self.assertIn('printf \'\\0\\0\\0\\0\' | dd of="$DISK_IMAGE" bs=1 seek=440 conv=notrunc', text)
275+
265276
def test_dockerfile_installs_multilib_userland_build_dependencies(self) -> None:
266277
root = pathlib.Path(__file__).resolve().parents[1]
267278
text = (root / "rebuild" / "Dockerfile").read_text()

0 commit comments

Comments
 (0)