feat(release): prepare 1.1.0 candidate

This commit is contained in:
Yun Chan 2026-08-29 18:33:45 +09:00
parent 5a34f66981
commit 5205dcdfa9
736 changed files with 115667 additions and 12203 deletions

54
scripts/gen-keystore.js Normal file
View file

@ -0,0 +1,54 @@
const { spawnSync } = require('child_process');
const path = require('path');
const fs = require('fs');
const keytool = 'C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-17.0.14.7-hotspot\\\\bin\\\\keytool.exe';
const allowedDirectory = fs.realpathSync(path.resolve('apps/mobile-rn/android/app'));
const required = [
'D3RO_RELEASE_STORE_FILE',
'D3RO_RELEASE_STORE_PASSWORD',
'D3RO_RELEASE_KEY_ALIAS',
'D3RO_RELEASE_KEY_PASSWORD',
];
const missing = required.filter((name) => !process.env[name]);
if (missing.length > 0) {
throw new Error(`Missing required release signing settings: ${missing.join(', ')}`);
}
const keystorePath = path.resolve(process.env.D3RO_RELEASE_STORE_FILE);
if (path.dirname(keystorePath) !== allowedDirectory || !/\.(?:keystore|p12)$/i.test(keystorePath)) {
throw new Error('D3RO_RELEASE_STORE_FILE must be a keystore inside android/app');
}
if (fs.existsSync(keystorePath)) {
throw new Error('Refusing to overwrite an existing release keystore');
}
if (process.env.D3RO_RELEASE_STORE_PASSWORD.length < 20) {
throw new Error('D3RO_RELEASE_STORE_PASSWORD must contain at least 20 characters');
}
if (process.env.D3RO_RELEASE_STORE_PASSWORD !== process.env.D3RO_RELEASE_KEY_PASSWORD) {
throw new Error('PKCS12 store and key passwords must match');
}
if (!/^[A-Za-z0-9._-]{3,64}$/.test(process.env.D3RO_RELEASE_KEY_ALIAS)) {
throw new Error('D3RO_RELEASE_KEY_ALIAS has an invalid format');
}
const args = [
'-genkeypair',
'-v',
'-keystore', keystorePath,
'-storetype', 'PKCS12',
'-alias', process.env.D3RO_RELEASE_KEY_ALIAS,
'-keyalg', 'RSA',
'-keysize', '3072',
'-validity', '10000',
'-storepass:env', 'D3RO_RELEASE_STORE_PASSWORD',
'-keypass:env', 'D3RO_RELEASE_KEY_PASSWORD',
'-dname', process.env.D3RO_RELEASE_DNAME ||
'CN=D3RO Voice AI, OU=Technology, O=Chanpaca Inc, L=Seoul, ST=Seoul, C=KR',
];
const result = spawnSync(keytool, args, { stdio: 'inherit', env: process.env });
if (result.error) throw result.error;
if (result.status !== 0) throw new Error(`Keytool exited with status ${result.status}`);
fs.chmodSync(keystorePath, 0o600);
console.log(`Created release keystore at ${keystorePath}`);