Use UPX in CI

This commit is contained in:
Kyle Carberry 2019-02-21 16:03:40 -06:00
parent bc076ca30d
commit 74660697e6
No known key found for this signature in database
GPG Key ID: A0409BDB6B0B3EDB

View File

@ -1,6 +1,7 @@
import { register, run } from "@coder/runner"; import { register, run } from "@coder/runner";
import * as fs from "fs"; import * as fs from "fs";
import * as fse from "fs-extra"; import * as fse from "fs-extra";
import * as os from "os";
import * as path from "path"; import * as path from "path";
import * as zlib from "zlib"; import * as zlib from "zlib";
@ -30,12 +31,48 @@ const buildServerBinaryPackage = register("build:server:binary:package", async (
throw new Error("Cannot build binary without web bundle built"); throw new Error("Cannot build binary without web bundle built");
} }
await buildServerBinaryCopy(); await buildServerBinaryCopy();
await dependencyNexeBinary();
const resp = await runner.execute("npm", ["run", "build:nexe"]); const resp = await runner.execute("npm", ["run", "build:nexe"]);
if (resp.exitCode !== 0) { if (resp.exitCode !== 0) {
throw new Error(`Failed to package binary: ${resp.stderr}`); throw new Error(`Failed to package binary: ${resp.stderr}`);
} }
}); });
const dependencyNexeBinary = register("dependency:nexe", async (runner) => {
if (os.platform() === "linux") {
const nexeDir = path.join(os.homedir(), ".nexe");
const targetBinaryName = `${os.platform()}-${os.arch()}-${process.version.substr(1)}`;
const targetBinaryPath = path.join(nexeDir, targetBinaryName);
if (!fs.existsSync(targetBinaryPath)) {
/**
* We create a binary with nexe
* so we can compress it
*/
fse.mkdirpSync(nexeDir);
runner.cwd = nexeDir;
await runner.execute("wget", [`https://github.com/nexe/nexe/releases/download/v3.0.0-beta.15/${targetBinaryName}`]);
await runner.execute("chmod", ["+x", targetBinaryPath]);
}
if (fs.statSync(targetBinaryPath).size >= 20000000) {
// Compress w/ upx
const upxFolder = path.join(os.tmpdir(), "upx");
const upxBinary = path.join(upxFolder, "upx");
if (!fs.existsSync(upxBinary)) {
fse.mkdirpSync(upxFolder);
runner.cwd = upxFolder;
const upxExtract = await runner.execute("bash", ["-c", "curl -L https://github.com/upx/upx/releases/download/v3.95/upx-3.95-amd64_linux.tar.xz | tar xJ --strip-components=1"]);
if (upxExtract.exitCode !== 0) {
throw new Error(`Failed to extract upx: ${upxExtract.stderr}`);
}
}
if (!fs.existsSync(upxBinary)) {
throw new Error("Not sure how, but the UPX binary does not exist");
}
await runner.execute(upxBinary, [targetBinaryPath]);
}
}
});
const buildServerBinaryCopy = register("build:server:binary:copy", async (runner) => { const buildServerBinaryCopy = register("build:server:binary:copy", async (runner) => {
const cliPath = path.join(pkgsPath, "server"); const cliPath = path.join(pkgsPath, "server");
const cliBuildPath = path.join(cliPath, "build"); const cliBuildPath = path.join(cliPath, "build");