mirror of
https://github.com/game-ci/unity-builder.git
synced 2026-06-07 14:40:16 -07:00
5a42214cda
Introduces a yargs-based CLI entry point (src/cli.ts) distributed as the `game-ci` command. The CLI reuses existing unity-builder modules — Input, BuildParameters, Orchestrator, Docker, MacBuilder — so the same build engine powers both the GitHub Action and the standalone CLI. Commands: build, activate, orchestrate, cache (list/restore/clear), status, version. Closes #812 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
85 lines
3.0 KiB
TypeScript
85 lines
3.0 KiB
TypeScript
import type { CommandModule } from 'yargs';
|
|
import * as core from '@actions/core';
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import UnityVersioning from '../../model/unity-versioning';
|
|
|
|
const statusCommand: CommandModule = {
|
|
command: 'status',
|
|
describe: 'Show build status and workspace info',
|
|
builder: (yargs) => {
|
|
return yargs.option('project-path', {
|
|
alias: 'projectPath',
|
|
type: 'string',
|
|
description: 'Path to the Unity project',
|
|
default: '.',
|
|
});
|
|
},
|
|
handler: async (cliArguments) => {
|
|
const projectPath = (cliArguments.projectPath as string) || '.';
|
|
|
|
core.info('game-ci Workspace Status');
|
|
core.info('========================\n');
|
|
|
|
// Project detection
|
|
const projectVersionPath = path.join(projectPath, 'ProjectSettings', 'ProjectVersion.txt');
|
|
const hasProject = fs.existsSync(projectVersionPath);
|
|
|
|
core.info(`Project Path: ${path.resolve(projectPath)}`);
|
|
core.info(`Unity Project Found: ${hasProject ? 'Yes' : 'No'}`);
|
|
|
|
if (hasProject) {
|
|
try {
|
|
const unityVersion = UnityVersioning.determineUnityVersion(projectPath, 'auto');
|
|
core.info(`Unity Version: ${unityVersion}`);
|
|
} catch {
|
|
core.info(`Unity Version: Unable to detect`);
|
|
}
|
|
|
|
// Library folder status
|
|
const libraryPath = path.join(projectPath, 'Library');
|
|
if (fs.existsSync(libraryPath)) {
|
|
const stats = fs.statSync(libraryPath);
|
|
core.info(`Library Cache: Present (modified ${stats.mtime.toISOString()})`);
|
|
} else {
|
|
core.info(`Library Cache: Not present (clean build required)`);
|
|
}
|
|
|
|
// Build output detection
|
|
const buildsPath = path.join(projectPath, '..', 'build');
|
|
if (fs.existsSync(buildsPath)) {
|
|
const builds = fs.readdirSync(buildsPath);
|
|
if (builds.length > 0) {
|
|
core.info(`\nBuild Outputs (${buildsPath}):`);
|
|
for (const build of builds) {
|
|
const buildPath = path.join(buildsPath, build);
|
|
const buildStats = fs.statSync(buildPath);
|
|
core.info(` - ${build} (${buildStats.isDirectory() ? 'dir' : 'file'}, ${buildStats.mtime.toISOString()})`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Environment
|
|
core.info('\nEnvironment:');
|
|
core.info(` Platform: ${process.platform}`);
|
|
core.info(` Node.js: ${process.version}`);
|
|
core.info(` UNITY_SERIAL: ${process.env.UNITY_SERIAL ? 'Set' : 'Not set'}`);
|
|
core.info(` UNITY_LICENSE: ${process.env.UNITY_LICENSE ? 'Set' : 'Not set'}`);
|
|
core.info(` UNITY_EMAIL: ${process.env.UNITY_EMAIL ? 'Set' : 'Not set'}`);
|
|
core.info(` UNITY_PASSWORD: ${process.env.UNITY_PASSWORD ? 'Set' : 'Not set'}`);
|
|
|
|
// Docker availability
|
|
core.info(`\nDocker: Checking...`);
|
|
try {
|
|
const { execSync } = await import('node:child_process');
|
|
const dockerVersion = execSync('docker --version', { encoding: 'utf8' }).trim();
|
|
core.info(` ${dockerVersion}`);
|
|
} catch {
|
|
core.info(` Docker not found or not accessible`);
|
|
}
|
|
},
|
|
};
|
|
|
|
export default statusCommand;
|