1 | const validate = require('./validate');
|
2 | const getLogger = require('./get-logger');
|
3 | const getToken = require('./get-token');
|
4 | const getJobs = require('./get-jobs');
|
5 | const electBuildLeader = require('./elect-build-leader');
|
6 | const waitForOtherJobs = require('./wait-for-other-jobs');
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 | module.exports = async ({
|
19 | travisOpts = {},
|
20 | buildLeaderId = process.env.BUILD_LEADER_ID,
|
21 | githubToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN,
|
22 | } = {}) => {
|
23 | const logger = getLogger('Travis Deploy Once');
|
24 |
|
25 | validate(githubToken);
|
26 |
|
27 | const buildId = parseInt(process.env.TRAVIS_BUILD_ID, 10);
|
28 | const travisToken = await getToken(travisOpts, githubToken);
|
29 | const jobs = await getJobs(travisOpts, travisToken, buildId);
|
30 | if (jobs.length === 1) {
|
31 | logger.log('There is only one job for this build.');
|
32 | return true;
|
33 | }
|
34 |
|
35 | const versions = jobs.map(job => job.config.node_js);
|
36 | if (versions.filter(job => Boolean(job)).length === 0 && !buildLeaderId) {
|
37 | logger.log(`There is no job in this build defining a node version. Electing job (${jobs.length}) as build leader.`);
|
38 | buildLeaderId = jobs.length;
|
39 | }
|
40 |
|
41 | if (!process.env.TRAVIS_JOB_NUMBER.endsWith(`.${buildLeaderId || electBuildLeader(versions, logger)}`)) {
|
42 | logger.log(`The current job (${process.env.TRAVIS_JOB_NUMBER}) is not the build leader.`);
|
43 | return null;
|
44 | }
|
45 |
|
46 | const currentJobId = parseInt(process.env.TRAVIS_JOB_ID, 10);
|
47 | const result = await waitForOtherJobs({travisOpts, travisToken, buildId, currentJobId, initialJobs: jobs, logger});
|
48 | if (result) {
|
49 | logger.log('All jobs are successful for this build!');
|
50 | } else {
|
51 | logger.error('At least one job has failed for this build.');
|
52 | }
|
53 | return result;
|
54 | };
|