This commit is contained in:
commit
d9baaa358a
6 changed files with 138 additions and 1 deletions
45
reproducible-builds/Dockerfile
Normal file
45
reproducible-builds/Dockerfile
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
FROM ubuntu:jammy-20230624@sha256:b060fffe8e1561c9c3e6dea6db487b900100fc26830b9ea2ec966c151ab4c020
|
||||||
|
|
||||||
|
# Allows package builders like FPM (used for creating the .deb package
|
||||||
|
# on linux) to make their build timestamps determistic. Otherwise, a fresh
|
||||||
|
# UNIX timestamp will be generated at the time of the build, and is non-deterministic.
|
||||||
|
#
|
||||||
|
# Read https://reproducible-builds.org/specs/source-date-epoch/ for more info
|
||||||
|
ENV SOURCE_DATE_EPOCH=1
|
||||||
|
|
||||||
|
# Due to some issues with NVM reading .nvmrc, we define the version
|
||||||
|
# as an environment variable and use that instead.
|
||||||
|
ARG NODE_VERSION
|
||||||
|
|
||||||
|
# ---
|
||||||
|
# This portion of the code is identical to the Signal Android's
|
||||||
|
# reproducible build system. https://github.com/signalapp/Signal-Android/blob/main/reproducible-builds/Dockerfile
|
||||||
|
|
||||||
|
# APT source files
|
||||||
|
COPY docker/ docker/
|
||||||
|
COPY docker/apt.conf docker/sources.list /etc/apt/
|
||||||
|
|
||||||
|
# Temporarily disables APT's certificate signature checking
|
||||||
|
# to download the certificates. See
|
||||||
|
RUN apt update -oAcquire::https::Verify-Peer=false
|
||||||
|
RUN apt install -oAcquire::https::Verify-Peer=false -y ca-certificates
|
||||||
|
|
||||||
|
RUN apt update
|
||||||
|
RUN apt install -y git curl g++ gcc make python3 tar
|
||||||
|
# ---
|
||||||
|
|
||||||
|
# Install nvm
|
||||||
|
ENV NVM_DIR=/usr/local/nvm
|
||||||
|
ENV NVM_VERSION=0.39.7
|
||||||
|
RUN mkdir $NVM_DIR
|
||||||
|
|
||||||
|
RUN curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/v${NVM_VERSION}/install.sh" | bash \
|
||||||
|
&& . $NVM_DIR/nvm.sh \
|
||||||
|
&& nvm install $NODE_VERSION \
|
||||||
|
&& nvm alias $NODE_VERSION \
|
||||||
|
&& nvm use $NODE_VERSION
|
||||||
|
|
||||||
|
ENV NODE_PATH=$NVM_DIR/v$NODE_VERSION/lib/node_modules
|
||||||
|
ENV PATH=$NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH
|
||||||
|
|
||||||
|
RUN git config --global --add safe.directory /project
|
78
reproducible-builds/README.md
Normal file
78
reproducible-builds/README.md
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
# Reproducible builds
|
||||||
|
|
||||||
|
In order to verify that Signal's official apps are correctly built from the open source code, we need *reproducible builds*.
|
||||||
|
|
||||||
|
Reproducible builds help ensure that anyone, including you, can build Signal Desktop in a way that is completely identical to the official downloads available to all users.
|
||||||
|
|
||||||
|
This provides an extra security layer to ensure that the builds aren't tampered with, corrupted, and built with the free open source code.
|
||||||
|
|
||||||
|
## Reproduce and verify the Windows/macOS build
|
||||||
|
|
||||||
|
Reproducible builds for macOS and Windows are not available yet.
|
||||||
|
|
||||||
|
## Reproduce and verify the Linux build
|
||||||
|
|
||||||
|
### Pre-requisites
|
||||||
|
|
||||||
|
- Docker Engine is installed and running on your computer
|
||||||
|
- You need `git`.
|
||||||
|
- This guide assumes you are running a Unix-based system, but should otherwise work on any platform that runs Docker Engine.
|
||||||
|
|
||||||
|
### Building
|
||||||
|
|
||||||
|
First, grab the source code by using `git`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ git clone https://github.com/signalapp/Signal-Desktop.git
|
||||||
|
```
|
||||||
|
|
||||||
|
This will download Signal Desktop's source code under the `Signal-Desktop` file. Once the download is complete, go inside the file and make sure you are selecting the branch used in official builds. For instance, if you are trying to build `7.18.0`, then do:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cd Signal-Desktop/
|
||||||
|
Signal-Desktop$ git checkout tags/7.16.0
|
||||||
|
```
|
||||||
|
|
||||||
|
You are now on the version of the source code used for `7.16.0`. Then, make sure your shell is in the `reproducible-builds` directory first:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Signal-Desktop$ cd reproducible-builds/
|
||||||
|
Signal-Desktop/reproducible-builds$ pwd
|
||||||
|
[...]/Signal-Desktop/reproducible-builds
|
||||||
|
```
|
||||||
|
|
||||||
|
Last step is to run the `./build.sh` script. (If your user is not in Docker's `docker` group, then you may need to run the script as `sudo`).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Signal-Desktop/reproducible-builds$ chmod +x ./build.sh
|
||||||
|
Signal-Desktop/reproducible-builds$ ./build.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
This bash script will do two things. First, it will create the Docker container where Signal Desktop will be built. Second, it will build Signal Desktop inside the container.
|
||||||
|
|
||||||
|
When the build is completed, the resulting file will be available at `Signal-Desktop/release/signal-desktop_7.18.0_amd64.deb`.
|
||||||
|
|
||||||
|
### Verify the official build
|
||||||
|
|
||||||
|
If you have followed the official Linux instructions to install Signal Desktop at https://signal.org/download/, then you will have `signal-desktop` available in your `apt` repositories. You can then simply grab the official build by typing:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ apt download signal-desktop
|
||||||
|
```
|
||||||
|
|
||||||
|
This will automatically download the official `.deb` package.
|
||||||
|
|
||||||
|
To verify the official `.deb` package against your build, make sure that your version is the same as the official version, for example version `7.18.0`. Then, compare the checksums and make sure they are identical. If they are identical, then the two builds are exactly the same, and you have successfully reproduced Signal Desktop.
|
||||||
|
|
||||||
|
(Note: do not compare with the checksums given below! They only serve as a visual example of what the output would look like)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ sha256sum signal-desktop_7.18.0_amd64-OUR_BUILD.deb signal-desktop_7.18.0_amd64_OFFICIAL_BUILD.deb
|
||||||
|
|
||||||
|
0df3d06f74c6855559ef079b368326ca18e144a28ede559fd76648a62ec3eed7 signal-desktop_7.18.0_amd64-OUR_BUILD.deb
|
||||||
|
0df3d06f74c6855559ef079b368326ca18e144a28ede559fd76648a62ec3eed7 signal-desktop_7.18.0_amd64_OFFICIAL_BUILD.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
### What to do if the checksums don't match
|
||||||
|
|
||||||
|
- File an issue [on the Github Issues page](https://github.com/signalapp/Signal-Desktop/issues).
|
5
reproducible-builds/build.sh
Executable file
5
reproducible-builds/build.sh
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
docker build -t signal-desktop --build-arg NODE_VERSION=$(cat ../.nvmrc) .
|
||||||
|
cd ..
|
||||||
|
docker run --rm -v "$(pwd)":/project -w /project --user "$(id -u):$(id -g)" signal-desktop sh -c "npm install; npm run generate; npm run build-release"
|
6
reproducible-builds/docker/apt.conf
Normal file
6
reproducible-builds/docker/apt.conf
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
Acquire::Check-Valid-Until "false";
|
||||||
|
Acquire::Languages "none";
|
||||||
|
Binary::apt-get::Acquire::AllowInsecureRepositories "false";
|
||||||
|
|
||||||
|
APT::Install-Recommends "false";
|
||||||
|
APT::Immediate-Configure "false";
|
3
reproducible-builds/docker/sources.list
Normal file
3
reproducible-builds/docker/sources.list
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
deb http://mirror.signalusers.org/ubuntu/1687461439/ jammy main universe
|
||||||
|
deb http://mirror.signalusers.org/ubuntu/1687461439/ jammy-security main universe
|
||||||
|
deb http://mirror.signalusers.org/ubuntu/1687461439/ jammy-updates main universe
|
|
@ -60,7 +60,7 @@ async function main() {
|
||||||
|
|
||||||
const outPath = join(__dirname, '../../build/dns-fallback.json');
|
const outPath = join(__dirname, '../../build/dns-fallback.json');
|
||||||
|
|
||||||
await writeFile(outPath, `${JSON.stringify(config, null, 2)}\n`);
|
//await writeFile(outPath, `${JSON.stringify(config, null, 2)}\n`);
|
||||||
}
|
}
|
||||||
|
|
||||||
main().catch(error => {
|
main().catch(error => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue