screwdriver-api 7.0.241 → 7.0.243

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "screwdriver-api",
3
- "version": "7.0.241",
3
+ "version": "7.0.243",
4
4
  "description": "API server for the Screwdriver.cd service",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -5,8 +5,7 @@ const boom = require('@hapi/boom');
5
5
  const validationSchema = require('screwdriver-data-schema');
6
6
  const ANNOT_RESTRICT_PR = 'screwdriver.cd/restrictPR';
7
7
  const { getScmUri, isStageTeardown } = require('../helper');
8
- const { updateBuildAndTriggerDownstreamJobs } = require('../builds/helper/updateBuild');
9
- const { Status, BUILD_STATUS_MESSAGES } = require('../builds/triggers/helpers');
8
+ const { createEvent } = require('./helper/createEvent');
10
9
 
11
10
  module.exports = () => ({
12
11
  method: 'POST',
@@ -220,15 +219,27 @@ module.exports = () => ({
220
219
 
221
220
  payload.sha = sha;
222
221
 
223
- // If there is parentEvent, pass workflowGraph and sha to payload
222
+ // If there is parentEvent, pass workflowGraph, meta and sha to payload
224
223
  // Skip PR, for PR builds, we should always start from latest commit
225
224
  if (payload.parentEventId) {
226
225
  const parentEvent = await eventFactory.get(parentEventId);
226
+ let mergedParameters = payload.meta.parameters || {};
227
227
 
228
228
  payload.baseBranch = parentEvent.baseBranch || null;
229
229
 
230
+ // Merge parameters if they exist in the parent event and not in the payload
230
231
  if (!payload.meta.parameters && parentEvent.meta && parentEvent.meta.parameters) {
231
- payload.meta.parameters = parentEvent.meta.parameters;
232
+ mergedParameters = parentEvent.meta.parameters;
233
+ }
234
+ delete payload.meta.parameters;
235
+
236
+ // Copy meta from parent event if payload.meta is empty except for the parameters
237
+ if (Object.keys(payload.meta).length === 0) {
238
+ payload.meta = { ...parentEvent.meta };
239
+ }
240
+
241
+ if (Object.keys(mergedParameters).length > 0) {
242
+ payload.meta.parameters = mergedParameters;
232
243
  }
233
244
 
234
245
  if (!prNum) {
@@ -241,28 +252,12 @@ module.exports = () => ({
241
252
  }
242
253
  }
243
254
 
244
- const event = await eventFactory.create(payload);
255
+ const event = await createEvent(payload, request.server);
245
256
 
246
257
  if (event.builds === null) {
247
258
  return boom.notFound('No jobs to start.');
248
259
  }
249
260
 
250
- const virtualJobBuilds = event.builds.filter(b => b.status === 'CREATED');
251
-
252
- for (const build of virtualJobBuilds) {
253
- await updateBuildAndTriggerDownstreamJobs(
254
- {
255
- status: Status.SUCCESS,
256
- statusMessage: BUILD_STATUS_MESSAGES.SKIP_VIRTUAL_JOB.statusMessage,
257
- statusMessageType: BUILD_STATUS_MESSAGES.SKIP_VIRTUAL_JOB.statusMessageType
258
- },
259
- build,
260
- request.server,
261
- username,
262
- scmContext
263
- );
264
- }
265
-
266
261
  // everything succeeded, inform the user
267
262
  const location = urlLib.format({
268
263
  host: request.headers.host,
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ const { updateBuildAndTriggerDownstreamJobs } = require('../../builds/helper/updateBuild');
4
+ const { Status, BUILD_STATUS_MESSAGES } = require('../../builds/triggers/helpers');
5
+
6
+ /**
7
+ * @typedef {import('screwdriver-models/lib/event')} Event
8
+ */
9
+
10
+ /**
11
+ * Create a new event.
12
+ * Updates the status of all the virtual builds at the beginning of the event workflow to "SUCCESS"
13
+ * and trigger their downstream jobs.
14
+ *
15
+ * @method createEvent
16
+ * @param {Object} config
17
+ * @param {String} config.username
18
+ * @param {Object} config.scmContext
19
+ * @param {Object} server
20
+ * @returns {Promise<Event>} Newly created event
21
+ */
22
+ async function createEvent(config, server) {
23
+ const { eventFactory } = server.app;
24
+ const { username, scmContext } = config;
25
+ const event = await eventFactory.create(config);
26
+
27
+ if (event.builds) {
28
+ const virtualJobBuilds = event.builds.filter(b => b.status === 'CREATED');
29
+
30
+ for (const build of virtualJobBuilds) {
31
+ await updateBuildAndTriggerDownstreamJobs(
32
+ {
33
+ status: Status.SUCCESS,
34
+ statusMessage: BUILD_STATUS_MESSAGES.SKIP_VIRTUAL_JOB.statusMessage,
35
+ statusMessageType: BUILD_STATUS_MESSAGES.SKIP_VIRTUAL_JOB.statusMessageType
36
+ },
37
+ build,
38
+ server,
39
+ username,
40
+ scmContext
41
+ );
42
+ }
43
+ }
44
+
45
+ return event;
46
+ }
47
+
48
+ module.exports = {
49
+ createEvent
50
+ };
@@ -4,6 +4,7 @@ const boom = require('@hapi/boom');
4
4
  const joi = require('joi');
5
5
  const schema = require('screwdriver-data-schema');
6
6
  const { getUserPermissions } = require('../helper');
7
+ const { createEvent } = require('../events/helper/createEvent');
7
8
  const idSchema = schema.models.pipeline.base.extract('id');
8
9
 
9
10
  module.exports = () => ({
@@ -19,7 +20,7 @@ module.exports = () => ({
19
20
  },
20
21
 
21
22
  handler: async (request, h) => {
22
- const { pipelineFactory, eventFactory, userFactory } = request.server.app;
23
+ const { pipelineFactory, userFactory } = request.server.app;
23
24
  const { username, scmContext } = request.auth.credentials;
24
25
  const { id } = request.params;
25
26
  const { scm } = pipelineFactory;
@@ -41,7 +42,7 @@ module.exports = () => ({
41
42
  }
42
43
  });
43
44
 
44
- const createEvents = await Promise.allSettled(
45
+ const createdEvents = await Promise.allSettled(
45
46
  pipelines.map(async p => {
46
47
  const pipelineToken = await p.token;
47
48
  const pipelineScmContext = p.scmContext;
@@ -53,18 +54,21 @@ module.exports = () => ({
53
54
 
54
55
  await getUserPermissions({ user, scmUri: p.scmUri, level: 'push' });
55
56
 
56
- await eventFactory.create({
57
- pipelineId: p.id,
58
- sha,
59
- username,
60
- scmContext: pipelineScmContext,
61
- startFrom: '~commit',
62
- causeMessage: `Started by ${username}`
63
- });
57
+ await createEvent(
58
+ {
59
+ pipelineId: p.id,
60
+ sha,
61
+ username,
62
+ scmContext: pipelineScmContext,
63
+ startFrom: '~commit',
64
+ causeMessage: `Started by ${username}`
65
+ },
66
+ request.server
67
+ );
64
68
  })
65
69
  );
66
70
 
67
- const rejected = createEvents.filter(createEvent => createEvent.status === 'rejected');
71
+ const rejected = createdEvents.filter(createdEvent => createdEvent.status === 'rejected');
68
72
 
69
73
  if (rejected.length) {
70
74
  throw boom.forbidden('Failed to start some child pipelines due to lack of permissions.');
@@ -4,6 +4,7 @@ const workflowParser = require('screwdriver-workflow-parser');
4
4
  const schema = require('screwdriver-data-schema');
5
5
  const logger = require('screwdriver-logger');
6
6
  const { getReadOnlyInfo } = require('../helper');
7
+ const { createEvent } = require('../events/helper/createEvent');
7
8
 
8
9
  const ANNOT_NS = 'screwdriver.cd';
9
10
  const ANNOT_CHAIN_PR = `${ANNOT_NS}/chainPR`;
@@ -413,10 +414,10 @@ async function triggeredPipelines(
413
414
  * Start Events
414
415
  * @async startEvents
415
416
  * @param {Array} eventConfigs Array of event config objects
416
- * @param {Object} eventFactory Factory to create events
417
+ * @param {Object} server Server
417
418
  * @return {Promise<Array>} Array of created events
418
419
  */
419
- async function startEvents(eventConfigs, eventFactory) {
420
+ async function startEvents(eventConfigs, server) {
420
421
  const events = [];
421
422
  let errorCount = 0;
422
423
  let eventsCount = 0;
@@ -426,7 +427,7 @@ async function startEvents(eventConfigs, eventFactory) {
426
427
  if (eventConfig && eventConfig.configPipelineSha) {
427
428
  eventsCount += 1;
428
429
 
429
- return eventFactory.create(eventConfig);
430
+ return createEvent(eventConfig, server);
430
431
  }
431
432
 
432
433
  return Promise.resolve(null);
@@ -626,7 +627,7 @@ async function createPREvents(options, request) {
626
627
  })
627
628
  );
628
629
 
629
- const events = await startEvents(eventConfigs, eventFactory);
630
+ const events = await startEvents(eventConfigs, request.server);
630
631
 
631
632
  return events;
632
633
  }
@@ -944,23 +945,15 @@ function pullRequestEvent(pluginOptions, request, h, parsed, token) {
944
945
  /**
945
946
  * Create events for each pipeline
946
947
  * @async createEvents
947
- * @param {EventFactory} eventFactory To create event
948
- * @param {UserFactory} userFactory To get user permission
949
- * @param {PipelineFactory} pipelineFactory To use scm module
950
- * @param {Array} pipelines The pipelines to start events
951
- * @param {Object} parsed It has information to create event
948
+ * @param {Object} server
949
+ * @param {UserFactory} userFactory To get user permission
950
+ * @param {PipelineFactory} pipelineFactory To use scm module
951
+ * @param {Array} pipelines The pipelines to start events
952
+ * @param {Object} parsed It has information to create event
952
953
  * @param {String} [skipMessage] Message to skip starting builds
953
954
  * @returns {Promise} Promise that resolves into events
954
955
  */
955
- async function createEvents(
956
- eventFactory,
957
- userFactory,
958
- pipelineFactory,
959
- pipelines,
960
- parsed,
961
- skipMessage,
962
- scmConfigFromHook
963
- ) {
956
+ async function createEvents(server, userFactory, pipelineFactory, pipelines, parsed, skipMessage, scmConfigFromHook) {
964
957
  const { action, branch, sha, username, scmContext, changedFiles, type, releaseName, ref } = parsed;
965
958
 
966
959
  const pipelineTuples = await Promise.all(
@@ -1101,7 +1094,7 @@ async function createEvents(
1101
1094
  })
1102
1095
  );
1103
1096
 
1104
- const events = await startEvents(eventConfigs, eventFactory);
1097
+ const events = await startEvents(eventConfigs, server);
1105
1098
 
1106
1099
  return events;
1107
1100
  }
@@ -1117,7 +1110,7 @@ async function createEvents(
1117
1110
  * @param {String} [skipMessage] Message to skip starting builds
1118
1111
  */
1119
1112
  async function pushEvent(request, h, parsed, skipMessage, token) {
1120
- const { eventFactory, pipelineFactory, userFactory } = request.server.app;
1113
+ const { pipelineFactory, userFactory } = request.server.app;
1121
1114
  const { hookId, checkoutUrl, branch, scmContext, type, action, changedFiles, releaseName, ref } = parsed;
1122
1115
 
1123
1116
  const fullCheckoutUrl = `${checkoutUrl}#${branch}`;
@@ -1154,7 +1147,7 @@ async function pushEvent(request, h, parsed, skipMessage, token) {
1154
1147
  request.log(['webhook', hookId], `Skipping since Pipeline ${fullCheckoutUrl} does not exist`);
1155
1148
  } else {
1156
1149
  events = await createEvents(
1157
- eventFactory,
1150
+ request.server,
1158
1151
  userFactory,
1159
1152
  pipelineFactory,
1160
1153
  pipelines,