Build process overview
Every Essential release goes through two independent build processes:- Internal CI build (self-hosted, private)
- GitHub Actions build (public, transparent)
Internal CI build
The first build runs on Essential’s internal CI infrastructure: Features:- Faster build times with optimized runners
- Integration tests and quality checks
- Uploads JARs to Essential infrastructure (not yet published)
- Publishes source code to the public GitHub repository
- Runs additional verification steps
- Main JAR files uploaded to Essential CDN
- Build artifacts for internal testing
- Source code commit to GitHub
The internal CI builds faster because it has access to cached dependencies and uses dedicated build servers.
GitHub Actions build
The second build runs on GitHub-provided runners directly from the public repository: Purpose:- Verify source code authenticity
- Ensure reproducible builds
- Provide transparent build process
- Generate public checksums
- Runner:
ubuntu-latest-16-cores - Java versions: 8, 16, 17, 21 (Amazon Corretto)
- Clean environment with no cached state
- Git submodules initialized recursively
Build workflow
The GitHub Actions workflow performs these steps:Build command
Checksum verification
After building, GitHub Actions generates SHA-256 checksums for all output files: Files checksummed:- Main mod JARs:
versions/*/build/libs/* - Loader stage 0:
loader/stage0/{fabric,launchwrapper,modlauncher8,modlauncher9}/build/libs/* - Loader stage 1:
loader/stage1/{fabric,launchwrapper,modlauncher8,modlauncher9}/build/libs/* - Loader stage 2:
loader/stage2/{fabric,launchwrapper,modlauncher8,modlauncher9}/build/libs/* - Container mods:
loader/container/{fabric,launchwrapper,modlauncher8,modlauncher9}/build/libs/*
Checksum artifact
Checksums are saved tochecksums.txt and uploaded as a GitHub Actions artifact:
Checksum artifacts are retained for a limited time according to GitHub’s retention policy. Download them promptly if you need to verify a specific build.
Infrastructure verification
The GitHub Actions build downloads JARs from Essential’s CDN and verifies they match the locally built files:Verification process
- Build all versions from source
- Calculate SHA-256 checksums of built files
- For each platform:
- Query Essential API for download URL
- Download JAR from Essential CDN
- Calculate checksum of downloaded file
- Compare with locally built checksum
- Fail build if any checksums don’t match
Platform naming conversion
The verification script converts platform names to Essential’s API format:API endpoint format
Pinned JAR verification
Pinned JARs (for Modrinth/CurseForge) are not directly verified because:- They are deterministically derived from main JARs
- Verifying main JARs is sufficient
- Internal CI doesn’t upload pinned JARs (regenerated on demand)
See
build-logic/src/main/kotlin/essential/pinned-jar.gradle.kts for the pinned JAR generation logic.Build failure handling
If checksum verification fails:- Build marked as failed
- Raw JAR files uploaded as artifacts (1-day retention)
- Developers can download and compare files
- Helps debug non-determinism issues
Verifying builds locally
You can verify Essential files from your.minecraft folder:
Option 1: Build yourself
- Build Essential from source
- Compare built files with installed files
- Use
sha256sum(Linux/Mac) orGet-FileHash(Windows)
Option 2: Use GitHub checksums
- Find the GitHub Actions run for your Essential version
- Download the
checksumsartifact or view the “Generate checksums” log - Calculate checksum of your local file
- Compare with the checksum from GitHub
File locations
Different Essential files are stored in different locations: Mods folder:.minecraft/mods/
- Container mods (< 1 MB)
- Pinned mods from Modrinth/CurseForge (> 1 MB)
.minecraft/essential/
- Main mod JARs:
Essential (<Loader>_<MC-Version>).jar - Processed JARs:
Essential (<Loader>_<MC-Version>).processed.jar
.minecraft/essential/libraries/
- Extracted dependencies from mod JARs
.minecraft/essential/loader/
stage1.jar- Stage 1 loaderstage2.<Loader>_<MC-Version>.jar- Stage 2 loader
For detailed file verification instructions, see the “Verifying checksums” section in the repository README.
Build reproducibility
Essential builds are designed to be bit-for-bit reproducible: Requirements:- Same Java versions (8, 16, 17, 21)
- Same Gradle version (via wrapper)
- Same source code commit
- Same git submodule state
- Clean build environment
- Using Gradle wrapper (not local Gradle installation)
- Pinning all dependency versions
- Deterministic JAR generation
- No timestamp or environment-specific data in outputs
Always use
./gradlew instead of a local Gradle installation to ensure the exact same Gradle version is used.Transparency and trust
The dual-build system provides transparency:- Open source code - Everyone can read the source
- Public builds - GitHub Actions builds are fully visible
- Checksum verification - Anyone can verify file authenticity
- Infrastructure validation - Automated verification of deployed files