Skip to content

Commit 81f4196

Browse files
committed
Refactor reproducibility check
1 parent 95ef2f5 commit 81f4196

File tree

1 file changed

+63
-40
lines changed

1 file changed

+63
-40
lines changed

.github/workflows/repro_check.yml

Lines changed: 63 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,102 @@
1-
name: Build and Diff Projects
1+
# Workflow that runs after a merge to master, builds toolchain in 2 different
2+
# directories to check for reproducible builds and stores the created toolchains
3+
# This workflow also runs on branches named reproducible
4+
5+
name: Reproducibility check
26

37
on:
48
push:
5-
branches:
6-
- master
7-
pull_request:
89
branches:
910
- master
1011
- reproducible
1112

1213
jobs:
1314
build_and_compare:
14-
runs-on: ubuntu-latest
15+
runs-on: ubuntu-24.04
16+
17+
strategy:
18+
matrix:
19+
build_dir: [buildA, buildA_extended]
1520

1621
steps:
1722
- name: Checkout repository
18-
uses: actions/checkout@v2
19-
20-
- name: Set up Python
21-
uses: actions/setup-python@v2
22-
with:
23-
python-version: '3.x' # Adjust to the version you need
23+
uses: actions/checkout@v4
2424

25-
- name: Build and store buildA binaries
25+
# Build the two toolchains for comparision
26+
- name: Build and store ${{ matrix.build_dir }} binaries
2627
run: |
27-
mkdir ../buildA
28-
cp -r "$(pwd)" ../buildA
29-
pushd ../buildA
30-
SOURCE_DIR=$(dirname $(find . -maxdepth 2 -name x.py))
31-
$SOURCE_DIR/configure --set rust.channel=nightly
32-
$SOURCE_DIR/x.py build --stage 2 -j$(($(nproc)*2/3))
33-
rm -rf $SOURCE_DIR
34-
STAGE2_DIR=`find build -name stage2`
35-
cp -r "$STAGE2_DIR" .
36-
echo "Contents stage 2 dir : `ls stage2`"
37-
rm -rf build
38-
popd
28+
mkdir ../${{ matrix.build_dir }}
29+
cp -r "$(pwd)" ../${{ matrix.build_dir }}
30+
pushd ../${{ matrix.build_dir }}
3931
40-
- name: Build and store buildA_extended binaries
41-
run: |
42-
mkdir ../buildA_extended
43-
cp -r "$(pwd)" ../buildA_extended
44-
pushd ../buildA_extended
45-
SOURCE_DIR=$(dirname $(find . -maxdepth 2 -name x.py))
32+
# Find source directory.
33+
SOURCE_DIR=$(dirname $(find . -maxdepth 2 -name x.py))
34+
35+
# FIXME: Setting channel to nightly because only nightly builds succeed on ci.
4636
$SOURCE_DIR/configure --set rust.channel=nightly
37+
38+
# Build rust till stage 2
4739
$SOURCE_DIR/x.py build --stage 2 -j$(($(nproc)*2/3))
40+
41+
# Remove copy of source directory to save space.
4842
rm -rf $SOURCE_DIR
49-
STAGE2_DIR=`find build -name stage2`
43+
44+
# Find stage 2 artifacts directory
45+
STAGE2_DIR=$(find build -name stage2)
46+
47+
# Save stage 2 directory contents before we delete build
5048
cp -r "$STAGE2_DIR" .
51-
echo "Contents stage 2 dir : `ls stage2`"
49+
echo "Contents stage 2 dir : $(ls stage2)"
50+
51+
# Remove build directory to save space
5252
rm -rf build
5353
popd
5454
55-
- name: Compare builds and archive artifacts
55+
# Compare the two builds
56+
- name: Compare builds
57+
id: compare
5658
run: |
5759
# Ensure the directories exist
5860
if [[ ! -d "../buildA" || ! -d "../buildA_extended" ]]; then
5961
echo "Error: Build directories not found!"
6062
exit 1
6163
fi
6264
63-
# Perform a diff between the two builds
64-
diff -r ../buildA/stage2 ../buildA_extended/stage2 || echo "Differences found!"
65-
66-
tar -czf buildA.tar.gz ../buildA
67-
tar -czf buildA_extended.tar.gz ../buildA_extended
65+
# Perform a recursive diff between the stage2 directories of both builds
66+
# If there are differences, record the result so we can upload artifacts and then fail later
67+
# The binaries should be identical, so the cause of difference should be analysed and fixed
68+
# appropriately.
69+
if diff -r ../buildA/stage2 ../buildA_extended/stage2; then
70+
echo "No differences found."
71+
echo "has_diff=false" >> $GITHUB_OUTPUT
72+
else
73+
echo "Differences found!"
74+
echo "has_diff=true" >> $GITHUB_OUTPUT
75+
fi
6876
77+
# Upload buildA directory as an artifact (for debugging purposes)
78+
# This artifact contains stage2 folder from buildA. This artifact would
79+
# be helpful to debug reproducibility issue when this test fails.
6980
- name: Upload buildA artifact
81+
if: steps.compare.outputs.has_diff == 'true'
7082
uses: actions/upload-artifact@v4
7183
with:
7284
name: buildA
73-
path: buildA.tar.gz
85+
path: ../buildA
7486

87+
# Upload buildA_extended directory as an artifact (for debugging purposes)
88+
# This artifact contains stage2 folder from buildA_extended. This artifact would
89+
# be helpful to debug reproducibility issue when this test fails.
7590
- name: Upload buildA_extended artifact
91+
if: steps.compare.outputs.has_diff == 'true'
7692
uses: actions/upload-artifact@v4
7793
with:
7894
name: buildA_extended
79-
path: buildA_extended.tar.gz
95+
path: ../buildA_extended
96+
97+
# Fail the job if differences were found between the builds
98+
- name: Fail the job if there are differences
99+
if: steps.compare.outputs.has_diff == 'true'
100+
run: |
101+
echo "Differences found between buildA and buildA_extended, Reproducibility check failed"
102+
exit 1

0 commit comments

Comments
 (0)