46 lines
2.8 KiB
JavaScript
46 lines
2.8 KiB
JavaScript
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import { fixture, seal } from './runtime-fixture.mjs';
|
|
import { runtime } from '../../platform/runtime.mjs';
|
|
import { deployOnHost, deployableRelease, releaseName, sha256 } from '../../platform/deployment.mjs';
|
|
|
|
export function setup(t){
|
|
const f=fixture(t);
|
|
const manifest=JSON.parse(fs.readFileSync(path.join(f.release,'manifest.json')));
|
|
manifest.git={dirty:false,commit:'1'.repeat(40)};manifest.managed_files={server:[]};
|
|
fs.writeFileSync(path.join(f.release,'manifest.json'),JSON.stringify(manifest));seal(f.release);
|
|
// Health's actual waiting/state machine is tested separately. This adapter
|
|
// substitutes readiness, while retaining real binding/lock/Compose checks.
|
|
f.execute=options=>{
|
|
const args=options.args[0]==='health'?['ps']:options.args.filter((item,index,array)=>item!=='--wait'&&item!=='--wait-timeout'&&array[index-1]!=='--wait-timeout');
|
|
const result=runtime({...options,args});
|
|
if(result===0&&args[0]==='up'){
|
|
const config=path.join(options.env.MC_RELEASE_DIR,'server/config');
|
|
for(const file of fs.readdirSync(config)){
|
|
fs.mkdirSync(path.join(options.env.MC_ROOT,'runtime/config'),{recursive:true});fs.copyFileSync(path.join(config,file),path.join(options.env.MC_ROOT,'runtime/config',file));
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
f.deploy=(release=f.release,receive)=>{
|
|
const verified=deployableRelease(release);
|
|
return deployOnHost({repository:f.root,root:f.host,targetName:releaseName(verified.manifest),targetIdentity:verified.identity,targetChecksums:sha256(path.join(release,'SHA256SUMS')),releaseBytes:1024,timeout:30,env:f.env,execute:f.execute,receive:receive??(stage=>fs.cpSync(release,stage,{recursive:true}))});
|
|
};
|
|
f.next=(version='2.0.0',edit=()=>{})=>{
|
|
const release=path.join(f.root,'release-'+version);fs.cpSync(f.release,release,{recursive:true});
|
|
const manifest=JSON.parse(fs.readFileSync(path.join(release,'manifest.json')));manifest.pack.version=version;
|
|
fs.writeFileSync(path.join(release,'manifest.json'),JSON.stringify(manifest));edit(release);seal(release);return release;
|
|
};
|
|
f.state=()=>JSON.parse(fs.readFileSync(path.join(f.host,'deployment-state.json')));
|
|
f.events=()=>JSON.parse(fs.readFileSync(path.join(f.root,'.tools/events.json')));
|
|
return f;
|
|
}
|
|
export function addConfig(release,value='original'){
|
|
fs.writeFileSync(path.join(release,'server/config/marker.txt'),value);
|
|
const manifest=JSON.parse(fs.readFileSync(path.join(release,'manifest.json')));
|
|
manifest.release_files.push({path:'server/config/marker.txt'});
|
|
manifest.managed_files.server.push({path:'config/marker.txt',owner:'server',policy:'replace',hashes:{sha256:sha256(path.join(release,'server/config/marker.txt'))}});
|
|
fs.writeFileSync(path.join(release,'manifest.json'),JSON.stringify(manifest));seal(release);
|
|
}
|
|
|