* Enable noImplicitAny Add types to all implicit any variables Bump target to ES2020 for recent language features (optional chaining) Code cleanup Add debug configuration for vscode Remove autorun flag from jest to remove warning Bump packages to fix dependency version mismatch warning Changed @arkweid/lefthook to @evilmartians/lefthook as @arkweid/lefthook has been deprecated in favor of @evilmartians/lefthook Added concurrency groups to integrity check and build workflows. New commits to branches will cancel superseded runs on the same branch/pr Update imports to not use require syntax Use node packages (ie node:fs rather than fs) AndroidVersionCode is now a string rather than a number as it gets converted to a string when passed out of the system Reduce timeout for windows builds Remove 2020.1.17f1 from windows builds due to repeated license activation errors Update naming scheme of workflows for consistency Update build names so target platform and unity version aren't cut off by github actions UI * Add exclude to test matrix for 2022.2 on android until Unity bug is fixed --------- Co-authored-by: AndrewKahr <AndrewKahr@users.noreply.github.com>
117 lines
3.9 KiB
TypeScript
117 lines
3.9 KiB
TypeScript
import waitUntil from 'async-wait-until';
|
|
import * as core from '@actions/core';
|
|
import * as k8s from '@kubernetes/client-node';
|
|
import BuildParameters from '../../../build-parameters';
|
|
import CloudRunnerLogger from '../../services/cloud-runner-logger';
|
|
import { IncomingMessage } from 'node:http';
|
|
import GitHub from '../../../github';
|
|
|
|
class KubernetesStorage {
|
|
public static async createPersistentVolumeClaim(
|
|
buildParameters: BuildParameters,
|
|
pvcName: string,
|
|
kubeClient: k8s.CoreV1Api,
|
|
namespace: string,
|
|
) {
|
|
if (buildParameters.kubeVolume !== ``) {
|
|
CloudRunnerLogger.log(`Kube Volume was input was set ${buildParameters.kubeVolume} overriding ${pvcName}`);
|
|
pvcName = buildParameters.kubeVolume;
|
|
|
|
return;
|
|
}
|
|
const allPvc = (await kubeClient.listNamespacedPersistentVolumeClaim(namespace)).body.items;
|
|
const pvcList = allPvc.map((x) => x.metadata?.name);
|
|
CloudRunnerLogger.log(`Current PVCs in namespace ${namespace}`);
|
|
CloudRunnerLogger.log(JSON.stringify(pvcList, undefined, 4));
|
|
if (pvcList.includes(pvcName)) {
|
|
CloudRunnerLogger.log(`pvc ${pvcName} already exists`);
|
|
if (GitHub.githubInputEnabled) {
|
|
core.setOutput('volume', pvcName);
|
|
}
|
|
|
|
return;
|
|
}
|
|
CloudRunnerLogger.log(`Creating PVC ${pvcName} (does not exist)`);
|
|
const result = await KubernetesStorage.createPVC(pvcName, buildParameters, kubeClient, namespace);
|
|
await KubernetesStorage.handleResult(result, kubeClient, namespace, pvcName);
|
|
}
|
|
|
|
public static async getPVCPhase(kubeClient: k8s.CoreV1Api, name: string, namespace: string) {
|
|
try {
|
|
return (await kubeClient.readNamespacedPersistentVolumeClaim(name, namespace)).body.status?.phase;
|
|
} catch (error) {
|
|
core.error('Failed to get PVC phase');
|
|
core.error(JSON.stringify(error, undefined, 4));
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
public static async watchUntilPVCNotPending(kubeClient: k8s.CoreV1Api, name: string, namespace: string) {
|
|
try {
|
|
CloudRunnerLogger.log(`watch Until PVC Not Pending ${name} ${namespace}`);
|
|
CloudRunnerLogger.log(`${await this.getPVCPhase(kubeClient, name, namespace)}`);
|
|
await waitUntil(
|
|
async () => {
|
|
return (await this.getPVCPhase(kubeClient, name, namespace)) === 'Pending';
|
|
},
|
|
{
|
|
timeout: 750000,
|
|
intervalBetweenAttempts: 15000,
|
|
},
|
|
);
|
|
} catch (error: any) {
|
|
core.error('Failed to watch PVC');
|
|
core.error(error.toString());
|
|
core.error(
|
|
`PVC Body: ${JSON.stringify(
|
|
(await kubeClient.readNamespacedPersistentVolumeClaim(name, namespace)).body,
|
|
undefined,
|
|
4,
|
|
)}`,
|
|
);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
private static async createPVC(
|
|
pvcName: string,
|
|
buildParameters: BuildParameters,
|
|
kubeClient: k8s.CoreV1Api,
|
|
namespace: string,
|
|
) {
|
|
const pvc = new k8s.V1PersistentVolumeClaim();
|
|
pvc.apiVersion = 'v1';
|
|
pvc.kind = 'PersistentVolumeClaim';
|
|
pvc.metadata = {
|
|
name: pvcName,
|
|
};
|
|
pvc.spec = {
|
|
accessModes: ['ReadWriteOnce'],
|
|
storageClassName: buildParameters.kubeStorageClass === '' ? 'standard' : buildParameters.kubeStorageClass,
|
|
resources: {
|
|
requests: {
|
|
storage: buildParameters.kubeVolumeSize,
|
|
},
|
|
},
|
|
};
|
|
const result = await kubeClient.createNamespacedPersistentVolumeClaim(namespace, pvc);
|
|
|
|
return result;
|
|
}
|
|
|
|
private static async handleResult(
|
|
result: { response: IncomingMessage; body: k8s.V1PersistentVolumeClaim },
|
|
kubeClient: k8s.CoreV1Api,
|
|
namespace: string,
|
|
pvcName: string,
|
|
) {
|
|
const name = result.body.metadata?.name || '';
|
|
CloudRunnerLogger.log(`PVC ${name} created`);
|
|
await this.watchUntilPVCNotPending(kubeClient, name, namespace);
|
|
CloudRunnerLogger.log(`PVC ${name} is ready and not pending`);
|
|
core.setOutput('volume', pvcName);
|
|
}
|
|
}
|
|
|
|
export default KubernetesStorage;
|