Use retained workspace :O

pull/461/head
Frostebite 2022-10-05 01:20:48 +01:00
parent 5a3613114b
commit c7881bc2cd
4 changed files with 37 additions and 17 deletions

21
dist/index.js vendored
View File

@ -667,6 +667,11 @@ class SharedWorkspaceLocking {
return (yield SharedWorkspaceLocking.GetAllWorkspaces()).includes(workspace); return (yield SharedWorkspaceLocking.GetAllWorkspaces()).includes(workspace);
}); });
} }
static CleanupWorkspace(workspace) {
return __awaiter(this, void 0, void 0, function* () {
yield cloud_runner_system_1.CloudRunnerSystem.Run(`aws s3 rm ${SharedWorkspaceLocking.workspaceRoot}/${workspace} --recursive`, false, true);
});
}
static GetFreeWorkspaces() { static GetFreeWorkspaces() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const result = []; const result = [];
@ -681,7 +686,7 @@ class SharedWorkspaceLocking {
} }
static GetAllWorkspaces() { static GetAllWorkspaces() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
return (yield SharedWorkspaceLocking.ReadLines(`aws s3 ls s3://game-ci-test-storage/locks/`)).map((x) => x.replace(`/`, ``)); return (yield SharedWorkspaceLocking.ReadLines(`aws s3 ls ${SharedWorkspaceLocking.workspaceRoot}`)).map((x) => x.replace(`/`, ``));
}); });
} }
static GetAllLocks(workspace) { static GetAllLocks(workspace) {
@ -689,7 +694,7 @@ class SharedWorkspaceLocking {
if (!(yield SharedWorkspaceLocking.DoesWorkspaceExist(workspace))) { if (!(yield SharedWorkspaceLocking.DoesWorkspaceExist(workspace))) {
throw new Error("Workspace doesn't exist, can't call get all locks"); throw new Error("Workspace doesn't exist, can't call get all locks");
} }
return (yield SharedWorkspaceLocking.ReadLines(`aws s3 ls s3://game-ci-test-storage/locks/${workspace}/`)).map((x) => x.replace(`/`, ``)); return (yield SharedWorkspaceLocking.ReadLines(`aws s3 ls ${SharedWorkspaceLocking.workspaceRoot}/${workspace}/`)).map((x) => x.replace(`/`, ``));
}); });
} }
static ReadLines(command) { static ReadLines(command) {
@ -709,7 +714,7 @@ class SharedWorkspaceLocking {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const file = `${Date.now()}_${runId}_lock`; const file = `${Date.now()}_${runId}_lock`;
fs.writeFileSync(file, ''); fs.writeFileSync(file, '');
yield cloud_runner_system_1.CloudRunnerSystem.Run(`aws s3 cp ./${file} s3://game-ci-test-storage/locks/${workspace}/${file}`, false, true); yield cloud_runner_system_1.CloudRunnerSystem.Run(`aws s3 cp ./${file} ${SharedWorkspaceLocking.workspaceRoot}/${workspace}/${file}`, false, true);
fs.rmSync(file); fs.rmSync(file);
return SharedWorkspaceLocking.HasWorkspaceLock(workspace, runId); return SharedWorkspaceLocking.HasWorkspaceLock(workspace, runId);
}); });
@ -722,8 +727,8 @@ class SharedWorkspaceLocking {
const file = (yield SharedWorkspaceLocking.GetAllLocks(workspace)).filter((x) => x.includes(`_${runId}_lock`)); const file = (yield SharedWorkspaceLocking.GetAllLocks(workspace)).filter((x) => x.includes(`_${runId}_lock`));
cloud_runner_logger_1.default.log(`${JSON.stringify(yield SharedWorkspaceLocking.GetAllLocks(workspace))}`); cloud_runner_logger_1.default.log(`${JSON.stringify(yield SharedWorkspaceLocking.GetAllLocks(workspace))}`);
cloud_runner_logger_1.default.log(`Deleting file ${file}`); cloud_runner_logger_1.default.log(`Deleting file ${file}`);
cloud_runner_logger_1.default.log(`aws s3 rm s3://game-ci-test-storage/locks/${workspace}/${file}`); cloud_runner_logger_1.default.log(`aws s3 rm ${SharedWorkspaceLocking.workspaceRoot}/${workspace}/${file}`);
yield cloud_runner_system_1.CloudRunnerSystem.Run(`aws s3 rm s3://game-ci-test-storage/locks/${workspace}/${file}`, false, true); yield cloud_runner_system_1.CloudRunnerSystem.Run(`aws s3 rm ${SharedWorkspaceLocking.workspaceRoot}/${workspace}/${file}`, false, true);
return !SharedWorkspaceLocking.HasWorkspaceLock(workspace, runId); return !SharedWorkspaceLocking.HasWorkspaceLock(workspace, runId);
}); });
} }
@ -740,7 +745,7 @@ class SharedWorkspaceLocking {
if (!(yield SharedWorkspaceLocking.DoesWorkspaceExist(workspace))) { if (!(yield SharedWorkspaceLocking.DoesWorkspaceExist(workspace))) {
return false; return false;
} }
const files = yield SharedWorkspaceLocking.ReadLines(`aws s3 ls s3://game-ci-test-storage/locks/${workspace}/`); const files = yield SharedWorkspaceLocking.ReadLines(`aws s3 ls ${SharedWorkspaceLocking.workspaceRoot}/${workspace}/`);
// 1 Because we expect 1 workspace file to exist in every workspace folder // 1 Because we expect 1 workspace file to exist in every workspace folder
return files.length > 1; return files.length > 1;
}); });
@ -749,7 +754,7 @@ class SharedWorkspaceLocking {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const file = `${Date.now()}_workspace`; const file = `${Date.now()}_workspace`;
fs.writeFileSync(file, ''); fs.writeFileSync(file, '');
yield cloud_runner_system_1.CloudRunnerSystem.Run(`aws s3 cp ./${file} s3://game-ci-test-storage/locks/${workspace}/${file}`, false, true); yield cloud_runner_system_1.CloudRunnerSystem.Run(`aws s3 cp ./${file} ${SharedWorkspaceLocking.workspaceRoot}/${workspace}/${file}`, false, true);
fs.rmSync(file); fs.rmSync(file);
return workspace; return workspace;
}); });
@ -758,6 +763,7 @@ class SharedWorkspaceLocking {
static ReleaseLock(workspace) { } static ReleaseLock(workspace) { }
} }
exports.SharedWorkspaceLocking = SharedWorkspaceLocking; exports.SharedWorkspaceLocking = SharedWorkspaceLocking;
SharedWorkspaceLocking.workspaceRoot = `s3://game-ci-test-storage/locks`;
exports["default"] = SharedWorkspaceLocking; exports["default"] = SharedWorkspaceLocking;
@ -5052,6 +5058,7 @@ class BuildAutomationWorkflow {
cloud_runner_logger_1.default.log(`Cloud Runner is running standard build automation`); cloud_runner_logger_1.default.log(`Cloud Runner is running standard build automation`);
if (cloud_runner_options_1.default.retainWorkspaces) { if (cloud_runner_options_1.default.retainWorkspaces) {
const workspace = (yield shared_workspace_locking_1.default.GetLockedWorkspace(`test-workspace-${cloud_runner_1.default.buildParameters.buildGuid}`, cloud_runner_1.default.buildParameters.buildGuid)) || cloud_runner_1.default.buildParameters.buildGuid; const workspace = (yield shared_workspace_locking_1.default.GetLockedWorkspace(`test-workspace-${cloud_runner_1.default.buildParameters.buildGuid}`, cloud_runner_1.default.buildParameters.buildGuid)) || cloud_runner_1.default.buildParameters.buildGuid;
process.env.LOCKED_WORKSPACE = workspace;
cloud_runner_logger_1.default.logLine(`Using workspace ${workspace}`); cloud_runner_logger_1.default.logLine(`Using workspace ${workspace}`);
cloudRunnerStepState.environment = [ cloudRunnerStepState.environment = [
...cloudRunnerStepState.environment, ...cloudRunnerStepState.environment,

2
dist/index.js.map vendored

File diff suppressed because one or more lines are too long

View File

@ -3,6 +3,7 @@ import * as fs from 'fs';
import CloudRunnerLogger from '../cloud-runner/services/cloud-runner-logger'; import CloudRunnerLogger from '../cloud-runner/services/cloud-runner-logger';
import CloudRunnerOptions from '../cloud-runner/cloud-runner-options'; import CloudRunnerOptions from '../cloud-runner/cloud-runner-options';
export class SharedWorkspaceLocking { export class SharedWorkspaceLocking {
private static readonly workspaceRoot = `s3://game-ci-test-storage/locks`;
public static async GetLockedWorkspace(workspaceIfCreated: string, runId: string) { public static async GetLockedWorkspace(workspaceIfCreated: string, runId: string) {
if (!CloudRunnerOptions.retainWorkspaces) { if (!CloudRunnerOptions.retainWorkspaces) {
return; return;
@ -22,6 +23,14 @@ export class SharedWorkspaceLocking {
return (await SharedWorkspaceLocking.GetAllWorkspaces()).includes(workspace); return (await SharedWorkspaceLocking.GetAllWorkspaces()).includes(workspace);
} }
public static async CleanupWorkspace(workspace: string) {
await CloudRunnerSystem.Run(
`aws s3 rm ${SharedWorkspaceLocking.workspaceRoot}/${workspace} --recursive`,
false,
true,
);
}
public static async GetFreeWorkspaces(): Promise<string[]> { public static async GetFreeWorkspaces(): Promise<string[]> {
const result: string[] = []; const result: string[] = [];
const workspaces = await SharedWorkspaceLocking.GetAllWorkspaces(); const workspaces = await SharedWorkspaceLocking.GetAllWorkspaces();
@ -34,7 +43,7 @@ export class SharedWorkspaceLocking {
return result; return result;
} }
public static async GetAllWorkspaces(): Promise<string[]> { public static async GetAllWorkspaces(): Promise<string[]> {
return (await SharedWorkspaceLocking.ReadLines(`aws s3 ls s3://game-ci-test-storage/locks/`)).map((x) => return (await SharedWorkspaceLocking.ReadLines(`aws s3 ls ${SharedWorkspaceLocking.workspaceRoot}`)).map((x) =>
x.replace(`/`, ``), x.replace(`/`, ``),
); );
} }
@ -43,9 +52,9 @@ export class SharedWorkspaceLocking {
throw new Error("Workspace doesn't exist, can't call get all locks"); throw new Error("Workspace doesn't exist, can't call get all locks");
} }
return (await SharedWorkspaceLocking.ReadLines(`aws s3 ls s3://game-ci-test-storage/locks/${workspace}/`)).map( return (
(x) => x.replace(`/`, ``), await SharedWorkspaceLocking.ReadLines(`aws s3 ls ${SharedWorkspaceLocking.workspaceRoot}/${workspace}/`)
); ).map((x) => x.replace(`/`, ``));
} }
private static async ReadLines(command: string): Promise<string[]> { private static async ReadLines(command: string): Promise<string[]> {
@ -66,7 +75,7 @@ export class SharedWorkspaceLocking {
const file = `${Date.now()}_${runId}_lock`; const file = `${Date.now()}_${runId}_lock`;
fs.writeFileSync(file, ''); fs.writeFileSync(file, '');
await CloudRunnerSystem.Run( await CloudRunnerSystem.Run(
`aws s3 cp ./${file} s3://game-ci-test-storage/locks/${workspace}/${file}`, `aws s3 cp ./${file} ${SharedWorkspaceLocking.workspaceRoot}/${workspace}/${file}`,
false, false,
true, true,
); );
@ -82,8 +91,8 @@ export class SharedWorkspaceLocking {
const file = (await SharedWorkspaceLocking.GetAllLocks(workspace)).filter((x) => x.includes(`_${runId}_lock`)); const file = (await SharedWorkspaceLocking.GetAllLocks(workspace)).filter((x) => x.includes(`_${runId}_lock`));
CloudRunnerLogger.log(`${JSON.stringify(await SharedWorkspaceLocking.GetAllLocks(workspace))}`); CloudRunnerLogger.log(`${JSON.stringify(await SharedWorkspaceLocking.GetAllLocks(workspace))}`);
CloudRunnerLogger.log(`Deleting file ${file}`); CloudRunnerLogger.log(`Deleting file ${file}`);
CloudRunnerLogger.log(`aws s3 rm s3://game-ci-test-storage/locks/${workspace}/${file}`); CloudRunnerLogger.log(`aws s3 rm ${SharedWorkspaceLocking.workspaceRoot}/${workspace}/${file}`);
await CloudRunnerSystem.Run(`aws s3 rm s3://game-ci-test-storage/locks/${workspace}/${file}`, false, true); await CloudRunnerSystem.Run(`aws s3 rm ${SharedWorkspaceLocking.workspaceRoot}/${workspace}/${file}`, false, true);
return !SharedWorkspaceLocking.HasWorkspaceLock(workspace, runId); return !SharedWorkspaceLocking.HasWorkspaceLock(workspace, runId);
} }
@ -99,7 +108,9 @@ export class SharedWorkspaceLocking {
if (!(await SharedWorkspaceLocking.DoesWorkspaceExist(workspace))) { if (!(await SharedWorkspaceLocking.DoesWorkspaceExist(workspace))) {
return false; return false;
} }
const files = await SharedWorkspaceLocking.ReadLines(`aws s3 ls s3://game-ci-test-storage/locks/${workspace}/`); const files = await SharedWorkspaceLocking.ReadLines(
`aws s3 ls ${SharedWorkspaceLocking.workspaceRoot}/${workspace}/`,
);
// 1 Because we expect 1 workspace file to exist in every workspace folder // 1 Because we expect 1 workspace file to exist in every workspace folder
return files.length > 1; return files.length > 1;
@ -109,7 +120,7 @@ export class SharedWorkspaceLocking {
const file = `${Date.now()}_workspace`; const file = `${Date.now()}_workspace`;
fs.writeFileSync(file, ''); fs.writeFileSync(file, '');
await CloudRunnerSystem.Run( await CloudRunnerSystem.Run(
`aws s3 cp ./${file} s3://game-ci-test-storage/locks/${workspace}/${file}`, `aws s3 cp ./${file} ${SharedWorkspaceLocking.workspaceRoot}/${workspace}/${file}`,
false, false,
true, true,
); );

View File

@ -31,6 +31,8 @@ export class BuildAutomationWorkflow implements WorkflowInterface {
CloudRunner.buildParameters.buildGuid, CloudRunner.buildParameters.buildGuid,
)) || CloudRunner.buildParameters.buildGuid; )) || CloudRunner.buildParameters.buildGuid;
process.env.LOCKED_WORKSPACE = workspace;
CloudRunnerLogger.logLine(`Using workspace ${workspace}`); CloudRunnerLogger.logLine(`Using workspace ${workspace}`);
cloudRunnerStepState.environment = [ cloudRunnerStepState.environment = [
...cloudRunnerStepState.environment, ...cloudRunnerStepState.environment,