@aircall/ci-scripts
Advanced tools
Comparing version 2.1.0 to 2.1.1
@@ -5,83 +5,91 @@ const { post } = require('../request.js'); | ||
getMergedPullRequests, | ||
getLatestRelease, | ||
getPreviousRelease | ||
getReleaseFromSha1, | ||
getPreviousReleaseFromRelease, | ||
getLatestDraft | ||
} = require('../github.js'); | ||
const { | ||
SLACK_BEARER_TOKEN, | ||
CIRCLE_PROJECT_REPONAME, | ||
CIRCLE_PROJECT_USERNAME, | ||
CIRCLE_WORKFLOW_ID, | ||
CIRCLE_SHA1 | ||
} = checkEnvVariables([ | ||
'SLACK_BEARER_TOKEN', | ||
'CIRCLE_PROJECT_REPONAME', | ||
'CIRCLE_PROJECT_USERNAME', | ||
'CIRCLE_WORKFLOW_ID', | ||
'GITHUB_CREDENTIALS', | ||
'CIRCLE_SHA1' | ||
]); | ||
const SLACK_COLOR = '#00b388'; | ||
const generatePayload = (environment, lastTag, prevTag, mergedPR, project, circleId) => { | ||
if (environment === 'production') { | ||
return [ | ||
{ | ||
title: 'Changelog', | ||
value: `<${lastTag.html_url} | ${lastTag.tag_name}>`, | ||
short: true | ||
}, | ||
{ | ||
title: 'Diff', | ||
value: `<https://github.com/${project}/compare/${prevTag.tag_name}...${lastTag.tag_name}|${prevTag.tag_name}...${lastTag.tag_name}>`, | ||
short: true | ||
} | ||
]; | ||
} else { | ||
return [ | ||
{ | ||
title: 'PR', | ||
value: `[<${mergedPR.url}|#${mergedPR.number}>] ${mergedPR.title}, by *@${mergedPR.author.login}*`, | ||
}, | ||
{ | ||
title: 'Associated Release', | ||
value: `<${lastTag.html_url}|${lastTag.tag_name}>`, | ||
short: true | ||
}, | ||
{ | ||
title: 'CircleCI Workflow', | ||
value: `<https://circleci.com/workflow-run/${circleId}|Link>`, | ||
short: true | ||
} | ||
]; | ||
} | ||
const generateStagingPayload = (mergedPR, lastDraft, circleId) => { | ||
return [ | ||
{ | ||
title: 'PR', | ||
value: `[<${mergedPR.url}|#${mergedPR.number}>] ${mergedPR.title}, by *@${ | ||
mergedPR.author.login | ||
}*` | ||
}, | ||
{ | ||
title: 'Associated Release', | ||
value: `<${lastDraft.html_url}|${lastDraft.tag_name}>`, | ||
short: true | ||
}, | ||
{ | ||
title: 'CircleCI Workflow', | ||
value: `<https://circleci.com/workflow-run/${circleId}|Link>`, | ||
short: true | ||
} | ||
]; | ||
}; | ||
const getReleaseData = async (project, credentials) => { | ||
const lastTag = await getLatestRelease(); | ||
const prevTag = await getPreviousRelease(); | ||
return [lastTag, prevTag]; | ||
const generateProdPayload = (lastTag, prevTag, project) => { | ||
return [ | ||
{ | ||
title: 'Changelog', | ||
value: `<${lastTag.html_url} | ${lastTag.tag_name}>`, | ||
short: true | ||
}, | ||
{ | ||
title: 'Diff', | ||
value: `<https://github.com/${project}/compare/${prevTag.tag_name}...${lastTag.tag_name}|${ | ||
prevTag.tag_name | ||
}...${lastTag.tag_name}>`, | ||
short: true | ||
} | ||
]; | ||
}; | ||
const getPRData = async (project, credentials) => { | ||
const getPRData = async commitish => { | ||
const prs = await getMergedPullRequests(); | ||
// Addresses issue when older PR is merged after newer PR | ||
// Original list is sorted by PR number, not close/merge date | ||
// There are 100 PRs given in response so not ideal but not that expensive either... | ||
const mostRecentMergedPR = prs.sort( (pr1, pr2) => { | ||
return (pr1.mergedAt < pr2.mergedAt) ? 1 : -1; | ||
})[0]; | ||
const mergedPR = prs.find(pr => { | ||
return pr.mergeCommit.oid === commitish; | ||
}); | ||
return mostRecentMergedPR; | ||
} | ||
return mergedPR; | ||
}; | ||
const notifySlack = async (environment, channel, title = ':ship:') => { | ||
const { | ||
SLACK_BEARER_TOKEN, | ||
CIRCLE_PROJECT_REPONAME, | ||
CIRCLE_PROJECT_USERNAME, | ||
CIRCLE_WORKFLOW_ID, | ||
GITHUB_CREDENTIALS, | ||
} = checkEnvVariables([ | ||
'SLACK_BEARER_TOKEN', | ||
'CIRCLE_PROJECT_REPONAME', | ||
'CIRCLE_PROJECT_USERNAME', | ||
'CIRCLE_WORKFLOW_ID', | ||
'GITHUB_CREDENTIALS' | ||
]); | ||
const project = CIRCLE_PROJECT_USERNAME + '/' + CIRCLE_PROJECT_REPONAME; | ||
const mergedPR = await getPRData(project, GITHUB_CREDENTIALS); | ||
const [lastTag, prevTag] = await getReleaseData(project, GITHUB_CREDENTIALS); | ||
const fields = generatePayload(environment, lastTag, prevTag, mergedPR, project, CIRCLE_WORKFLOW_ID); | ||
const messageTitle = `${title} ${environment.charAt(0).toUpperCase() + environment.slice(1)} deployment`; | ||
let currentRelease, previousRelease, lastDraft, mergedPR, fields; | ||
if (environment === 'production') { | ||
currentRelease = await getReleaseFromSha1(CIRCLE_SHA1); | ||
previousRelease = await getPreviousReleaseFromRelease(currentRelease.id); | ||
fields = generateProdPayload(currentRelease, previousRelease, project); | ||
} else { | ||
mergedPR = await getPRData(CIRCLE_SHA1); | ||
lastDraft = await getLatestDraft(); | ||
fields = generateStagingPayload(mergedPR, lastDraft, CIRCLE_WORKFLOW_ID); | ||
} | ||
const messageTitle = `${title} ${environment.charAt(0).toUpperCase() + | ||
environment.slice(1)} deployment`; | ||
const payload = JSON.stringify({ | ||
@@ -101,3 +109,9 @@ channel, | ||
try { | ||
await post(slackUrl, { headers: { 'Authorization': `Bearer ${SLACK_BEARER_TOKEN}`, 'Content-type': 'application/json' }, body: payload } ); | ||
await post(slackUrl, { | ||
headers: { | ||
Authorization: `Bearer ${SLACK_BEARER_TOKEN}`, | ||
'Content-type': 'application/json' | ||
}, | ||
body: payload | ||
}); | ||
} catch (e) { | ||
@@ -104,0 +118,0 @@ console.log(e); |
@@ -65,3 +65,3 @@ const { get, patch, post } = require('./request.js'); | ||
return gitReleases; | ||
} | ||
}; | ||
@@ -78,8 +78,36 @@ const getLatestRelease = async () => { | ||
const getLatestDraft = async () => { | ||
const releases = await getReleases(); | ||
const latestPreRelease = releases.find(r => r.draft); | ||
return latestPreRelease; | ||
}; | ||
const getLatestPreRelease = async () => { | ||
const { data } = await get(`${githubApiUrl}/releases`, { headers: apiRequestHeaders }); | ||
const latestPreRelease = data.find(r => !r.draft && r.prerelease); | ||
const releases = await getReleases(); | ||
const latestPreRelease = releases.find(r => !r.draft && r.prerelease); | ||
return latestPreRelease; | ||
}; | ||
const getLatestFullRelease = async () => { | ||
const releases = await getReleases(); | ||
const latestFullRelease = releases.find(r => !r.draft && !r.prerelease); | ||
return latestFullRelease; | ||
}; | ||
const getReleaseFromSha1 = async commitish => { | ||
const releases = await getReleases(); | ||
const release = releases.find(r => { | ||
return r.target_commitish === commitish; | ||
}); | ||
return release; | ||
}; | ||
const getPreviousReleaseFromRelease = async releaseId => { | ||
const releases = await getReleases(); | ||
const index = releases.findIndex(r => { | ||
return r.id === releaseId; | ||
}); | ||
return releases[index + 1]; | ||
}; | ||
const executeGraphQLRequest = async query => { | ||
@@ -155,3 +183,4 @@ const { data } = await post(githubGraphQLUrl, { | ||
mergeCommit { | ||
committedDate | ||
oid | ||
committedDate | ||
} | ||
@@ -175,2 +204,3 @@ } | ||
getLatestCommit, | ||
getLatestDraft, | ||
getLatestRelease, | ||
@@ -180,3 +210,6 @@ getLatestPreRelease, | ||
getMergedPullRequests, | ||
getPreviousRelease | ||
getPreviousRelease, | ||
getLatestFullRelease, | ||
getReleaseFromSha1, | ||
getPreviousReleaseFromRelease | ||
}; |
{ | ||
"name": "@aircall/ci-scripts", | ||
"version": "2.1.0", | ||
"version": "2.1.1", | ||
"dependencies": {}, | ||
@@ -5,0 +5,0 @@ "main": "ci-scripts.js", |
34074
880