Custom step file support
parent
9fe9233a6a
commit
b5c63e451d
|
|
@ -4259,7 +4259,7 @@ class RemoteClient {
|
||||||
const fileContentsObject = yaml_1.default.parse(fileContents.toString());
|
const fileContentsObject = yaml_1.default.parse(fileContents.toString());
|
||||||
if (fileContentsObject.hook === hookLifecycle) {
|
if (fileContentsObject.hook === hookLifecycle) {
|
||||||
remote_client_logger_1.RemoteClientLogger.log(`Active Hook File ${file} contents: ${fileContents}`);
|
remote_client_logger_1.RemoteClientLogger.log(`Active Hook File ${file} contents: ${fileContents}`);
|
||||||
yield cloud_runner_system_1.CloudRunnerSystem.Run(fileContents);
|
yield cloud_runner_system_1.CloudRunnerSystem.Run(fileContentsObject.commands);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -4377,6 +4377,148 @@ class Hook {
|
||||||
exports.Hook = Hook;
|
exports.Hook = Hook;
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 96455:
|
||||||
|
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||||
|
}) : (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
o[k2] = m[k];
|
||||||
|
}));
|
||||||
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||||
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||||
|
}) : function(o, v) {
|
||||||
|
o["default"] = v;
|
||||||
|
});
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||||
|
__setModuleDefault(result, mod);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
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());
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
|
exports.CustomStep = exports.CloudRunnerCustomSteps = void 0;
|
||||||
|
const yaml_1 = __importDefault(__nccwpck_require__(44603));
|
||||||
|
const cloud_runner_1 = __importDefault(__nccwpck_require__(79144));
|
||||||
|
const core = __importStar(__nccwpck_require__(42186));
|
||||||
|
const custom_workflow_1 = __nccwpck_require__(3786);
|
||||||
|
const remote_client_logger_1 = __nccwpck_require__(59412);
|
||||||
|
const path_1 = __importDefault(__nccwpck_require__(71017));
|
||||||
|
const fs = __importStar(__nccwpck_require__(57147));
|
||||||
|
const cloud_runner_folders_1 = __nccwpck_require__(13527);
|
||||||
|
const cloud_runner_logger_1 = __importDefault(__nccwpck_require__(22855));
|
||||||
|
const input_1 = __importDefault(__nccwpck_require__(91933));
|
||||||
|
class CloudRunnerCustomSteps {
|
||||||
|
static GetCustomStepsFromFiles(hookLifecycle) {
|
||||||
|
const results = [];
|
||||||
|
remote_client_logger_1.RemoteClientLogger.log(`GetCustomStepFiles: ${hookLifecycle}`);
|
||||||
|
const gameCiCustomStepsPath = path_1.default.join(cloud_runner_folders_1.CloudRunnerFolders.repoPathAbsolute, `game-ci`, `steps`);
|
||||||
|
const files = fs.readdirSync(gameCiCustomStepsPath);
|
||||||
|
for (const file of files) {
|
||||||
|
const fileContents = fs.readFileSync(path_1.default.join(gameCiCustomStepsPath, file), `utf8`);
|
||||||
|
const fileContentsObject = yaml_1.default.parse(fileContents.toString());
|
||||||
|
if (fileContentsObject.hook === hookLifecycle) {
|
||||||
|
remote_client_logger_1.RemoteClientLogger.log(`Active Step File ${file} contents: ${fileContents}`);
|
||||||
|
results.push(...CloudRunnerCustomSteps.ParseSteps(fileContents));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
static ParseSteps(steps) {
|
||||||
|
let object;
|
||||||
|
try {
|
||||||
|
if (cloud_runner_1.default.buildParameters.cloudRunnerIntegrationTests) {
|
||||||
|
cloud_runner_logger_1.default.log(`Parsing build steps: ${steps}`);
|
||||||
|
}
|
||||||
|
object = yaml_1.default.parse(steps);
|
||||||
|
if (object === undefined) {
|
||||||
|
throw new Error(`Failed to parse ${steps}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
cloud_runner_logger_1.default.log(`failed to parse a custom job "${steps}"`);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
for (const step of object) {
|
||||||
|
step.secrets = step.secrets.map((x) => {
|
||||||
|
return {
|
||||||
|
ParameterKey: x.name,
|
||||||
|
EnvironmentVariable: input_1.default.ToEnvVarFormat(x.name),
|
||||||
|
ParameterValue: x.value,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
static RunPostBuildSteps(cloudRunnerStepState) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
let output = ``;
|
||||||
|
let steps = [];
|
||||||
|
if (cloud_runner_1.default.buildParameters.postBuildSteps !== '') {
|
||||||
|
steps = CloudRunnerCustomSteps.ParseSteps(cloud_runner_1.default.buildParameters.postBuildSteps);
|
||||||
|
}
|
||||||
|
const fileSteps = CloudRunnerCustomSteps.GetCustomStepsFromFiles(`after`);
|
||||||
|
if (fileSteps.length > 0) {
|
||||||
|
steps = [...steps, ...fileSteps];
|
||||||
|
}
|
||||||
|
if (steps.length > 0) {
|
||||||
|
if (!cloud_runner_1.default.buildParameters.isCliMode)
|
||||||
|
core.startGroup('post build steps');
|
||||||
|
output += yield custom_workflow_1.CustomWorkflow.runCustomJob(steps, cloudRunnerStepState.environment, cloudRunnerStepState.secrets);
|
||||||
|
if (!cloud_runner_1.default.buildParameters.isCliMode)
|
||||||
|
core.endGroup();
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
static RunPreBuildSteps(cloudRunnerStepState) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
let output = ``;
|
||||||
|
let steps = [];
|
||||||
|
if (cloud_runner_1.default.buildParameters.preBuildSteps !== '') {
|
||||||
|
steps = CloudRunnerCustomSteps.ParseSteps(cloud_runner_1.default.buildParameters.preBuildSteps);
|
||||||
|
}
|
||||||
|
steps = [...steps, ...CloudRunnerCustomSteps.GetCustomStepsFromFiles(`before`)];
|
||||||
|
if (steps.length > 0) {
|
||||||
|
if (!cloud_runner_1.default.buildParameters.isCliMode)
|
||||||
|
core.startGroup('pre build steps');
|
||||||
|
output += yield custom_workflow_1.CustomWorkflow.runCustomJob(steps, cloudRunnerStepState.environment, cloudRunnerStepState.secrets);
|
||||||
|
if (!cloud_runner_1.default.buildParameters.isCliMode)
|
||||||
|
core.endGroup();
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.CloudRunnerCustomSteps = CloudRunnerCustomSteps;
|
||||||
|
class CustomStep {
|
||||||
|
constructor() {
|
||||||
|
this.secrets = new Array();
|
||||||
|
this.image = `ubuntu`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.CustomStep = CustomStep;
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 13527:
|
/***/ 13527:
|
||||||
|
|
@ -5083,13 +5225,13 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.BuildAutomationWorkflow = void 0;
|
exports.BuildAutomationWorkflow = void 0;
|
||||||
const cloud_runner_logger_1 = __importDefault(__nccwpck_require__(22855));
|
const cloud_runner_logger_1 = __importDefault(__nccwpck_require__(22855));
|
||||||
const cloud_runner_folders_1 = __nccwpck_require__(13527);
|
const cloud_runner_folders_1 = __nccwpck_require__(13527);
|
||||||
const custom_workflow_1 = __nccwpck_require__(3786);
|
|
||||||
const core = __importStar(__nccwpck_require__(42186));
|
const core = __importStar(__nccwpck_require__(42186));
|
||||||
const cloud_runner_custom_hooks_1 = __nccwpck_require__(58873);
|
const cloud_runner_custom_hooks_1 = __nccwpck_require__(58873);
|
||||||
const path_1 = __importDefault(__nccwpck_require__(71017));
|
const path_1 = __importDefault(__nccwpck_require__(71017));
|
||||||
const cloud_runner_1 = __importDefault(__nccwpck_require__(79144));
|
const cloud_runner_1 = __importDefault(__nccwpck_require__(79144));
|
||||||
const cloud_runner_options_1 = __importDefault(__nccwpck_require__(96552));
|
const cloud_runner_options_1 = __importDefault(__nccwpck_require__(96552));
|
||||||
const shared_workspace_locking_1 = __importDefault(__nccwpck_require__(67170));
|
const shared_workspace_locking_1 = __importDefault(__nccwpck_require__(67170));
|
||||||
|
const cloud_runner_custom_steps_1 = __nccwpck_require__(96455);
|
||||||
class BuildAutomationWorkflow {
|
class BuildAutomationWorkflow {
|
||||||
run(cloudRunnerStepState) {
|
run(cloudRunnerStepState) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
|
@ -5117,13 +5259,7 @@ class BuildAutomationWorkflow {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
let output = '';
|
let output = '';
|
||||||
if (cloud_runner_1.default.buildParameters.preBuildSteps !== '') {
|
output += cloud_runner_custom_steps_1.CloudRunnerCustomSteps.RunPreBuildSteps(cloudRunnerStepState);
|
||||||
if (!cloud_runner_1.default.buildParameters.isCliMode)
|
|
||||||
core.startGroup('pre build steps');
|
|
||||||
output += yield custom_workflow_1.CustomWorkflow.runCustomJob(cloud_runner_1.default.buildParameters.preBuildSteps, cloudRunnerStepState.environment, cloudRunnerStepState.secrets);
|
|
||||||
if (!cloud_runner_1.default.buildParameters.isCliMode)
|
|
||||||
core.endGroup();
|
|
||||||
}
|
|
||||||
cloud_runner_logger_1.default.logWithTime('Configurable pre build step(s) time');
|
cloud_runner_logger_1.default.logWithTime('Configurable pre build step(s) time');
|
||||||
if (!cloud_runner_1.default.buildParameters.isCliMode)
|
if (!cloud_runner_1.default.buildParameters.isCliMode)
|
||||||
core.startGroup('build');
|
core.startGroup('build');
|
||||||
|
|
@ -5134,13 +5270,7 @@ class BuildAutomationWorkflow {
|
||||||
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');
|
||||||
if (cloud_runner_1.default.buildParameters.postBuildSteps !== '') {
|
output += cloud_runner_custom_steps_1.CloudRunnerCustomSteps.RunPostBuildSteps(cloudRunnerStepState);
|
||||||
if (!cloud_runner_1.default.buildParameters.isCliMode)
|
|
||||||
core.startGroup('post build steps');
|
|
||||||
output += yield custom_workflow_1.CustomWorkflow.runCustomJob(cloud_runner_1.default.buildParameters.postBuildSteps, cloudRunnerStepState.environment, cloudRunnerStepState.secrets);
|
|
||||||
if (!cloud_runner_1.default.buildParameters.isCliMode)
|
|
||||||
core.endGroup();
|
|
||||||
}
|
|
||||||
cloud_runner_logger_1.default.logWithTime('Configurable post build step(s) time');
|
cloud_runner_logger_1.default.logWithTime('Configurable post build step(s) time');
|
||||||
if (cloud_runner_options_1.default.retainWorkspaces) {
|
if (cloud_runner_options_1.default.retainWorkspaces) {
|
||||||
yield shared_workspace_locking_1.default.ReleaseWorkspace(`test-workspace-${cloud_runner_1.default.buildParameters.buildGuid}`, cloud_runner_1.default.buildParameters.buildGuid, cloud_runner_1.default.buildParameters);
|
yield shared_workspace_locking_1.default.ReleaseWorkspace(`test-workspace-${cloud_runner_1.default.buildParameters.buildGuid}`, cloud_runner_1.default.buildParameters.buildGuid, cloud_runner_1.default.buildParameters);
|
||||||
|
|
@ -5223,34 +5353,21 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.CustomWorkflow = void 0;
|
exports.CustomWorkflow = void 0;
|
||||||
const cloud_runner_logger_1 = __importDefault(__nccwpck_require__(22855));
|
const cloud_runner_logger_1 = __importDefault(__nccwpck_require__(22855));
|
||||||
const cloud_runner_folders_1 = __nccwpck_require__(13527);
|
const cloud_runner_folders_1 = __nccwpck_require__(13527);
|
||||||
const yaml_1 = __importDefault(__nccwpck_require__(44603));
|
|
||||||
const __1 = __nccwpck_require__(41359);
|
const __1 = __nccwpck_require__(41359);
|
||||||
|
const cloud_runner_custom_steps_1 = __nccwpck_require__(96455);
|
||||||
class CustomWorkflow {
|
class CustomWorkflow {
|
||||||
|
static runCustomJobFromString(buildSteps, environmentVariables, secrets) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
return yield CustomWorkflow.runCustomJob(cloud_runner_custom_steps_1.CloudRunnerCustomSteps.ParseSteps(buildSteps), environmentVariables, secrets);
|
||||||
|
});
|
||||||
|
}
|
||||||
static runCustomJob(buildSteps, environmentVariables, secrets) {
|
static runCustomJob(buildSteps, environmentVariables, secrets) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
try {
|
try {
|
||||||
cloud_runner_logger_1.default.log(`Cloud Runner is running in custom job mode`);
|
cloud_runner_logger_1.default.log(`Cloud Runner is running in custom job mode`);
|
||||||
if (__1.CloudRunner.buildParameters.cloudRunnerIntegrationTests) {
|
|
||||||
cloud_runner_logger_1.default.log(`Parsing build steps: ${buildSteps}`);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
buildSteps = yaml_1.default.parse(buildSteps);
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
cloud_runner_logger_1.default.log(`failed to parse a custom job "${buildSteps}"`);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
let output = '';
|
let output = '';
|
||||||
for (const step of buildSteps) {
|
for (const step of buildSteps) {
|
||||||
const stepSecrets = step.secrets.map((x) => {
|
output += yield __1.CloudRunner.Provider.runTask(__1.CloudRunner.buildParameters.buildGuid, step['image'], step['commands'], `/${cloud_runner_folders_1.CloudRunnerFolders.buildVolumeFolder}`, `/${cloud_runner_folders_1.CloudRunnerFolders.projectPathAbsolute}/`, environmentVariables, [...secrets, ...step.secrets]);
|
||||||
const secret = {
|
|
||||||
ParameterKey: x.name,
|
|
||||||
EnvironmentVariable: __1.Input.ToEnvVarFormat(x.name),
|
|
||||||
ParameterValue: x.value,
|
|
||||||
};
|
|
||||||
return secret;
|
|
||||||
});
|
|
||||||
output += yield __1.CloudRunner.Provider.runTask(__1.CloudRunner.buildParameters.buildGuid, step['image'], step['commands'], `/${cloud_runner_folders_1.CloudRunnerFolders.buildVolumeFolder}`, `/${cloud_runner_folders_1.CloudRunnerFolders.projectPathAbsolute}/`, environmentVariables, [...secrets, ...stepSecrets]);
|
|
||||||
}
|
}
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
@ -5293,7 +5410,7 @@ class WorkflowCompositionRoot {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
try {
|
try {
|
||||||
if (cloud_runner_1.default.buildParameters.customJob !== '') {
|
if (cloud_runner_1.default.buildParameters.customJob !== '') {
|
||||||
return yield custom_workflow_1.CustomWorkflow.runCustomJob(cloud_runner_1.default.buildParameters.customJob, cloudRunnerStepState.environment, cloudRunnerStepState.secrets);
|
return yield custom_workflow_1.CustomWorkflow.runCustomJobFromString(cloud_runner_1.default.buildParameters.customJob, cloudRunnerStepState.environment, cloudRunnerStepState.secrets);
|
||||||
}
|
}
|
||||||
return yield new build_automation_workflow_1.BuildAutomationWorkflow().run(new cloud_runner_step_state_1.CloudRunnerStepState(cloudRunnerStepState.image.toString(), cloudRunnerStepState.environment, cloudRunnerStepState.secrets));
|
return yield new build_automation_workflow_1.BuildAutomationWorkflow().run(new cloud_runner_step_state_1.CloudRunnerStepState(cloudRunnerStepState.image.toString(), cloudRunnerStepState.environment, cloudRunnerStepState.secrets));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,3 +1,3 @@
|
||||||
hook: after-build
|
hook: after-build
|
||||||
run: |
|
commands: |
|
||||||
echo "after-build test!"
|
echo "after-build hook test!"
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
hook: before-build
|
hook: before-build
|
||||||
run: |
|
commands: |
|
||||||
echo "before-build test!!"
|
echo "before-build hook test!!"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
hook: after-build
|
||||||
|
commands: |
|
||||||
|
echo "after-build step test!"
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
hook: before-build
|
||||||
|
commands: |
|
||||||
|
echo "before-build step test!"
|
||||||
|
|
@ -136,7 +136,7 @@ export class RemoteClient {
|
||||||
const fileContentsObject = YAML.parse(fileContents.toString());
|
const fileContentsObject = YAML.parse(fileContents.toString());
|
||||||
if (fileContentsObject.hook === hookLifecycle) {
|
if (fileContentsObject.hook === hookLifecycle) {
|
||||||
RemoteClientLogger.log(`Active Hook File ${file} contents: ${fileContents}`);
|
RemoteClientLogger.log(`Active Hook File ${file} contents: ${fileContents}`);
|
||||||
await CloudRunnerSystem.Run(fileContents);
|
await CloudRunnerSystem.Run(fileContentsObject.commands);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,108 @@
|
||||||
|
import YAML from 'yaml';
|
||||||
|
import CloudRunnerSecret from './cloud-runner-secret';
|
||||||
|
import CloudRunner from '../cloud-runner';
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
import { CustomWorkflow } from '../workflows/custom-workflow';
|
||||||
|
import { RemoteClientLogger } from '../remote-client/remote-client-logger';
|
||||||
|
import path from 'path';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import { CloudRunnerFolders } from './cloud-runner-folders';
|
||||||
|
import CloudRunnerLogger from './cloud-runner-logger';
|
||||||
|
import Input from '../../input';
|
||||||
|
|
||||||
|
export class CloudRunnerCustomSteps {
|
||||||
|
static GetCustomStepsFromFiles(hookLifecycle: string): CustomStep[] {
|
||||||
|
const results: CustomStep[] = [];
|
||||||
|
RemoteClientLogger.log(`GetCustomStepFiles: ${hookLifecycle}`);
|
||||||
|
const gameCiCustomStepsPath = path.join(CloudRunnerFolders.repoPathAbsolute, `game-ci`, `steps`);
|
||||||
|
const files = fs.readdirSync(gameCiCustomStepsPath);
|
||||||
|
for (const file of files) {
|
||||||
|
const fileContents = fs.readFileSync(path.join(gameCiCustomStepsPath, file), `utf8`);
|
||||||
|
const fileContentsObject = YAML.parse(fileContents.toString());
|
||||||
|
if (fileContentsObject.hook === hookLifecycle) {
|
||||||
|
RemoteClientLogger.log(`Active Step File ${file} contents: ${fileContents}`);
|
||||||
|
results.push(...CloudRunnerCustomSteps.ParseSteps(fileContents));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ParseSteps(steps: string): CustomStep[] {
|
||||||
|
let object: any;
|
||||||
|
try {
|
||||||
|
if (CloudRunner.buildParameters.cloudRunnerIntegrationTests) {
|
||||||
|
CloudRunnerLogger.log(`Parsing build steps: ${steps}`);
|
||||||
|
}
|
||||||
|
object = YAML.parse(steps);
|
||||||
|
if (object === undefined) {
|
||||||
|
throw new Error(`Failed to parse ${steps}`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
CloudRunnerLogger.log(`failed to parse a custom job "${steps}"`);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
for (const step of object) {
|
||||||
|
step.secrets = step.secrets.map((x) => {
|
||||||
|
return {
|
||||||
|
ParameterKey: x.name,
|
||||||
|
EnvironmentVariable: Input.ToEnvVarFormat(x.name),
|
||||||
|
ParameterValue: x.value,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async RunPostBuildSteps(cloudRunnerStepState) {
|
||||||
|
let output = ``;
|
||||||
|
let steps: CustomStep[] = [];
|
||||||
|
if (CloudRunner.buildParameters.postBuildSteps !== '') {
|
||||||
|
steps = CloudRunnerCustomSteps.ParseSteps(CloudRunner.buildParameters.postBuildSteps);
|
||||||
|
}
|
||||||
|
const fileSteps = CloudRunnerCustomSteps.GetCustomStepsFromFiles(`after`);
|
||||||
|
if (fileSteps.length > 0) {
|
||||||
|
steps = [...steps, ...fileSteps];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (steps.length > 0) {
|
||||||
|
if (!CloudRunner.buildParameters.isCliMode) core.startGroup('post build steps');
|
||||||
|
output += await CustomWorkflow.runCustomJob(
|
||||||
|
steps,
|
||||||
|
cloudRunnerStepState.environment,
|
||||||
|
cloudRunnerStepState.secrets,
|
||||||
|
);
|
||||||
|
if (!CloudRunner.buildParameters.isCliMode) core.endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
static async RunPreBuildSteps(cloudRunnerStepState) {
|
||||||
|
let output = ``;
|
||||||
|
let steps: CustomStep[] = [];
|
||||||
|
if (CloudRunner.buildParameters.preBuildSteps !== '') {
|
||||||
|
steps = CloudRunnerCustomSteps.ParseSteps(CloudRunner.buildParameters.preBuildSteps);
|
||||||
|
}
|
||||||
|
steps = [...steps, ...CloudRunnerCustomSteps.GetCustomStepsFromFiles(`before`)];
|
||||||
|
|
||||||
|
if (steps.length > 0) {
|
||||||
|
if (!CloudRunner.buildParameters.isCliMode) core.startGroup('pre build steps');
|
||||||
|
output += await CustomWorkflow.runCustomJob(
|
||||||
|
steps,
|
||||||
|
cloudRunnerStepState.environment,
|
||||||
|
cloudRunnerStepState.secrets,
|
||||||
|
);
|
||||||
|
if (!CloudRunner.buildParameters.isCliMode) core.endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export class CustomStep {
|
||||||
|
public commands;
|
||||||
|
public secrets: CloudRunnerSecret[] = new Array<CloudRunnerSecret>();
|
||||||
|
public name;
|
||||||
|
public image: string = `ubuntu`;
|
||||||
|
public hook!: string[];
|
||||||
|
}
|
||||||
|
|
@ -35,14 +35,19 @@ describe('Cloud Runner Custom Hooks', () => {
|
||||||
const build2ContainsBuildSucceeded = results2.includes('Build succeeded');
|
const build2ContainsBuildSucceeded = results2.includes('Build succeeded');
|
||||||
const build2ContainsPreBuildHookMessage = results2.includes('RunCustomHookFiles: before-build');
|
const build2ContainsPreBuildHookMessage = results2.includes('RunCustomHookFiles: before-build');
|
||||||
const build2ContainsPostBuildHookMessage = results2.includes('RunCustomHookFiles: after-build');
|
const build2ContainsPostBuildHookMessage = results2.includes('RunCustomHookFiles: after-build');
|
||||||
const build2ContainsPreBuildHookRunMessage = results2.includes('before-build test!');
|
const build2ContainsPreBuildHookRunMessage = results2.includes('before-build hook test!');
|
||||||
const build2ContainsPostBuildHookRunMessage = results2.includes('after-build test!');
|
const build2ContainsPostBuildHookRunMessage = results2.includes('after-build hook test!');
|
||||||
|
|
||||||
|
const build2ContainsPreBuildStepMessage = results2.includes('before-build step test!');
|
||||||
|
const build2ContainsPostBuildStepMessage = results2.includes('after-build step test!');
|
||||||
|
|
||||||
expect(build2ContainsBuildSucceeded).toBeTruthy();
|
expect(build2ContainsBuildSucceeded).toBeTruthy();
|
||||||
expect(build2ContainsPreBuildHookMessage).toBeTruthy();
|
expect(build2ContainsPreBuildHookMessage).toBeTruthy();
|
||||||
expect(build2ContainsPostBuildHookMessage).toBeTruthy();
|
expect(build2ContainsPostBuildHookMessage).toBeTruthy();
|
||||||
expect(build2ContainsPreBuildHookRunMessage).toBeTruthy();
|
expect(build2ContainsPreBuildHookRunMessage).toBeTruthy();
|
||||||
expect(build2ContainsPostBuildHookRunMessage).toBeTruthy();
|
expect(build2ContainsPostBuildHookRunMessage).toBeTruthy();
|
||||||
|
expect(build2ContainsPreBuildStepMessage).toBeTruthy();
|
||||||
|
expect(build2ContainsPostBuildStepMessage).toBeTruthy();
|
||||||
}, 10000000);
|
}, 10000000);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import CloudRunnerLogger from '../services/cloud-runner-logger';
|
import CloudRunnerLogger from '../services/cloud-runner-logger';
|
||||||
import { CloudRunnerFolders } from '../services/cloud-runner-folders';
|
import { CloudRunnerFolders } from '../services/cloud-runner-folders';
|
||||||
import { CloudRunnerStepState } from '../cloud-runner-step-state';
|
import { CloudRunnerStepState } from '../cloud-runner-step-state';
|
||||||
import { CustomWorkflow } from './custom-workflow';
|
|
||||||
import { WorkflowInterface } from './workflow-interface';
|
import { WorkflowInterface } from './workflow-interface';
|
||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
import { CloudRunnerCustomHooks } from '../services/cloud-runner-custom-hooks';
|
import { CloudRunnerCustomHooks } from '../services/cloud-runner-custom-hooks';
|
||||||
|
|
@ -9,6 +8,7 @@ import path from 'path';
|
||||||
import CloudRunner from '../cloud-runner';
|
import CloudRunner from '../cloud-runner';
|
||||||
import CloudRunnerOptions from '../cloud-runner-options';
|
import CloudRunnerOptions from '../cloud-runner-options';
|
||||||
import SharedWorkspaceLocking from '../../cli/shared-workspace-locking';
|
import SharedWorkspaceLocking from '../../cli/shared-workspace-locking';
|
||||||
|
import { CloudRunnerCustomSteps } from '../services/cloud-runner-custom-steps';
|
||||||
|
|
||||||
export class BuildAutomationWorkflow implements WorkflowInterface {
|
export class BuildAutomationWorkflow implements WorkflowInterface {
|
||||||
async run(cloudRunnerStepState: CloudRunnerStepState) {
|
async run(cloudRunnerStepState: CloudRunnerStepState) {
|
||||||
|
|
@ -43,15 +43,8 @@ export class BuildAutomationWorkflow implements WorkflowInterface {
|
||||||
}
|
}
|
||||||
|
|
||||||
let output = '';
|
let output = '';
|
||||||
if (CloudRunner.buildParameters.preBuildSteps !== '') {
|
|
||||||
if (!CloudRunner.buildParameters.isCliMode) core.startGroup('pre build steps');
|
output += CloudRunnerCustomSteps.RunPreBuildSteps(cloudRunnerStepState);
|
||||||
output += await CustomWorkflow.runCustomJob(
|
|
||||||
CloudRunner.buildParameters.preBuildSteps,
|
|
||||||
cloudRunnerStepState.environment,
|
|
||||||
cloudRunnerStepState.secrets,
|
|
||||||
);
|
|
||||||
if (!CloudRunner.buildParameters.isCliMode) core.endGroup();
|
|
||||||
}
|
|
||||||
CloudRunnerLogger.logWithTime('Configurable pre build step(s) time');
|
CloudRunnerLogger.logWithTime('Configurable pre build step(s) time');
|
||||||
|
|
||||||
if (!CloudRunner.buildParameters.isCliMode) core.startGroup('build');
|
if (!CloudRunner.buildParameters.isCliMode) core.startGroup('build');
|
||||||
|
|
@ -71,15 +64,7 @@ export class BuildAutomationWorkflow implements WorkflowInterface {
|
||||||
if (!CloudRunner.buildParameters.isCliMode) core.endGroup();
|
if (!CloudRunner.buildParameters.isCliMode) core.endGroup();
|
||||||
CloudRunnerLogger.logWithTime('Build time');
|
CloudRunnerLogger.logWithTime('Build time');
|
||||||
|
|
||||||
if (CloudRunner.buildParameters.postBuildSteps !== '') {
|
output += CloudRunnerCustomSteps.RunPostBuildSteps(cloudRunnerStepState);
|
||||||
if (!CloudRunner.buildParameters.isCliMode) core.startGroup('post build steps');
|
|
||||||
output += await CustomWorkflow.runCustomJob(
|
|
||||||
CloudRunner.buildParameters.postBuildSteps,
|
|
||||||
cloudRunnerStepState.environment,
|
|
||||||
cloudRunnerStepState.secrets,
|
|
||||||
);
|
|
||||||
if (!CloudRunner.buildParameters.isCliMode) core.endGroup();
|
|
||||||
}
|
|
||||||
CloudRunnerLogger.logWithTime('Configurable post build step(s) time');
|
CloudRunnerLogger.logWithTime('Configurable post build step(s) time');
|
||||||
|
|
||||||
if (CloudRunnerOptions.retainWorkspaces) {
|
if (CloudRunnerOptions.retainWorkspaces) {
|
||||||
|
|
|
||||||
|
|
@ -1,38 +1,32 @@
|
||||||
import CloudRunnerLogger from '../services/cloud-runner-logger';
|
import CloudRunnerLogger from '../services/cloud-runner-logger';
|
||||||
import CloudRunnerSecret from '../services/cloud-runner-secret';
|
import CloudRunnerSecret from '../services/cloud-runner-secret';
|
||||||
import { CloudRunnerFolders } from '../services/cloud-runner-folders';
|
import { CloudRunnerFolders } from '../services/cloud-runner-folders';
|
||||||
import YAML from 'yaml';
|
import { CloudRunner } from '../..';
|
||||||
import { CloudRunner, Input } from '../..';
|
|
||||||
import CloudRunnerEnvironmentVariable from '../services/cloud-runner-environment-variable';
|
import CloudRunnerEnvironmentVariable from '../services/cloud-runner-environment-variable';
|
||||||
|
import { CloudRunnerCustomSteps, CustomStep } from '../services/cloud-runner-custom-steps';
|
||||||
|
|
||||||
export class CustomWorkflow {
|
export class CustomWorkflow {
|
||||||
|
public static async runCustomJobFromString(
|
||||||
|
buildSteps: string,
|
||||||
|
environmentVariables: CloudRunnerEnvironmentVariable[],
|
||||||
|
secrets: CloudRunnerSecret[],
|
||||||
|
): Promise<string> {
|
||||||
|
return await CustomWorkflow.runCustomJob(
|
||||||
|
CloudRunnerCustomSteps.ParseSteps(buildSteps),
|
||||||
|
environmentVariables,
|
||||||
|
secrets,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public static async runCustomJob(
|
public static async runCustomJob(
|
||||||
buildSteps,
|
buildSteps: CustomStep[],
|
||||||
environmentVariables: CloudRunnerEnvironmentVariable[],
|
environmentVariables: CloudRunnerEnvironmentVariable[],
|
||||||
secrets: CloudRunnerSecret[],
|
secrets: CloudRunnerSecret[],
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
CloudRunnerLogger.log(`Cloud Runner is running in custom job mode`);
|
CloudRunnerLogger.log(`Cloud Runner is running in custom job mode`);
|
||||||
if (CloudRunner.buildParameters.cloudRunnerIntegrationTests) {
|
|
||||||
CloudRunnerLogger.log(`Parsing build steps: ${buildSteps}`);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
buildSteps = YAML.parse(buildSteps);
|
|
||||||
} catch (error) {
|
|
||||||
CloudRunnerLogger.log(`failed to parse a custom job "${buildSteps}"`);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
let output = '';
|
let output = '';
|
||||||
for (const step of buildSteps) {
|
for (const step of buildSteps) {
|
||||||
const stepSecrets: CloudRunnerSecret[] = step.secrets.map((x) => {
|
|
||||||
const secret: CloudRunnerSecret = {
|
|
||||||
ParameterKey: x.name,
|
|
||||||
EnvironmentVariable: Input.ToEnvVarFormat(x.name),
|
|
||||||
ParameterValue: x.value,
|
|
||||||
};
|
|
||||||
|
|
||||||
return secret;
|
|
||||||
});
|
|
||||||
output += await CloudRunner.Provider.runTask(
|
output += await CloudRunner.Provider.runTask(
|
||||||
CloudRunner.buildParameters.buildGuid,
|
CloudRunner.buildParameters.buildGuid,
|
||||||
step['image'],
|
step['image'],
|
||||||
|
|
@ -40,7 +34,7 @@ export class CustomWorkflow {
|
||||||
`/${CloudRunnerFolders.buildVolumeFolder}`,
|
`/${CloudRunnerFolders.buildVolumeFolder}`,
|
||||||
`/${CloudRunnerFolders.projectPathAbsolute}/`,
|
`/${CloudRunnerFolders.projectPathAbsolute}/`,
|
||||||
environmentVariables,
|
environmentVariables,
|
||||||
[...secrets, ...stepSecrets],
|
[...secrets, ...step.secrets],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ export class WorkflowCompositionRoot implements WorkflowInterface {
|
||||||
async run(cloudRunnerStepState: CloudRunnerStepState) {
|
async run(cloudRunnerStepState: CloudRunnerStepState) {
|
||||||
try {
|
try {
|
||||||
if (CloudRunner.buildParameters.customJob !== '') {
|
if (CloudRunner.buildParameters.customJob !== '') {
|
||||||
return await CustomWorkflow.runCustomJob(
|
return await CustomWorkflow.runCustomJobFromString(
|
||||||
CloudRunner.buildParameters.customJob,
|
CloudRunner.buildParameters.customJob,
|
||||||
cloudRunnerStepState.environment,
|
cloudRunnerStepState.environment,
|
||||||
cloudRunnerStepState.secrets,
|
cloudRunnerStepState.secrets,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue