66 lines
2.0 KiB
TypeScript
66 lines
2.0 KiB
TypeScript
|
|
#!/usr/bin/env bun
|
||
|
|
/**
|
||
|
|
* Build the Shade Prekey Server Docker image locally.
|
||
|
|
*
|
||
|
|
* Usage:
|
||
|
|
* bun run build:docker # build as shade-prekey:dev
|
||
|
|
* bun run build:docker -- --tag X # custom tag
|
||
|
|
* bun run build:docker -- --push # build + push to Gitea registry
|
||
|
|
*
|
||
|
|
* Env:
|
||
|
|
* GITEA_TOKEN — required for --push
|
||
|
|
* GITEA_USER — default Stian
|
||
|
|
*/
|
||
|
|
import { $ } from 'bun';
|
||
|
|
|
||
|
|
const args = process.argv.slice(2);
|
||
|
|
const tagIdx = args.indexOf('--tag');
|
||
|
|
const tag = tagIdx >= 0 ? args[tagIdx + 1] : 'dev';
|
||
|
|
const shouldPush = args.includes('--push');
|
||
|
|
const user = process.env.GITEA_USER ?? 'Stian';
|
||
|
|
const registry = 'gt.zyon.no';
|
||
|
|
const image = `${registry.toLowerCase()}/${user.toLowerCase()}/shade-prekey`;
|
||
|
|
const fullTag = `${image}:${tag}`;
|
||
|
|
|
||
|
|
async function main() {
|
||
|
|
console.log(`Building ${fullTag}…`);
|
||
|
|
await $`docker build -f packages/shade-server/Dockerfile -t ${fullTag} .`;
|
||
|
|
|
||
|
|
console.log(`✓ Built ${fullTag}`);
|
||
|
|
const { stdout: size } = await $`docker images ${fullTag} --format {{.Size}}`.quiet();
|
||
|
|
console.log(` Size: ${size.toString().trim()}`);
|
||
|
|
|
||
|
|
if (shouldPush) {
|
||
|
|
const token = process.env.GITEA_TOKEN;
|
||
|
|
if (!token) {
|
||
|
|
console.error('GITEA_TOKEN env var required for --push');
|
||
|
|
process.exit(1);
|
||
|
|
}
|
||
|
|
console.log(`Pushing ${fullTag}…`);
|
||
|
|
// Login via stdin to avoid leaking token in process table
|
||
|
|
const loginProc = Bun.spawn(['docker', 'login', registry, '-u', user, '--password-stdin'], {
|
||
|
|
stdin: 'pipe',
|
||
|
|
stdout: 'inherit',
|
||
|
|
stderr: 'inherit',
|
||
|
|
});
|
||
|
|
loginProc.stdin.write(token);
|
||
|
|
await loginProc.stdin.end();
|
||
|
|
await loginProc.exited;
|
||
|
|
|
||
|
|
await $`docker push ${fullTag}`;
|
||
|
|
console.log(`✓ Pushed ${fullTag}`);
|
||
|
|
|
||
|
|
if (tag !== 'latest') {
|
||
|
|
const latestTag = `${image}:latest`;
|
||
|
|
await $`docker tag ${fullTag} ${latestTag}`;
|
||
|
|
await $`docker push ${latestTag}`;
|
||
|
|
console.log(`✓ Pushed ${latestTag}`);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
main().catch((err) => {
|
||
|
|
console.error(err);
|
||
|
|
process.exit(1);
|
||
|
|
});
|