Further improvement of remote-cli, serialize all build params and setup on remote cli
parent
08810c4d51
commit
b10ad0165c
|
|
@ -95,16 +95,16 @@ const options = program.opts();
|
||||||
process.env.AWS_REGION = options.region;
|
process.env.AWS_REGION = options.region;
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log(`Entrypoint: ${options.mode}`);
|
console.log(`Entrypoint: ${options.mode}`);
|
||||||
|
model_1.Input.githubEnabled = false;
|
||||||
switch (options.mode) {
|
switch (options.mode) {
|
||||||
case 'cli':
|
case 'cli':
|
||||||
model_1.Input.githubEnabled = false;
|
|
||||||
runCli();
|
runCli();
|
||||||
break;
|
break;
|
||||||
case 'remote-cli':
|
case 'remote-cli':
|
||||||
model_1.Input.githubEnabled = false;
|
|
||||||
runRemoteCli(options);
|
runRemoteCli(options);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
model_1.Input.githubEnabled = true;
|
||||||
runMain();
|
runMain();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -1955,10 +1955,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.RemoteClientCli = void 0;
|
exports.RemoteClientCli = void 0;
|
||||||
const download_repository_1 = __webpack_require__(42996);
|
const cloud_runner_state_1 = __webpack_require__(70912);
|
||||||
|
const download_repository_1 = __webpack_require__(20477);
|
||||||
class RemoteClientCli {
|
class RemoteClientCli {
|
||||||
static RunRemoteClient(options) {
|
static RunRemoteClient(options) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
const buff = Buffer.from(process.env.SERIALIZED_BUILD_PARAMS || '', 'base64');
|
||||||
|
const text = buff.toString('ascii');
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(text);
|
||||||
|
cloud_runner_state_1.CloudRunnerState.setup(JSON.parse(text));
|
||||||
switch (options.remoteClientState) {
|
switch (options.remoteClientState) {
|
||||||
default:
|
default:
|
||||||
yield download_repository_1.DownloadRepository.run();
|
yield download_repository_1.DownloadRepository.run();
|
||||||
|
|
@ -1970,6 +1976,57 @@ class RemoteClientCli {
|
||||||
exports.RemoteClientCli = RemoteClientCli;
|
exports.RemoteClientCli = RemoteClientCli;
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 20477:
|
||||||
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
|
});
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
|
exports.DownloadRepository = void 0;
|
||||||
|
const { exec } = __webpack_require__(63129);
|
||||||
|
class DownloadRepository {
|
||||||
|
static run() {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
yield new Promise((promise) => {
|
||||||
|
exec(`
|
||||||
|
echo "test"
|
||||||
|
apk update -q
|
||||||
|
apk add unzip zip git-lfs jq tree -q
|
||||||
|
`, (error, stdout, stderr) => {
|
||||||
|
if (error) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(`error: ${error.message}`);
|
||||||
|
promise();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (stderr) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(`stderr: ${stderr}`);
|
||||||
|
promise();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(`stdout: ${stdout}`);
|
||||||
|
promise();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.DownloadRepository = DownloadRepository;
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 91311:
|
/***/ 91311:
|
||||||
|
|
@ -2081,11 +2138,47 @@ const cloud_runner_namespace_1 = __importDefault(__webpack_require__(63287));
|
||||||
class CloudRunnerState {
|
class CloudRunnerState {
|
||||||
static setup(buildParameters) {
|
static setup(buildParameters) {
|
||||||
CloudRunnerState.buildParams = buildParameters;
|
CloudRunnerState.buildParams = buildParameters;
|
||||||
CloudRunnerState.buildGuid = cloud_runner_namespace_1.default.generateBuildName(CloudRunnerState.readRunNumber(), buildParameters.platform);
|
if (CloudRunnerState.buildGuid === undefined) {
|
||||||
CloudRunnerState.setupBranchName();
|
CloudRunnerState.buildGuid = cloud_runner_namespace_1.default.generateBuildName(CloudRunnerState.readRunNumber(), buildParameters.platform);
|
||||||
CloudRunnerState.setupFolderVariables();
|
}
|
||||||
CloudRunnerState.setupDefaultSecrets();
|
CloudRunnerState.setupDefaultSecrets();
|
||||||
}
|
}
|
||||||
|
static get branchName() {
|
||||||
|
return CloudRunnerState.buildParams.branch;
|
||||||
|
}
|
||||||
|
static get buildPathFull() {
|
||||||
|
return `/${CloudRunnerState.buildVolumeFolder}/${CloudRunnerState.buildGuid}`;
|
||||||
|
}
|
||||||
|
static get builderPathFull() {
|
||||||
|
return `${CloudRunnerState.buildPathFull}/builder`;
|
||||||
|
}
|
||||||
|
static get steamPathFull() {
|
||||||
|
return `${CloudRunnerState.buildPathFull}/steam`;
|
||||||
|
}
|
||||||
|
static get repoPathFull() {
|
||||||
|
return `${CloudRunnerState.buildPathFull}/${CloudRunnerState.repositoryFolder}`;
|
||||||
|
}
|
||||||
|
static get projectPathFull() {
|
||||||
|
return `${CloudRunnerState.repoPathFull}/${CloudRunnerState.buildParams.projectPath}`;
|
||||||
|
}
|
||||||
|
static get libraryFolderFull() {
|
||||||
|
return `${CloudRunnerState.projectPathFull}/Library`;
|
||||||
|
}
|
||||||
|
static get cacheFolderFull() {
|
||||||
|
return `/${CloudRunnerState.buildVolumeFolder}/${CloudRunnerState.cacheFolder}/${CloudRunnerState.branchName}`;
|
||||||
|
}
|
||||||
|
static get lfsDirectory() {
|
||||||
|
return `${CloudRunnerState.repoPathFull}/.git/lfs`;
|
||||||
|
}
|
||||||
|
static get purgeRemoteCaching() {
|
||||||
|
return process.env.PURGE_REMOTE_BUILDER_CACHE !== undefined;
|
||||||
|
}
|
||||||
|
static get unityBuilderRepoUrl() {
|
||||||
|
return `https://${CloudRunnerState.buildParams.githubToken}@github.com/game-ci/unity-builder.git`;
|
||||||
|
}
|
||||||
|
static get targetBuildRepoUrl() {
|
||||||
|
return `https://${CloudRunnerState.buildParams.githubToken}@github.com/${process.env.GITHUB_REPOSITORY}.git`;
|
||||||
|
}
|
||||||
static readBuildEnvironmentVariables() {
|
static readBuildEnvironmentVariables() {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
|
|
@ -2141,8 +2234,8 @@ class CloudRunnerState {
|
||||||
value: CloudRunnerState.buildParams.androidKeyaliasName,
|
value: CloudRunnerState.buildParams.androidKeyaliasName,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'SERIALIZED_STATE',
|
name: 'SERIALIZED_BUILD_PARAMS',
|
||||||
value: JSON.stringify(CloudRunnerState),
|
value: Buffer.from(JSON.stringify(CloudRunnerState.buildParams)).toString('base64'),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
@ -2164,22 +2257,6 @@ class CloudRunnerState {
|
||||||
}
|
}
|
||||||
return runNumber;
|
return runNumber;
|
||||||
}
|
}
|
||||||
static setupFolderVariables() {
|
|
||||||
CloudRunnerState.buildPathFull = `/${CloudRunnerState.buildVolumeFolder}/${CloudRunnerState.buildGuid}`;
|
|
||||||
CloudRunnerState.builderPathFull = `${CloudRunnerState.buildPathFull}/builder`;
|
|
||||||
CloudRunnerState.steamPathFull = `${CloudRunnerState.buildPathFull}/steam`;
|
|
||||||
CloudRunnerState.repoPathFull = `${CloudRunnerState.buildPathFull}/${CloudRunnerState.repositoryFolder}`;
|
|
||||||
CloudRunnerState.projectPathFull = `${CloudRunnerState.repoPathFull}/${CloudRunnerState.buildParams.projectPath}`;
|
|
||||||
CloudRunnerState.libraryFolderFull = `${CloudRunnerState.projectPathFull}/Library`;
|
|
||||||
CloudRunnerState.cacheFolderFull = `/${CloudRunnerState.buildVolumeFolder}/${CloudRunnerState.cacheFolder}/${CloudRunnerState.branchName}`;
|
|
||||||
CloudRunnerState.lfsDirectory = `${CloudRunnerState.repoPathFull}/.git/lfs`;
|
|
||||||
CloudRunnerState.purgeRemoteCaching = process.env.PURGE_REMOTE_BUILDER_CACHE !== undefined;
|
|
||||||
CloudRunnerState.unityBuilderRepoUrl = `https://${CloudRunnerState.buildParams.githubToken}@github.com/game-ci/unity-builder.git`;
|
|
||||||
CloudRunnerState.targetBuildRepoUrl = `https://${CloudRunnerState.buildParams.githubToken}@github.com/${process.env.GITHUB_REPOSITORY}.git`;
|
|
||||||
}
|
|
||||||
static setupBranchName() {
|
|
||||||
CloudRunnerState.branchName = CloudRunnerState.buildParams.branch;
|
|
||||||
}
|
|
||||||
static setupDefaultSecrets() {
|
static setupDefaultSecrets() {
|
||||||
CloudRunnerState.defaultSecrets = [
|
CloudRunnerState.defaultSecrets = [
|
||||||
{
|
{
|
||||||
|
|
@ -2460,57 +2537,6 @@ class DownloadRepositoryStep {
|
||||||
exports.DownloadRepositoryStep = DownloadRepositoryStep;
|
exports.DownloadRepositoryStep = DownloadRepositoryStep;
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 42996:
|
|
||||||
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
||||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
||||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
||||||
});
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
||||||
exports.DownloadRepository = void 0;
|
|
||||||
const { exec } = __webpack_require__(63129);
|
|
||||||
class DownloadRepository {
|
|
||||||
static run() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
yield new Promise((promise) => {
|
|
||||||
exec(`
|
|
||||||
echo "test"
|
|
||||||
apk update -q
|
|
||||||
apk add unzip zip git-lfs jq tree -q
|
|
||||||
`, (error, stdout, stderr) => {
|
|
||||||
if (error) {
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log(`error: ${error.message}`);
|
|
||||||
promise();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (stderr) {
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log(`stderr: ${stderr}`);
|
|
||||||
promise();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log(`stdout: ${stdout}`);
|
|
||||||
promise();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.DownloadRepository = DownloadRepository;
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 94655:
|
/***/ 94655:
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -59,17 +59,17 @@ process.env.AWS_REGION = options.region;
|
||||||
|
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log(`Entrypoint: ${options.mode}`);
|
console.log(`Entrypoint: ${options.mode}`);
|
||||||
|
Input.githubEnabled = false;
|
||||||
|
|
||||||
switch (options.mode) {
|
switch (options.mode) {
|
||||||
case 'cli':
|
case 'cli':
|
||||||
Input.githubEnabled = false;
|
|
||||||
runCli();
|
runCli();
|
||||||
break;
|
break;
|
||||||
case 'remote-cli':
|
case 'remote-cli':
|
||||||
Input.githubEnabled = false;
|
|
||||||
runRemoteCli(options);
|
runRemoteCli(options);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
Input.githubEnabled = true;
|
||||||
runMain();
|
runMain();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,13 @@
|
||||||
import { DownloadRepository } from '../steps/remote-steps/download-repository';
|
import { CloudRunnerState } from '../state/cloud-runner-state';
|
||||||
|
import { DownloadRepository } from './remote-steps/download-repository';
|
||||||
|
|
||||||
export class RemoteClientCli {
|
export class RemoteClientCli {
|
||||||
static async RunRemoteClient(options) {
|
static async RunRemoteClient(options) {
|
||||||
|
const buff = Buffer.from(process.env.SERIALIZED_BUILD_PARAMS || '', 'base64');
|
||||||
|
const text = buff.toString('ascii');
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(text);
|
||||||
|
CloudRunnerState.setup(JSON.parse(text));
|
||||||
switch (options.remoteClientState) {
|
switch (options.remoteClientState) {
|
||||||
default:
|
default:
|
||||||
await DownloadRepository.run();
|
await DownloadRepository.run();
|
||||||
|
|
|
||||||
|
|
@ -9,30 +9,54 @@ import CloudRunnerSecret from '../services/cloud-runner-secret';
|
||||||
export class CloudRunnerState {
|
export class CloudRunnerState {
|
||||||
static setup(buildParameters: BuildParameters) {
|
static setup(buildParameters: BuildParameters) {
|
||||||
CloudRunnerState.buildParams = buildParameters;
|
CloudRunnerState.buildParams = buildParameters;
|
||||||
CloudRunnerState.buildGuid = CloudRunnerNamespace.generateBuildName(
|
if (CloudRunnerState.buildGuid === undefined) {
|
||||||
CloudRunnerState.readRunNumber(),
|
CloudRunnerState.buildGuid = CloudRunnerNamespace.generateBuildName(
|
||||||
buildParameters.platform,
|
CloudRunnerState.readRunNumber(),
|
||||||
);
|
buildParameters.platform,
|
||||||
CloudRunnerState.setupBranchName();
|
);
|
||||||
CloudRunnerState.setupFolderVariables();
|
}
|
||||||
CloudRunnerState.setupDefaultSecrets();
|
CloudRunnerState.setupDefaultSecrets();
|
||||||
}
|
}
|
||||||
public static CloudRunnerProviderPlatform: CloudRunnerProviderInterface;
|
public static CloudRunnerProviderPlatform: CloudRunnerProviderInterface;
|
||||||
public static buildParams: BuildParameters;
|
public static buildParams: BuildParameters;
|
||||||
public static defaultSecrets: CloudRunnerSecret[];
|
public static defaultSecrets: CloudRunnerSecret[];
|
||||||
public static buildGuid: string;
|
public static buildGuid: string;
|
||||||
public static branchName: string;
|
public static get branchName(): string {
|
||||||
public static buildPathFull: string;
|
return CloudRunnerState.buildParams.branch;
|
||||||
public static builderPathFull: string;
|
}
|
||||||
public static steamPathFull: string;
|
public static get buildPathFull(): string {
|
||||||
public static repoPathFull: string;
|
return `/${CloudRunnerState.buildVolumeFolder}/${CloudRunnerState.buildGuid}`;
|
||||||
public static projectPathFull: string;
|
}
|
||||||
public static libraryFolderFull: string;
|
public static get builderPathFull(): string {
|
||||||
public static cacheFolderFull: string;
|
return `${CloudRunnerState.buildPathFull}/builder`;
|
||||||
public static lfsDirectory: string;
|
}
|
||||||
public static purgeRemoteCaching: boolean;
|
public static get steamPathFull(): string {
|
||||||
public static unityBuilderRepoUrl: string;
|
return `${CloudRunnerState.buildPathFull}/steam`;
|
||||||
public static targetBuildRepoUrl: string;
|
}
|
||||||
|
public static get repoPathFull(): string {
|
||||||
|
return `${CloudRunnerState.buildPathFull}/${CloudRunnerState.repositoryFolder}`;
|
||||||
|
}
|
||||||
|
public static get projectPathFull(): string {
|
||||||
|
return `${CloudRunnerState.repoPathFull}/${CloudRunnerState.buildParams.projectPath}`;
|
||||||
|
}
|
||||||
|
public static get libraryFolderFull(): string {
|
||||||
|
return `${CloudRunnerState.projectPathFull}/Library`;
|
||||||
|
}
|
||||||
|
public static get cacheFolderFull(): string {
|
||||||
|
return `/${CloudRunnerState.buildVolumeFolder}/${CloudRunnerState.cacheFolder}/${CloudRunnerState.branchName}`;
|
||||||
|
}
|
||||||
|
public static get lfsDirectory(): string {
|
||||||
|
return `${CloudRunnerState.repoPathFull}/.git/lfs`;
|
||||||
|
}
|
||||||
|
public static get purgeRemoteCaching(): boolean {
|
||||||
|
return process.env.PURGE_REMOTE_BUILDER_CACHE !== undefined;
|
||||||
|
}
|
||||||
|
public static get unityBuilderRepoUrl(): string {
|
||||||
|
return `https://${CloudRunnerState.buildParams.githubToken}@github.com/game-ci/unity-builder.git`;
|
||||||
|
}
|
||||||
|
public static get targetBuildRepoUrl(): string {
|
||||||
|
return `https://${CloudRunnerState.buildParams.githubToken}@github.com/${process.env.GITHUB_REPOSITORY}.git`;
|
||||||
|
}
|
||||||
public static readonly defaultGitShaEnvironmentVariable = [
|
public static readonly defaultGitShaEnvironmentVariable = [
|
||||||
{
|
{
|
||||||
name: 'GITHUB_SHA',
|
name: 'GITHUB_SHA',
|
||||||
|
|
@ -99,8 +123,8 @@ export class CloudRunnerState {
|
||||||
value: CloudRunnerState.buildParams.androidKeyaliasName,
|
value: CloudRunnerState.buildParams.androidKeyaliasName,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'SERIALIZED_STATE',
|
name: 'SERIALIZED_BUILD_PARAMS',
|
||||||
value: JSON.stringify(CloudRunnerState),
|
value: Buffer.from(JSON.stringify(CloudRunnerState.buildParams)).toString('base64'),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
@ -127,24 +151,6 @@ export class CloudRunnerState {
|
||||||
return runNumber;
|
return runNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static setupFolderVariables() {
|
|
||||||
CloudRunnerState.buildPathFull = `/${CloudRunnerState.buildVolumeFolder}/${CloudRunnerState.buildGuid}`;
|
|
||||||
CloudRunnerState.builderPathFull = `${CloudRunnerState.buildPathFull}/builder`;
|
|
||||||
CloudRunnerState.steamPathFull = `${CloudRunnerState.buildPathFull}/steam`;
|
|
||||||
CloudRunnerState.repoPathFull = `${CloudRunnerState.buildPathFull}/${CloudRunnerState.repositoryFolder}`;
|
|
||||||
CloudRunnerState.projectPathFull = `${CloudRunnerState.repoPathFull}/${CloudRunnerState.buildParams.projectPath}`;
|
|
||||||
CloudRunnerState.libraryFolderFull = `${CloudRunnerState.projectPathFull}/Library`;
|
|
||||||
CloudRunnerState.cacheFolderFull = `/${CloudRunnerState.buildVolumeFolder}/${CloudRunnerState.cacheFolder}/${CloudRunnerState.branchName}`;
|
|
||||||
CloudRunnerState.lfsDirectory = `${CloudRunnerState.repoPathFull}/.git/lfs`;
|
|
||||||
CloudRunnerState.purgeRemoteCaching = process.env.PURGE_REMOTE_BUILDER_CACHE !== undefined;
|
|
||||||
CloudRunnerState.unityBuilderRepoUrl = `https://${CloudRunnerState.buildParams.githubToken}@github.com/game-ci/unity-builder.git`;
|
|
||||||
CloudRunnerState.targetBuildRepoUrl = `https://${CloudRunnerState.buildParams.githubToken}@github.com/${process.env.GITHUB_REPOSITORY}.git`;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static setupBranchName() {
|
|
||||||
CloudRunnerState.branchName = CloudRunnerState.buildParams.branch;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static setupDefaultSecrets() {
|
public static setupDefaultSecrets() {
|
||||||
CloudRunnerState.defaultSecrets = [
|
CloudRunnerState.defaultSecrets = [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue