Better locking

pull/461/head
Frostebite 2022-09-29 22:03:16 +01:00
parent 1beee459f2
commit d4c5218b39
5 changed files with 32 additions and 4 deletions

16
dist/index.js vendored
View File

@ -635,6 +635,11 @@ class SharedWorkspaceLocking {
return yield SharedWorkspaceLocking.CreateLockableWorkspace(workspaceIfCreated); return yield SharedWorkspaceLocking.CreateLockableWorkspace(workspaceIfCreated);
}); });
} }
static DoesWorkspaceExist(workspace) {
return __awaiter(this, void 0, void 0, function* () {
return (yield SharedWorkspaceLocking.GetAllWorkspaces()).includes(workspace);
});
}
static GetFreeWorkspaces() { static GetFreeWorkspaces() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const result = []; const result = [];
@ -654,6 +659,9 @@ class SharedWorkspaceLocking {
} }
static GetAllLocks(workspace) { static GetAllLocks(workspace) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (!(yield SharedWorkspaceLocking.DoesWorkspaceExist(workspace))) {
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 s3://game-ci-test-storage/locks/${workspace}/`)).map((x) => x.replace(`/`, ``));
}); });
} }
@ -691,6 +699,9 @@ class SharedWorkspaceLocking {
} }
static HasWorkspaceLock(workspace) { static HasWorkspaceLock(workspace) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (!(yield SharedWorkspaceLocking.DoesWorkspaceExist(workspace))) {
return false;
}
cloud_runner_logger_1.default.log((yield cloud_runner_system_1.CloudRunnerSystem.Run(`aws s3 ls s3://game-ci-test-storage/locks/${workspace}/`, false, true)) cloud_runner_logger_1.default.log((yield cloud_runner_system_1.CloudRunnerSystem.Run(`aws s3 ls s3://game-ci-test-storage/locks/${workspace}/`, false, true))
.split('\n') .split('\n')
.map((x) => { .map((x) => {
@ -702,6 +713,9 @@ class SharedWorkspaceLocking {
} }
static IsWorkspaceLocked(workspace) { static IsWorkspaceLocked(workspace) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (!(yield SharedWorkspaceLocking.DoesWorkspaceExist(workspace))) {
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 s3://game-ci-test-storage/locks/${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;
@ -5015,7 +5029,7 @@ class BuildAutomationWorkflow {
cloud_runner_logger_1.default.log(baseImage.toString()); cloud_runner_logger_1.default.log(baseImage.toString());
cloud_runner_logger_1.default.logLine(` `); cloud_runner_logger_1.default.logLine(` `);
cloud_runner_logger_1.default.logLine('Starting build automation job'); cloud_runner_logger_1.default.logLine('Starting build automation job');
output += yield cloud_runner_1.default.Provider.runTask(cloud_runner_1.default.buildParameters.buildGuid, baseImage.toString(), BuildAutomationWorkflow.BuildWorkflow, `/${cloud_runner_folders_1.CloudRunnerFolders.buildVolumeFolder}`, `/${cloud_runner_folders_1.CloudRunnerFolders.buildVolumeFolder}/`, cloudRunnerStepState.environment, cloudRunnerStepState.secrets); output += yield cloud_runner_1.default.Provider.runTask(cloud_runner_1.default.buildParameters.buildGuid, baseImage.toString(), BuildAutomationWorkflow.BuildWorkflow, `/${cloud_runner_folders_1.CloudRunnerFolders.buildVolumeFolder}`, `/${cloud_runner_folders_1.CloudRunnerFolders.buildVolumeFolder}/`, [...cloudRunnerStepState.environment, { name: `LOCKED_WORKSPACE`, value: workspace }], cloudRunnerStepState.secrets);
if (!cloud_runner_1.default.buildParameters.isCliMode) if (!cloud_runner_1.default.buildParameters.isCliMode)
core.endGroup(); core.endGroup();
cloud_runner_logger_1.default.logWithTime('Build time'); cloud_runner_logger_1.default.logWithTime('Build time');

2
dist/index.js.map vendored

File diff suppressed because one or more lines are too long

View File

@ -18,6 +18,10 @@ export class SharedWorkspaceLocking {
return await SharedWorkspaceLocking.CreateLockableWorkspace(workspaceIfCreated); return await SharedWorkspaceLocking.CreateLockableWorkspace(workspaceIfCreated);
} }
public static async DoesWorkspaceExist(workspace: string) {
return (await SharedWorkspaceLocking.GetAllWorkspaces()).includes(workspace);
}
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();
@ -35,6 +39,10 @@ export class SharedWorkspaceLocking {
); );
} }
public static async GetAllLocks(workspace: string): Promise<string[]> { public static async GetAllLocks(workspace: string): Promise<string[]> {
if (!(await SharedWorkspaceLocking.DoesWorkspaceExist(workspace))) {
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 (await SharedWorkspaceLocking.ReadLines(`aws s3 ls s3://game-ci-test-storage/locks/${workspace}/`)).map(
(x) => x.replace(`/`, ``), (x) => x.replace(`/`, ``),
); );
@ -77,6 +85,9 @@ export class SharedWorkspaceLocking {
return !SharedWorkspaceLocking.HasWorkspaceLock(workspace); return !SharedWorkspaceLocking.HasWorkspaceLock(workspace);
} }
public static async HasWorkspaceLock(workspace: string): Promise<boolean> { public static async HasWorkspaceLock(workspace: string): Promise<boolean> {
if (!(await SharedWorkspaceLocking.DoesWorkspaceExist(workspace))) {
return false;
}
CloudRunnerLogger.log( CloudRunnerLogger.log(
(await CloudRunnerSystem.Run(`aws s3 ls s3://game-ci-test-storage/locks/${workspace}/`, false, true)) (await CloudRunnerSystem.Run(`aws s3 ls s3://game-ci-test-storage/locks/${workspace}/`, false, true))
.split('\n') .split('\n')
@ -90,6 +101,9 @@ export class SharedWorkspaceLocking {
} }
public static async IsWorkspaceLocked(workspace: string): Promise<boolean> { public static async IsWorkspaceLocked(workspace: string): Promise<boolean> {
if (!(await SharedWorkspaceLocking.DoesWorkspaceExist(workspace))) {
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 s3://game-ci-test-storage/locks/${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

View File

@ -47,5 +47,5 @@ describe('Cloud Runner Locking', () => {
await SharedWorkspaceLocking.GetLockedWorkspace('test-workspace-2', uuidv4()), await SharedWorkspaceLocking.GetLockedWorkspace('test-workspace-2', uuidv4()),
)}`, )}`,
); );
}, 150000); }, 3000000);
}); });

View File

@ -55,7 +55,7 @@ export class BuildAutomationWorkflow implements WorkflowInterface {
BuildAutomationWorkflow.BuildWorkflow, BuildAutomationWorkflow.BuildWorkflow,
`/${CloudRunnerFolders.buildVolumeFolder}`, `/${CloudRunnerFolders.buildVolumeFolder}`,
`/${CloudRunnerFolders.buildVolumeFolder}/`, `/${CloudRunnerFolders.buildVolumeFolder}/`,
cloudRunnerStepState.environment, [...cloudRunnerStepState.environment, { name: `LOCKED_WORKSPACE`, value: workspace }],
cloudRunnerStepState.secrets, cloudRunnerStepState.secrets,
); );
if (!CloudRunner.buildParameters.isCliMode) core.endGroup(); if (!CloudRunner.buildParameters.isCliMode) core.endGroup();