# PalladiumWallet — Reproducible Builds via Docker All three distribution targets (Windows, Linux, Android) are built inside Docker containers so the output is identical regardless of what is installed on the host machine. **Prerequisites:** Docker Engine (or Docker Desktop) running on the host. No .NET SDK, JDK, or Android SDK required on the host. --- ## Quick start ```bash # From the repository root (or the docker/ folder — both work): ./docker/build.sh ``` Running without arguments shows an interactive menu. Pick a target or `all`. --- ## CLI usage ``` ./docker/build.sh [TARGET] [--rebuild] Targets: windows Win x64 single-file executable linux Linux x64 self-contained tarball android Android APK (debug-signed) all All three targets Options: --rebuild Force rebuild of Docker images (needed after Dockerfile changes) ``` ### Examples ```bash # Build everything ./docker/build.sh all # Windows only ./docker/build.sh windows # Android, forcing a fresh Docker image ./docker/build.sh android --rebuild ``` --- ## Output All artifacts land in `dist/` at the repository root: | Target | Path | |---------|--------------------------------------------------| | Windows | `dist/windows/PalladiumWallet-{ver}-win-x64.exe` | | Linux | `dist/linux/PalladiumWallet-{ver}-linux-x64.tar.gz` | | Android | `dist/android/PalladiumWallet-{ver}.apk` | The version is read automatically from `src/App/PalladiumWallet.App.csproj`. --- ## Docker images | Image name | Dockerfile | Used for | Approx. size | |---------------------|-----------------------|--------------------|--------------| | `plm-build-desktop` | `Dockerfile.desktop` | windows + linux | ~1.5 GB | | `plm-build-android` | `Dockerfile.android` | android | ~5 GB | Images are built automatically on first use and reused on subsequent runs. Use `--rebuild` only after you modify a Dockerfile. ### NuGet package cache A Docker named volume `plm-nuget-cache` is created on first run and reused for all subsequent builds, so NuGet packages are not re-downloaded every time. To inspect or remove it: ```bash docker volume inspect plm-nuget-cache docker volume rm plm-nuget-cache # forces full re-download on next build ``` --- ## Source isolation The repository is mounted **read-only** inside every container. The build commands work on a copy at `/tmp/build`, so `bin/`, `obj/`, and other generated files never appear in your working tree. --- ## Android notes The `plm-build-android` image bakes in the entire Android SDK and the `dotnet android workload` (~5 GB total). The first `docker build` for this image can take 10–20 minutes depending on network speed. The resulting APK is **debug-signed** (suitable for sideloading during development). For Play Store distribution, release signing must be configured separately. If the `commandlinetools` URL in `Dockerfile.android` becomes stale (Google rotates the build number), update the URL to the latest [Android command-line tools](https://developer.android.com/studio#command-tools) and run `./docker/build.sh android --rebuild`. --- ## Linux AppImage (future) The Linux target currently produces a self-contained binary tarball. Once a `pupnet.conf` is added to the repository, the `build_linux` function in `build.sh` can be extended to call `dotnet pupnet --runtime linux-x64` inside the same `plm-build-desktop` image to produce an AppImage.