summaryrefslogtreecommitdiffstats
path: root/scripts/debrepro.pod
blob: 6cc7b2d78cf5cab7f62a9f6c61058fbfc5df9b3b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
=head1 NAME

debrepro - reproducibility tester for Debian packages

=head1 SYNOPSIS

B<debrepro> [I<OPTIONS>] [I<SOURCEDIR>]

=head1  DESCRIPTION

B<debrepro> will build a given source directory twice, with a set of
variations between the first and the second build, and compare the
produced binary packages. If B<diffoscope> is installed, it is used to
compare non-matching binaries. If B<disorderfs> is installed, it is used
during the build to inject non-determinism in filesystem listing
operations.

I<SOURCEDIR> must be a directory containing an unpacked Debian source
package. If I<SOURCEDIR> is omitted, the current directory is assumed.

=head1 OUTPUT DIRECTORY

At the very end of a build, B<debrepro> will inform the location of the
output directory where the build artifacts can be found. In that
directory, you will find:

=over

=item I<$OUTPUTDIR/first>

Contains the results of the first build, including a copy of the source
tree, and the resulting binary packages.

=item I<$OUTPUTDIR/first/build.sh>

Contains the exact build script that was used in the first build.

=item I<$OUTPUTDIR/second>

Contains the results of the second build, including a copy of the source tree,
and the resulting binary packages.

=item I<$OUTPUTDIR/second/build.sh>

Contains the exact build script that was used in the second build.

=back

Taking a B<diff(1)> between I<$OUTPUTDIR/first/build.sh> and
I<$OUTPUTDIR/second/build.sh> is an excellent way of figuring out
exactly what changed between the two builds.

=head1 SUPPORTED VARIATIONS

=over

=item B<user>

The I<$USER> environment variable will contain different values between the
first and second builds.

=item B<path>

During the second build, a fake, non-existing directory will be appended to the
I<$PATH> environment variable.

=item B<umask>

The builds will use different umask settings.

=item B<locale>

Both I<$LC_ALL> and I<$LANG> will be different across the two builds.

=item B<timezone>

I<$TZ> will be different across builds.

=item B<filesystem-ordering>

If B<disorderfs> is installed, both builds will be done under a disorderfs
overlay directory. This will cause filesystem listing operations to be return
items in a non-deterministic order.

=item B<time>

The second build will be executed 213 days, 7 hours and 13 minutes in the
future with regards to the current time (using B<faketime(1)>).

=back

=head1 OPTIONS

=over

=item -s VARIATION, --skip VARIATION

Don't perform the named VARIATION. Variation names are the ones used in
their description in section B<SUPPORTED VARIATIONS>.

=item -b COMMAND, --before-second-build COMMAND

Run COMMAND before performing the second build. This can be used for
example to apply a patch to a source tree for the second build, and
check whether (or how) the resulting binaries are affected.

Examples:

  $ debrepro --before-second-build "git checkout branch-with-changes"

  $ debrepro --before-second-build "patch -p1 < /path/to/patch"

=item -B COMMAND, --build-command COMMAND

Use custom build command. Default: I<dpkg-buildpackage -b -us -uc>.

If a custom build command is specified, the restriction of only running
against a Debian source tree is relaxed and you can run debrepro against
any source directory.

=item -a PATTERN, --artifact-pattern PATTERN

Define a file glob pattern to determine which artifacts need to be
compared across the builds. Default: I<../*.deb>.

=item -n, --no-copy

Do not copy the source directory to the temporary work directory before
each build. Use this to run debrepro against the source directory
directly.

=item -t TIME, --timeout TIME

Apply a timeout to all builds. I<TIME> must be a time specification
compatible with GNU timeout(1).


=item -h, --help

Display this help message and exit.

=back

=head1 EXIT STATUS

=over

=item 0Z<>

Package is reproducible.

Reproducible here means that the two builds produced the exactly the
same binaries, under the set of variations that B<debrepro> tests. Other
sources of non-determinism in builds that are not yet tested might still
affect builds in the wild.

=item 1Z<>

Package is not reproducible.

=item 2Z<>

The given input is not a valid Debian source package.

=item 3Z<>

Required programs are missing.

=back

=head1 SEE ALSO

diffoscope (1), disorderfs (1), timeout(1)

=head1  AUTHOR

Antonio Terceiro <terceiro@debian.org>.