mirror of
https://github.com/sourcegraph/sourcegraph.git
synced 2026-02-06 15:12:02 +00:00
Release captain automation scripts (#6243)
This commit is contained in:
parent
4b14c81830
commit
cfd8414c15
1
dev/release/.gitignore
vendored
Normal file
1
dev/release/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.secrets/
|
||||
2
dev/release/README.md
Normal file
2
dev/release/README.md
Normal file
@ -0,0 +1,2 @@
|
||||
This directory contains scripts and code to automate our releases. Run `yarn run release` to see a
|
||||
list of automated steps.
|
||||
17
dev/release/config.json
Normal file
17
dev/release/config.json
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"teamEmail": "team@sourcegraph.com",
|
||||
|
||||
"captainSlackUsername": "beyang",
|
||||
"captainGitHubUsername": "beyang",
|
||||
|
||||
"version": "3.10",
|
||||
"releaseDateTime": "20 Nov 2019 10:00 PST",
|
||||
"oneWorkingDayBeforeRelease": "19 Nov 2019 10:00 PST",
|
||||
"threeWorkingDaysBeforeRelease": "15 Nov 2019 10:00 PST",
|
||||
"fourWorkingDaysBeforeRelease": "14 Nov 2019 10:00 PST",
|
||||
"fiveWorkingDaysBeforeRelease": "13 Nov 2019 10:00 PST'",
|
||||
|
||||
"retrospectiveReminderDateTime": "25 Nov 2019 10:00 PST",
|
||||
"retrospectiveDateTime": "26 Nov 2019 10:00 PST",
|
||||
"retrospectiveDocURL": "https://docs.google.com/document/d/1yNNOy7-MAtdXhVUku__9MBjm6snF69T9BgAjZ3AlU28/edit"
|
||||
}
|
||||
76
dev/release/github.ts
Normal file
76
dev/release/github.ts
Normal file
@ -0,0 +1,76 @@
|
||||
import Octokit from '@octokit/rest'
|
||||
import { readLine } from './util'
|
||||
import { readFile } from 'fs-extra'
|
||||
|
||||
export async function ensureTrackingIssue({
|
||||
version,
|
||||
assignees,
|
||||
releaseDateTime,
|
||||
oneWorkingDayBeforeRelease,
|
||||
threeWorkingDaysBeforeRelease,
|
||||
fourWorkingDaysBeforeRelease,
|
||||
fiveWorkingDaysBeforeRelease,
|
||||
}: {
|
||||
version: string
|
||||
assignees: string[]
|
||||
releaseDateTime: Date
|
||||
oneWorkingDayBeforeRelease: Date
|
||||
threeWorkingDaysBeforeRelease: Date
|
||||
fourWorkingDaysBeforeRelease: Date
|
||||
fiveWorkingDaysBeforeRelease: Date
|
||||
}): Promise<{ url: string; created: boolean }> {
|
||||
const octokit = await getAuthenticatedGitHubClient()
|
||||
const url = await getTrackingIssueURL(octokit, version)
|
||||
if (url) {
|
||||
return { url, created: false }
|
||||
}
|
||||
|
||||
const formatDate = (d: Date): string => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`
|
||||
|
||||
const releaseIssueTemplate = await readFile('../../doc/dev/release_issue_template.md', { encoding: 'utf8' })
|
||||
const releaseIssueBody = releaseIssueTemplate
|
||||
.replace(/\$VERSION/g, version)
|
||||
.replace(/\$RELEASE_DATE/g, formatDate(releaseDateTime))
|
||||
.replace(/\$FIVE_WORKING_DAYS_BEFORE_RELEASE/g, formatDate(fiveWorkingDaysBeforeRelease))
|
||||
.replace(/\$FOUR_WORKING_DAYS_BEFORE_RELEASE/g, formatDate(fourWorkingDaysBeforeRelease))
|
||||
.replace(/\$THREE_WORKING_DAYS_BEFORE_RELEASE/g, formatDate(threeWorkingDaysBeforeRelease))
|
||||
.replace(/\$ONE_WORKING_DAY_BEFORE_RELEASE/g, formatDate(oneWorkingDayBeforeRelease))
|
||||
|
||||
const createdIssue = await octokit.issues.create({
|
||||
title: issueTitle(version),
|
||||
owner: 'sourcegraph',
|
||||
repo: 'sourcegraph',
|
||||
assignees,
|
||||
body: releaseIssueBody,
|
||||
})
|
||||
return { url: createdIssue.data.html_url, created: true }
|
||||
}
|
||||
|
||||
export async function getTrackingIssueURL(octokit: Octokit, version: string): Promise<string | null> {
|
||||
const title = issueTitle(version)
|
||||
const resp = await octokit.search.issuesAndPullRequests({
|
||||
per_page: 100,
|
||||
q: `type:issue repo:sourcegraph/sourcegraph ${JSON.stringify(title)}`,
|
||||
})
|
||||
|
||||
const matchingIssues = resp.data.items.filter(issue => issue.title === title && issue.closed_at === null)
|
||||
if (matchingIssues.length === 0) {
|
||||
return null
|
||||
}
|
||||
if (matchingIssues.length > 1) {
|
||||
throw new Error(`Multiple issues matched issue title ${JSON.stringify(title)}`)
|
||||
}
|
||||
return matchingIssues[0].html_url
|
||||
}
|
||||
|
||||
function issueTitle(version: string): string {
|
||||
return `${version} release tracking issue`
|
||||
}
|
||||
|
||||
export async function getAuthenticatedGitHubClient(): Promise<Octokit> {
|
||||
const githubPAT = await readLine(
|
||||
'Enter a GitHub personal access token with "repo" scope (https://github.com/settings/tokens/new): ',
|
||||
'.secrets/github.txt'
|
||||
)
|
||||
return new Octokit({ auth: githubPAT })
|
||||
}
|
||||
100
dev/release/google-calendar.ts
Normal file
100
dev/release/google-calendar.ts
Normal file
@ -0,0 +1,100 @@
|
||||
import { google, calendar_v3 } from 'googleapis'
|
||||
import { OAuth2Client } from 'googleapis-common'
|
||||
import open from 'open'
|
||||
import { Credentials } from 'google-auth-library'
|
||||
import { readLine } from './util'
|
||||
import { readFile, writeFile } from 'fs-extra'
|
||||
|
||||
const SCOPES = ['https://www.googleapis.com/auth/calendar.events']
|
||||
const TOKEN_PATH = '.secrets/google-calendar-token.json'
|
||||
|
||||
export async function getClient(): Promise<OAuth2Client> {
|
||||
const credentials = JSON.parse(
|
||||
await readLine(
|
||||
'Paste Google Calendar credentials (1Password "Release automation Google Calendar API App credentials"): ',
|
||||
'.secrets/google-calendar-credentials.json'
|
||||
)
|
||||
)
|
||||
const { client_secret, client_id, redirect_uris } = credentials.installed
|
||||
const oauth2Client = new OAuth2Client(client_id, client_secret, redirect_uris[0])
|
||||
oauth2Client.setCredentials(await getAccessToken(oauth2Client))
|
||||
return oauth2Client
|
||||
}
|
||||
|
||||
async function getAccessToken(oauth2Client: OAuth2Client): Promise<Credentials> {
|
||||
try {
|
||||
return JSON.parse(await readFile(TOKEN_PATH, { encoding: 'utf8' }))
|
||||
} catch (err) {
|
||||
const token = await getAccessTokenNoCache(oauth2Client)
|
||||
await writeFile(TOKEN_PATH, JSON.stringify(token))
|
||||
return token
|
||||
}
|
||||
}
|
||||
|
||||
async function getAccessTokenNoCache(oauth2Client: OAuth2Client): Promise<Credentials> {
|
||||
const authUrl = oauth2Client.generateAuthUrl({
|
||||
access_type: 'offline',
|
||||
scope: SCOPES,
|
||||
})
|
||||
await open(authUrl)
|
||||
const code = await readLine('Log in via the browser page that just opened and enter the code that appears: ')
|
||||
const token = await oauth2Client.getToken(code)
|
||||
return token.tokens
|
||||
}
|
||||
|
||||
export interface EventOptions {
|
||||
anyoneCanAddSelf?: boolean
|
||||
attendees?: string[]
|
||||
startDate?: string
|
||||
endDate?: string
|
||||
startDateTime?: string
|
||||
endDateTime?: string
|
||||
description?: string
|
||||
title: string
|
||||
}
|
||||
|
||||
export async function ensureEvent(
|
||||
{
|
||||
anyoneCanAddSelf = false,
|
||||
attendees = [],
|
||||
startDate,
|
||||
endDate,
|
||||
startDateTime,
|
||||
endDateTime,
|
||||
description = '',
|
||||
title,
|
||||
}: EventOptions,
|
||||
auth: OAuth2Client
|
||||
): Promise<void> {
|
||||
const existingEvents = await listEvents(auth)
|
||||
const foundEvents = (existingEvents || []).filter(({ summary }) => summary === title)
|
||||
if (foundEvents.length > 0) {
|
||||
console.log(`Event ${JSON.stringify(title)} already exists (not updating)`)
|
||||
return
|
||||
}
|
||||
|
||||
const calendar = google.calendar({ version: 'v3', auth })
|
||||
await calendar.events.insert({
|
||||
calendarId: 'primary',
|
||||
requestBody: {
|
||||
anyoneCanAddSelf,
|
||||
attendees: attendees.map(email => ({ email })),
|
||||
start: { date: startDate, dateTime: startDateTime },
|
||||
end: { date: endDate, dateTime: endDateTime },
|
||||
description,
|
||||
summary: title,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
async function listEvents(auth: OAuth2Client): Promise<calendar_v3.Schema$Event[] | undefined> {
|
||||
const calendar = google.calendar({ version: 'v3', auth })
|
||||
const res = await calendar.events.list({
|
||||
calendarId: 'primary',
|
||||
timeMin: new Date().toISOString(),
|
||||
maxResults: 2500,
|
||||
singleEvents: true,
|
||||
orderBy: 'startTime',
|
||||
})
|
||||
return res.data.items
|
||||
}
|
||||
30
dev/release/package.json
Normal file
30
dev/release/package.json
Normal file
@ -0,0 +1,30 @@
|
||||
{
|
||||
"name": "release",
|
||||
"description": "Scripts for managing release captain duties",
|
||||
"author": "Sourcegraph",
|
||||
"license": "MIT",
|
||||
"version": "0.0.1",
|
||||
"scripts": {
|
||||
"release": "node ./out/release.js",
|
||||
"build": "tsc",
|
||||
"watch": "tsc -w",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"tslint": "../node_modules/.bin/tslint -p tsconfig.json",
|
||||
"eslint": "../node_modules/.bin/eslint 'src/**/*.ts?(x)'"
|
||||
},
|
||||
"dependencies": {
|
||||
"@octokit/rest": "^16.34.0",
|
||||
"@slack/web-api": "^5.3.0",
|
||||
"fs-extra": "^8.1.0",
|
||||
"googleapis": "39",
|
||||
"mkdirp": "^0.5.1",
|
||||
"open": "^7.0.0",
|
||||
"request-promise-native": "^1.0.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/fs-extra": "^8.0.1",
|
||||
"@types/mkdirp": "^0.5.2",
|
||||
"@types/request-promise-native": "^1.0.17",
|
||||
"typescript": "^3.6.4"
|
||||
}
|
||||
}
|
||||
253
dev/release/release.ts
Normal file
253
dev/release/release.ts
Normal file
@ -0,0 +1,253 @@
|
||||
import { ensureEvent, getClient, EventOptions } from './google-calendar'
|
||||
import { addTime } from './util'
|
||||
import { postMessage } from './slack'
|
||||
import { ensureTrackingIssue, getTrackingIssueURL, getAuthenticatedGitHubClient } from './github'
|
||||
import * as persistedConfig from './config.json'
|
||||
|
||||
interface Config {
|
||||
teamEmail: string
|
||||
|
||||
captainSlackUsername: string
|
||||
captainGitHubUsername: string
|
||||
|
||||
version: string
|
||||
releaseDateTime: string
|
||||
oneWorkingDayBeforeRelease: string
|
||||
threeWorkingDaysBeforeRelease: string
|
||||
fourWorkingDaysBeforeRelease: string
|
||||
fiveWorkingDaysBeforeRelease: string
|
||||
retrospectiveReminderDateTime: string
|
||||
retrospectiveDateTime: string
|
||||
retrospectiveDocURL: string
|
||||
}
|
||||
|
||||
type StepID =
|
||||
| 'add-timeline-to-calendar'
|
||||
| 'help'
|
||||
| 'tracking-issue:announce'
|
||||
| 'tracking-issue:create'
|
||||
| 'release-candidate:create'
|
||||
| 'release-candidate:dev-announce'
|
||||
| 'qa-start:dev-announce'
|
||||
| '_test:google-calendar'
|
||||
|
||||
interface Step {
|
||||
id: StepID
|
||||
deps?: StepID[]
|
||||
run?: ((config: Config) => Promise<void>) | ((config: Config) => void)
|
||||
}
|
||||
|
||||
const steps: Step[] = [
|
||||
{
|
||||
id: 'help',
|
||||
run: () => {
|
||||
console.error('Steps are:')
|
||||
console.error(
|
||||
steps
|
||||
.filter(({ id }) => !id.startsWith('_'))
|
||||
.map(({ id, deps }) => '\t' + id + (deps && deps.length > 0 ? ':\t' + deps.join(' ') : ''))
|
||||
.join('\n')
|
||||
)
|
||||
},
|
||||
},
|
||||
{
|
||||
id: '_test:google-calendar',
|
||||
run: async c => {
|
||||
const googleCalendar = await getClient()
|
||||
await ensureEvent(
|
||||
{
|
||||
title: 'TEST EVENT',
|
||||
startDateTime: new Date(c.releaseDateTime).toISOString(),
|
||||
endDateTime: addTime(new Date(c.releaseDateTime), 1).toISOString(),
|
||||
},
|
||||
googleCalendar
|
||||
)
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'add-timeline-to-calendar',
|
||||
run: async c => {
|
||||
const googleCalendar = await getClient()
|
||||
const events: EventOptions[] = [
|
||||
{
|
||||
title: 'Release captain reminder: 5 working days before release',
|
||||
description: 'See the release tracking issue for TODOs',
|
||||
startDateTime: new Date(c.fiveWorkingDaysBeforeRelease).toISOString(),
|
||||
endDateTime: addTime(new Date(c.fiveWorkingDaysBeforeRelease), 1).toISOString(),
|
||||
},
|
||||
{
|
||||
title: 'Release captain reminder: 4 working days before release',
|
||||
description: 'See the release tracking issue for TODOs',
|
||||
startDateTime: new Date(c.fourWorkingDaysBeforeRelease).toISOString(),
|
||||
endDateTime: addTime(new Date(c.fourWorkingDaysBeforeRelease), 1).toISOString(),
|
||||
},
|
||||
{
|
||||
title: 'Release captain reminder: 3 working days before release',
|
||||
description: 'See the release tracking issue for TODOs',
|
||||
startDateTime: new Date(c.threeWorkingDaysBeforeRelease).toISOString(),
|
||||
endDateTime: addTime(new Date(c.threeWorkingDaysBeforeRelease), 1).toISOString(),
|
||||
},
|
||||
{
|
||||
title: 'Release captain reminder: 1 working day before release',
|
||||
description: 'See the release tracking issue for TODOs',
|
||||
startDateTime: new Date(c.oneWorkingDayBeforeRelease).toISOString(),
|
||||
endDateTime: addTime(new Date(c.oneWorkingDayBeforeRelease), 1).toISOString(),
|
||||
},
|
||||
{
|
||||
title: `Cut release branch ${c.version}`,
|
||||
anyoneCanAddSelf: true,
|
||||
attendees: [c.teamEmail],
|
||||
startDateTime: new Date(c.fourWorkingDaysBeforeRelease).toISOString(),
|
||||
endDateTime: addTime(new Date(c.fourWorkingDaysBeforeRelease), 1).toISOString(),
|
||||
},
|
||||
{
|
||||
title: `Release Sourcegraph ${c.version}`,
|
||||
anyoneCanAddSelf: true,
|
||||
attendees: [c.teamEmail],
|
||||
startDateTime: new Date(c.releaseDateTime).toISOString(),
|
||||
endDateTime: addTime(new Date(c.releaseDateTime), 1).toISOString(),
|
||||
},
|
||||
{
|
||||
title: `Reminder to submit feedback for ${c.version} Engineering Retrospective`,
|
||||
description: `Retrospective document: ${c.retrospectiveDocURL}`,
|
||||
anyoneCanAddSelf: true,
|
||||
attendees: [c.teamEmail],
|
||||
startDateTime: new Date(c.retrospectiveReminderDateTime).toISOString(),
|
||||
endDateTime: addTime(new Date(c.retrospectiveReminderDateTime), 1).toISOString(),
|
||||
},
|
||||
{
|
||||
title: 'Release captain reminder: set up Retrospective Zoom',
|
||||
description:
|
||||
'Go to https://zoom.us/, click "Host a meeting > With Video On", and add the link to the Retrospective calendar event',
|
||||
startDateTime: addTime(new Date(c.retrospectiveDateTime), 0, -15).toISOString(),
|
||||
endDateTime: new Date(c.retrospectiveDateTime).toISOString(),
|
||||
},
|
||||
{
|
||||
title: `Engineering Retrospective ${c.version}`,
|
||||
description: `Retrospective document: ${c.retrospectiveDocURL}`,
|
||||
anyoneCanAddSelf: true,
|
||||
attendees: [c.teamEmail],
|
||||
startDateTime: new Date(c.retrospectiveDateTime).toISOString(),
|
||||
endDateTime: addTime(new Date(c.retrospectiveDateTime), 1).toISOString(),
|
||||
},
|
||||
]
|
||||
|
||||
for (const event of events) {
|
||||
console.log(`Create calendar event: ${event.title}`)
|
||||
await ensureEvent(event, googleCalendar)
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'tracking-issue:create',
|
||||
run: async ({
|
||||
version,
|
||||
releaseDateTime,
|
||||
captainGitHubUsername,
|
||||
oneWorkingDayBeforeRelease,
|
||||
threeWorkingDaysBeforeRelease,
|
||||
fourWorkingDaysBeforeRelease,
|
||||
fiveWorkingDaysBeforeRelease,
|
||||
}: Config) => {
|
||||
const { url, created } = await ensureTrackingIssue({
|
||||
version,
|
||||
assignees: [captainGitHubUsername],
|
||||
releaseDateTime: new Date(releaseDateTime),
|
||||
oneWorkingDayBeforeRelease: new Date(oneWorkingDayBeforeRelease),
|
||||
threeWorkingDaysBeforeRelease: new Date(threeWorkingDaysBeforeRelease),
|
||||
fourWorkingDaysBeforeRelease: new Date(fourWorkingDaysBeforeRelease),
|
||||
fiveWorkingDaysBeforeRelease: new Date(fiveWorkingDaysBeforeRelease),
|
||||
})
|
||||
console.log(created ? `Created tracking issue ${url}` : `Tracking issue already exists: ${url}`)
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'tracking-issue:announce',
|
||||
run: async c => {
|
||||
const trackingIssueURL = await getTrackingIssueURL(await getAuthenticatedGitHubClient(), c.version)
|
||||
if (!trackingIssueURL) {
|
||||
throw new Error(`Tracking issue for version ${c.version} not found--has it been create yet?`)
|
||||
}
|
||||
const formatDate = (d: Date): string =>
|
||||
`${d.toLocaleString('en-US', {
|
||||
timeZone: 'America/Los_Angeles',
|
||||
dateStyle: 'medium',
|
||||
timeStyle: 'short',
|
||||
} as Intl.DateTimeFormatOptions)} (SF time) / ${d.toLocaleString('en-US', {
|
||||
timeZone: 'Europe/Berlin',
|
||||
dateStyle: 'medium',
|
||||
timeStyle: 'short',
|
||||
} as Intl.DateTimeFormatOptions)} (Berlin time)`
|
||||
await postMessage(`:captain: ${c.version} Release :captain:
|
||||
Release captain: @${c.captainSlackUsername}
|
||||
Tracking issue: ${trackingIssueURL}
|
||||
Key dates:
|
||||
- Release branch cut, testing commences: ${formatDate(new Date(c.fourWorkingDaysBeforeRelease))}
|
||||
- Final release tag: ${formatDate(new Date(c.oneWorkingDayBeforeRelease))}
|
||||
- Release: ${formatDate(new Date(c.releaseDateTime))}}
|
||||
- Retrospective: ${formatDate(new Date(c.retrospectiveDateTime))}`)
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'release-candidate:create',
|
||||
run: () => {
|
||||
// Note(beyang): it would be nice to accept additional command-line arguments
|
||||
console.log('NOT YET IMPLEMENTED')
|
||||
process.exit(1)
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'release-candidate:dev-announce',
|
||||
run: () => {
|
||||
console.log('NOT YET IMPLEMENTED')
|
||||
process.exit(1)
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'qa-start:dev-announce',
|
||||
run: () => {
|
||||
console.log('NOT YET IMPLEMENTED')
|
||||
process.exit(1)
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
async function run(config: Config, stepIDToRun: StepID): Promise<void> {
|
||||
await Promise.all(
|
||||
steps
|
||||
.filter(({ id }) => id === stepIDToRun)
|
||||
.map(async step => {
|
||||
if (step.deps) {
|
||||
for (const dep of step.deps) {
|
||||
await run(config, dep)
|
||||
}
|
||||
}
|
||||
if (step.run) {
|
||||
await step.run(config)
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Release captain automation
|
||||
*/
|
||||
async function main(): Promise<void> {
|
||||
const config = persistedConfig
|
||||
const args = process.argv.slice(2)
|
||||
if (args.length !== 1) {
|
||||
console.error('This command expects exactly 1 argument')
|
||||
await run(config, 'help')
|
||||
return
|
||||
}
|
||||
const step = args[0]
|
||||
if (!steps.map(({ id }) => id as string).includes(step)) {
|
||||
console.error('Unrecognized step', JSON.stringify(step))
|
||||
return
|
||||
}
|
||||
await run(config, step as StepID)
|
||||
}
|
||||
|
||||
main()
|
||||
.then(() => undefined)
|
||||
.catch(err => console.error(err))
|
||||
13
dev/release/slack.ts
Normal file
13
dev/release/slack.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import { post } from 'request-promise-native'
|
||||
import { readLine } from './util'
|
||||
|
||||
export async function postMessage(message: string): Promise<void> {
|
||||
const webhookURL = await readLine(
|
||||
'Enter the Slack webhook URL corresponding to the #dev-announce channel (https://api.slack.com/apps/APULW2LKS/incoming-webhooks?): ',
|
||||
'.secrets/slackWebhookURL.txt'
|
||||
)
|
||||
await post(webhookURL, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({ text: message }),
|
||||
})
|
||||
}
|
||||
28
dev/release/tsconfig.json
Normal file
28
dev/release/tsconfig.json
Normal file
@ -0,0 +1,28 @@
|
||||
{
|
||||
"extends": "@sourcegraph/tsconfig",
|
||||
"compilerOptions": {
|
||||
"allowJs": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"esModuleInterop": true,
|
||||
"experimentalDecorators": true,
|
||||
"importHelpers": true,
|
||||
"inlineSourceMap": true,
|
||||
"lib": ["esnext"],
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"noErrorTruncation": true,
|
||||
"noImplicitAny": true,
|
||||
"noImplicitReturns": true,
|
||||
"outDir": "out",
|
||||
"resolveJsonModule": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"target": "esnext",
|
||||
"typeRoots": ["node_modules/@types"],
|
||||
},
|
||||
// "include": ["**/*"],
|
||||
// "include": ["*"],
|
||||
"files": ["release.ts"],
|
||||
"exclude": ["node_modules", "../../node_modules", "out"],
|
||||
}
|
||||
38
dev/release/util.ts
Normal file
38
dev/release/util.ts
Normal file
@ -0,0 +1,38 @@
|
||||
import * as readline from 'readline'
|
||||
import { readFile, writeFile, mkdirp } from 'fs-extra'
|
||||
import * as path from 'path'
|
||||
|
||||
export function addTime(dateTime: Date, numHours: number, numMinutes: number = 0): Date {
|
||||
const newDate = new Date(dateTime)
|
||||
newDate.setHours(dateTime.getHours() + numHours)
|
||||
newDate.setMinutes(dateTime.getMinutes() + numMinutes)
|
||||
return newDate
|
||||
}
|
||||
|
||||
export async function readLine(prompt: string, cacheFile?: string): Promise<string> {
|
||||
if (!cacheFile) {
|
||||
return readLineNoCache(prompt)
|
||||
}
|
||||
|
||||
try {
|
||||
return await readFile(cacheFile, { encoding: 'utf8' })
|
||||
} catch (err) {
|
||||
const userInput = await readLineNoCache(prompt)
|
||||
await mkdirp(path.dirname(cacheFile))
|
||||
await writeFile(cacheFile, userInput)
|
||||
return userInput
|
||||
}
|
||||
}
|
||||
|
||||
function readLineNoCache(prompt: string): Promise<string> {
|
||||
const rl = readline.createInterface({
|
||||
input: process.stdin,
|
||||
output: process.stdout,
|
||||
})
|
||||
return new Promise<string>(resolve =>
|
||||
rl.question(prompt, userInput => {
|
||||
rl.close()
|
||||
resolve(userInput)
|
||||
})
|
||||
)
|
||||
}
|
||||
777
dev/release/yarn.lock
Normal file
777
dev/release/yarn.lock
Normal file
@ -0,0 +1,777 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@octokit/endpoint@^5.5.0":
|
||||
version "5.5.0"
|
||||
resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.5.0.tgz#d7e7960ffe39096cb67062f07efa84db52b20edb"
|
||||
integrity sha512-TXYS6zXeBImNB9BVj+LneMDqXX+H0exkOpyXobvp92O3B1348QsKnNioISFKgOMsb3ibZvQGwCdpiwQd3KAjIA==
|
||||
dependencies:
|
||||
"@octokit/types" "^1.0.0"
|
||||
is-plain-object "^3.0.0"
|
||||
universal-user-agent "^4.0.0"
|
||||
|
||||
"@octokit/request-error@^1.0.1", "@octokit/request-error@^1.0.2":
|
||||
version "1.0.4"
|
||||
resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.0.4.tgz#15e1dc22123ba4a9a4391914d80ec1e5303a23be"
|
||||
integrity sha512-L4JaJDXn8SGT+5G0uX79rZLv0MNJmfGa4vb4vy1NnpjSnWDLJRy6m90udGwvMmavwsStgbv2QNkPzzTCMmL+ig==
|
||||
dependencies:
|
||||
deprecation "^2.0.0"
|
||||
once "^1.4.0"
|
||||
|
||||
"@octokit/request@^5.2.0":
|
||||
version "5.3.0"
|
||||
resolved "https://registry.npmjs.org/@octokit/request/-/request-5.3.0.tgz#ce49c9d05519054499b5bb729d4ecb4735cee78a"
|
||||
integrity sha512-mMIeNrtYyNEIYNsKivDyUAukBkw0M5ckyJX56xoFRXSasDPCloIXaQOnaKNopzQ8dIOvpdq1ma8gmrS+h6O2OQ==
|
||||
dependencies:
|
||||
"@octokit/endpoint" "^5.5.0"
|
||||
"@octokit/request-error" "^1.0.1"
|
||||
"@octokit/types" "^1.0.0"
|
||||
deprecation "^2.0.0"
|
||||
is-plain-object "^3.0.0"
|
||||
node-fetch "^2.3.0"
|
||||
once "^1.4.0"
|
||||
universal-user-agent "^4.0.0"
|
||||
|
||||
"@octokit/rest@^16.34.0":
|
||||
version "16.34.0"
|
||||
resolved "https://registry.npmjs.org/@octokit/rest/-/rest-16.34.0.tgz#8703e46d7e9f6aec24a7e591b073f325ca13f6e2"
|
||||
integrity sha512-EBe5qMQQOZRuezahWCXCnSe0J6tAqrW2hrEH9U8esXzKor1+HUDf8jgImaZf5lkTyWCQA296x9kAH5c0pxEgVQ==
|
||||
dependencies:
|
||||
"@octokit/request" "^5.2.0"
|
||||
"@octokit/request-error" "^1.0.2"
|
||||
atob-lite "^2.0.0"
|
||||
before-after-hook "^2.0.0"
|
||||
btoa-lite "^1.0.0"
|
||||
deprecation "^2.0.0"
|
||||
lodash.get "^4.4.2"
|
||||
lodash.set "^4.3.2"
|
||||
lodash.uniq "^4.5.0"
|
||||
octokit-pagination-methods "^1.1.0"
|
||||
once "^1.4.0"
|
||||
universal-user-agent "^4.0.0"
|
||||
|
||||
"@octokit/types@^1.0.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmjs.org/@octokit/types/-/types-1.1.0.tgz#6c9b286f9766f8cc6c5bab9fd3eb6a7aa019c586"
|
||||
integrity sha512-t4ZD74UnNVMq6kZBDZceflRKK3q4o5PoCKMAGht0RK84W57tqonqKL3vCxJHtbGExdan9RwV8r7VJBZxIM1O7Q==
|
||||
dependencies:
|
||||
"@types/node" "^12.11.1"
|
||||
|
||||
"@slack/logger@>=1.0.0 <3.0.0":
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/@slack/logger/-/logger-2.0.0.tgz#6a4e1c755849bc0f66dac08a8be54ce790ec0e6b"
|
||||
integrity sha512-OkIJpiU2fz6HOJujhlhfIGrc8hB4ibqtf7nnbJQDerG0BqwZCfmgtK5sWzZ0TkXVRBKD5MpLrTmCYyMxoMCgPw==
|
||||
dependencies:
|
||||
"@types/node" ">=8.9.0"
|
||||
|
||||
"@slack/types@^1.2.1":
|
||||
version "1.2.1"
|
||||
resolved "https://registry.npmjs.org/@slack/types/-/types-1.2.1.tgz#132d50d02efb452c9a58573964b22f5f18ab9b1a"
|
||||
integrity sha512-NyGh7MibW+a0OHkwwOPlv63hC639dzQdkFy4dj0tl4sAdZR4OBaE/OhXixKhCzcT3kJsPXaQmvkUN7sqSf52iA==
|
||||
|
||||
"@slack/web-api@^5.3.0":
|
||||
version "5.3.0"
|
||||
resolved "https://registry.npmjs.org/@slack/web-api/-/web-api-5.3.0.tgz#495a5a07ec700aca8281252af4a8e1d3e2fa7a0a"
|
||||
integrity sha512-VxFtA4X1t2qc7Mk7zbtI8mpx/HAU3QbnjjVkZv1D5MV3w7OVIJ0n/N9UjO1B6k1Xi8PHAdcJ4uCIV4BP4U/VsA==
|
||||
dependencies:
|
||||
"@slack/logger" ">=1.0.0 <3.0.0"
|
||||
"@slack/types" "^1.2.1"
|
||||
"@types/is-stream" "^1.1.0"
|
||||
"@types/node" ">=8.9.0"
|
||||
"@types/p-queue" "^2.3.2"
|
||||
axios "^0.18.0"
|
||||
eventemitter3 "^3.1.0"
|
||||
form-data "^2.5.0"
|
||||
is-stream "^1.1.0"
|
||||
p-queue "^2.4.2"
|
||||
p-retry "^4.0.0"
|
||||
|
||||
"@types/caseless@*":
|
||||
version "0.12.2"
|
||||
resolved "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8"
|
||||
integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==
|
||||
|
||||
"@types/fs-extra@^8.0.1":
|
||||
version "8.0.1"
|
||||
resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.1.tgz#a2378d6e7e8afea1564e44aafa2e207dadf77686"
|
||||
integrity sha512-J00cVDALmi/hJOYsunyT52Hva5TnJeKP5yd1r+mH/ZU0mbYZflR0Z5kw5kITtKTRYMhm1JMClOFYdHnQszEvqw==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/is-stream@^1.1.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmjs.org/@types/is-stream/-/is-stream-1.1.0.tgz#b84d7bb207a210f2af9bed431dc0fbe9c4143be1"
|
||||
integrity sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/mkdirp@^0.5.2":
|
||||
version "0.5.2"
|
||||
resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
|
||||
integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/node@*", "@types/node@>=8.9.0", "@types/node@^12.11.1":
|
||||
version "12.11.7"
|
||||
resolved "https://registry.npmjs.org/@types/node/-/node-12.11.7.tgz#57682a9771a3f7b09c2497f28129a0462966524a"
|
||||
integrity sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA==
|
||||
|
||||
"@types/p-queue@^2.3.2":
|
||||
version "2.3.2"
|
||||
resolved "https://registry.npmjs.org/@types/p-queue/-/p-queue-2.3.2.tgz#16bc5fece69ef85efaf2bce8b13f3ebe39c5a1c8"
|
||||
integrity sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ==
|
||||
|
||||
"@types/request-promise-native@^1.0.17":
|
||||
version "1.0.17"
|
||||
resolved "https://registry.npmjs.org/@types/request-promise-native/-/request-promise-native-1.0.17.tgz#74a2d7269aebf18b9bdf35f01459cf0a7bfc7fab"
|
||||
integrity sha512-05/d0WbmuwjtGMYEdHIBZ0tqMJJQ2AD9LG2F6rKNBGX1SSFR27XveajH//2N/XYtual8T9Axwl+4v7oBtPUZqg==
|
||||
dependencies:
|
||||
"@types/request" "*"
|
||||
|
||||
"@types/request@*":
|
||||
version "2.48.3"
|
||||
resolved "https://registry.npmjs.org/@types/request/-/request-2.48.3.tgz#970b8ed2317568c390361d29c555a95e74bd6135"
|
||||
integrity sha512-3Wo2jNYwqgXcIz/rrq18AdOZUQB8cQ34CXZo+LUwPJNpvRAL86+Kc2wwI8mqpz9Cr1V+enIox5v+WZhy/p3h8w==
|
||||
dependencies:
|
||||
"@types/caseless" "*"
|
||||
"@types/node" "*"
|
||||
"@types/tough-cookie" "*"
|
||||
form-data "^2.5.0"
|
||||
|
||||
"@types/retry@^0.12.0":
|
||||
version "0.12.0"
|
||||
resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d"
|
||||
integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==
|
||||
|
||||
"@types/tough-cookie@*":
|
||||
version "2.3.5"
|
||||
resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz#9da44ed75571999b65c37b60c9b2b88db54c585d"
|
||||
integrity sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==
|
||||
|
||||
abort-controller@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
|
||||
integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
|
||||
dependencies:
|
||||
event-target-shim "^5.0.0"
|
||||
|
||||
agent-base@^4.3.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
|
||||
integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
|
||||
dependencies:
|
||||
es6-promisify "^5.0.0"
|
||||
|
||||
asynckit@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
|
||||
|
||||
atob-lite@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696"
|
||||
integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=
|
||||
|
||||
axios@^0.18.0:
|
||||
version "0.18.1"
|
||||
resolved "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3"
|
||||
integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==
|
||||
dependencies:
|
||||
follow-redirects "1.5.10"
|
||||
is-buffer "^2.0.2"
|
||||
|
||||
base64-js@^1.3.0:
|
||||
version "1.3.1"
|
||||
resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
|
||||
integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
|
||||
|
||||
before-after-hook@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635"
|
||||
integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==
|
||||
|
||||
bignumber.js@^7.0.0:
|
||||
version "7.2.1"
|
||||
resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f"
|
||||
integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==
|
||||
|
||||
btoa-lite@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337"
|
||||
integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc=
|
||||
|
||||
buffer-equal-constant-time@1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
|
||||
integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
|
||||
|
||||
combined-stream@^1.0.6:
|
||||
version "1.0.8"
|
||||
resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
|
||||
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
|
||||
dependencies:
|
||||
delayed-stream "~1.0.0"
|
||||
|
||||
cross-spawn@^6.0.0:
|
||||
version "6.0.5"
|
||||
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
|
||||
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
|
||||
dependencies:
|
||||
nice-try "^1.0.4"
|
||||
path-key "^2.0.1"
|
||||
semver "^5.5.0"
|
||||
shebang-command "^1.2.0"
|
||||
which "^1.2.9"
|
||||
|
||||
debug@=3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
|
||||
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
|
||||
dependencies:
|
||||
ms "2.0.0"
|
||||
|
||||
debug@^3.1.0:
|
||||
version "3.2.6"
|
||||
resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
|
||||
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
|
||||
dependencies:
|
||||
ms "^2.1.1"
|
||||
|
||||
delayed-stream@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
|
||||
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
|
||||
|
||||
deprecation@^2.0.0:
|
||||
version "2.3.1"
|
||||
resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
|
||||
integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
|
||||
|
||||
ecdsa-sig-formatter@1.0.11:
|
||||
version "1.0.11"
|
||||
resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
|
||||
integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
|
||||
dependencies:
|
||||
safe-buffer "^5.0.1"
|
||||
|
||||
end-of-stream@^1.1.0:
|
||||
version "1.4.4"
|
||||
resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
|
||||
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
|
||||
dependencies:
|
||||
once "^1.4.0"
|
||||
|
||||
es6-promise@^4.0.3:
|
||||
version "4.2.8"
|
||||
resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
|
||||
integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
|
||||
|
||||
es6-promisify@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
|
||||
integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
|
||||
dependencies:
|
||||
es6-promise "^4.0.3"
|
||||
|
||||
event-target-shim@^5.0.0:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
|
||||
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
|
||||
|
||||
eventemitter3@^3.1.0:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
|
||||
integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==
|
||||
|
||||
execa@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
|
||||
integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
|
||||
dependencies:
|
||||
cross-spawn "^6.0.0"
|
||||
get-stream "^4.0.0"
|
||||
is-stream "^1.1.0"
|
||||
npm-run-path "^2.0.0"
|
||||
p-finally "^1.0.0"
|
||||
signal-exit "^3.0.0"
|
||||
strip-eof "^1.0.0"
|
||||
|
||||
extend@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
|
||||
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
|
||||
|
||||
fast-text-encoding@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz#3e5ce8293409cfaa7177a71b9ca84e1b1e6f25ef"
|
||||
integrity sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==
|
||||
|
||||
follow-redirects@1.5.10:
|
||||
version "1.5.10"
|
||||
resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
|
||||
integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
|
||||
dependencies:
|
||||
debug "=3.1.0"
|
||||
|
||||
form-data@^2.5.0:
|
||||
version "2.5.1"
|
||||
resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4"
|
||||
integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==
|
||||
dependencies:
|
||||
asynckit "^0.4.0"
|
||||
combined-stream "^1.0.6"
|
||||
mime-types "^2.1.12"
|
||||
|
||||
fs-extra@^8.1.0:
|
||||
version "8.1.0"
|
||||
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
|
||||
integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
|
||||
dependencies:
|
||||
graceful-fs "^4.2.0"
|
||||
jsonfile "^4.0.0"
|
||||
universalify "^0.1.0"
|
||||
|
||||
gaxios@^1.0.2, gaxios@^1.0.4, gaxios@^1.2.1, gaxios@^1.2.2:
|
||||
version "1.8.4"
|
||||
resolved "https://registry.npmjs.org/gaxios/-/gaxios-1.8.4.tgz#e08c34fe93c0a9b67a52b7b9e7a64e6435f9a339"
|
||||
integrity sha512-BoENMnu1Gav18HcpV9IleMPZ9exM+AvUjrAOV4Mzs/vfz2Lu/ABv451iEXByKiMPn2M140uul1txXCg83sAENw==
|
||||
dependencies:
|
||||
abort-controller "^3.0.0"
|
||||
extend "^3.0.2"
|
||||
https-proxy-agent "^2.2.1"
|
||||
node-fetch "^2.3.0"
|
||||
|
||||
gcp-metadata@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-1.0.0.tgz#5212440229fa099fc2f7c2a5cdcb95575e9b2ca6"
|
||||
integrity sha512-Q6HrgfrCQeEircnNP3rCcEgiDv7eF9+1B+1MMgpE190+/+0mjQR8PxeOaRgxZWmdDAF9EIryHB9g1moPiw1SbQ==
|
||||
dependencies:
|
||||
gaxios "^1.0.2"
|
||||
json-bigint "^0.3.0"
|
||||
|
||||
get-stream@^4.0.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
|
||||
integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
|
||||
dependencies:
|
||||
pump "^3.0.0"
|
||||
|
||||
google-auth-library@^3.0.0:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.1.2.tgz#ff2f88cd5cd2118a57bd3d5ad3c093c8837fc350"
|
||||
integrity sha512-cDQMzTotwyWMrg5jRO7q0A4TL/3GWBgO7I7q5xGKNiiFf9SmGY/OJ1YsLMgI2MVHHsEGyrqYnbnmV1AE+Z6DnQ==
|
||||
dependencies:
|
||||
base64-js "^1.3.0"
|
||||
fast-text-encoding "^1.0.0"
|
||||
gaxios "^1.2.1"
|
||||
gcp-metadata "^1.0.0"
|
||||
gtoken "^2.3.2"
|
||||
https-proxy-agent "^2.2.1"
|
||||
jws "^3.1.5"
|
||||
lru-cache "^5.0.0"
|
||||
semver "^5.5.0"
|
||||
|
||||
google-p12-pem@^1.0.0:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.4.tgz#b77fb833a2eb9f7f3c689e2e54f095276f777605"
|
||||
integrity sha512-SwLAUJqUfTB2iS+wFfSS/G9p7bt4eWcc2LyfvmUXe7cWp6p3mpxDo6LLI29MXdU6wvPcQ/up298X7GMC5ylAlA==
|
||||
dependencies:
|
||||
node-forge "^0.8.0"
|
||||
pify "^4.0.0"
|
||||
|
||||
googleapis-common@^0.7.0:
|
||||
version "0.7.2"
|
||||
resolved "https://registry.npmjs.org/googleapis-common/-/googleapis-common-0.7.2.tgz#a694f55d979cb7c2eac21a0e0439af12f9b418ba"
|
||||
integrity sha512-9DEJIiO4nS7nw0VE1YVkEfXEj8x8MxsuB+yZIpOBULFSN9OIKcUU8UuKgSZFU4lJmRioMfngktrbkMwWJcUhQg==
|
||||
dependencies:
|
||||
gaxios "^1.2.2"
|
||||
google-auth-library "^3.0.0"
|
||||
pify "^4.0.0"
|
||||
qs "^6.5.2"
|
||||
url-template "^2.0.8"
|
||||
uuid "^3.2.1"
|
||||
|
||||
googleapis@39:
|
||||
version "39.2.0"
|
||||
resolved "https://registry.npmjs.org/googleapis/-/googleapis-39.2.0.tgz#5c81f721e9da2e80cb0b25821ed60d3bc200c3da"
|
||||
integrity sha512-66X8TG1B33zAt177sG1CoKoYHPP/B66tEpnnSANGCqotMuY5gqSQO8G/0gqHZR2jRgc5CHSSNOJCnpI0SuDxMQ==
|
||||
dependencies:
|
||||
google-auth-library "^3.0.0"
|
||||
googleapis-common "^0.7.0"
|
||||
|
||||
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
|
||||
version "4.2.3"
|
||||
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
|
||||
integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
|
||||
|
||||
gtoken@^2.3.2:
|
||||
version "2.3.3"
|
||||
resolved "https://registry.npmjs.org/gtoken/-/gtoken-2.3.3.tgz#8a7fe155c5ce0c4b71c886cfb282a9060d94a641"
|
||||
integrity sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==
|
||||
dependencies:
|
||||
gaxios "^1.0.4"
|
||||
google-p12-pem "^1.0.0"
|
||||
jws "^3.1.5"
|
||||
mime "^2.2.0"
|
||||
pify "^4.0.0"
|
||||
|
||||
https-proxy-agent@^2.2.1:
|
||||
version "2.2.4"
|
||||
resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
|
||||
integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
|
||||
dependencies:
|
||||
agent-base "^4.3.0"
|
||||
debug "^3.1.0"
|
||||
|
||||
is-buffer@^2.0.2:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623"
|
||||
integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==
|
||||
|
||||
is-plain-object@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928"
|
||||
integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==
|
||||
dependencies:
|
||||
isobject "^4.0.0"
|
||||
|
||||
is-stream@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
||||
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
|
||||
|
||||
is-wsl@^2.1.0:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d"
|
||||
integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==
|
||||
|
||||
isexe@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
||||
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
|
||||
|
||||
isobject@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0"
|
||||
integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==
|
||||
|
||||
json-bigint@^0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz#0ccd912c4b8270d05f056fbd13814b53d3825b1e"
|
||||
integrity sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=
|
||||
dependencies:
|
||||
bignumber.js "^7.0.0"
|
||||
|
||||
jsonfile@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
|
||||
integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
jwa@^1.4.1:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
|
||||
integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
|
||||
dependencies:
|
||||
buffer-equal-constant-time "1.0.1"
|
||||
ecdsa-sig-formatter "1.0.11"
|
||||
safe-buffer "^5.0.1"
|
||||
|
||||
jws@^3.1.5:
|
||||
version "3.2.2"
|
||||
resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
|
||||
integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
|
||||
dependencies:
|
||||
jwa "^1.4.1"
|
||||
safe-buffer "^5.0.1"
|
||||
|
||||
lodash.get@^4.4.2:
|
||||
version "4.4.2"
|
||||
resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
|
||||
integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
|
||||
|
||||
lodash.set@^4.3.2:
|
||||
version "4.3.2"
|
||||
resolved "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
|
||||
integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=
|
||||
|
||||
lodash.uniq@^4.5.0:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
|
||||
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
|
||||
|
||||
lodash@^4.17.11:
|
||||
version "4.17.15"
|
||||
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
|
||||
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
|
||||
|
||||
lru-cache@^5.0.0:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
|
||||
integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
|
||||
dependencies:
|
||||
yallist "^3.0.2"
|
||||
|
||||
macos-release@^2.2.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f"
|
||||
integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==
|
||||
|
||||
mime-db@1.40.0:
|
||||
version "1.40.0"
|
||||
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
|
||||
integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==
|
||||
|
||||
mime-types@^2.1.12:
|
||||
version "2.1.24"
|
||||
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
|
||||
integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
|
||||
dependencies:
|
||||
mime-db "1.40.0"
|
||||
|
||||
mime@^2.2.0:
|
||||
version "2.4.4"
|
||||
resolved "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5"
|
||||
integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==
|
||||
|
||||
minimist@0.0.8:
|
||||
version "0.0.8"
|
||||
resolved "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
|
||||
|
||||
mkdirp@^0.5.1:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
||||
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
|
||||
dependencies:
|
||||
minimist "0.0.8"
|
||||
|
||||
ms@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
||||
|
||||
ms@^2.1.1:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||
|
||||
nice-try@^1.0.4:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
|
||||
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
|
||||
|
||||
node-fetch@^2.3.0:
|
||||
version "2.6.0"
|
||||
resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
|
||||
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
|
||||
|
||||
node-forge@^0.8.0:
|
||||
version "0.8.5"
|
||||
resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.8.5.tgz#57906f07614dc72762c84cef442f427c0e1b86ee"
|
||||
integrity sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==
|
||||
|
||||
npm-run-path@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
|
||||
integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
|
||||
dependencies:
|
||||
path-key "^2.0.0"
|
||||
|
||||
octokit-pagination-methods@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4"
|
||||
integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==
|
||||
|
||||
once@^1.3.1, once@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
|
||||
dependencies:
|
||||
wrappy "1"
|
||||
|
||||
open@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.npmjs.org/open/-/open-7.0.0.tgz#7e52999b14eb73f90f0f0807fe93897c4ae73ec9"
|
||||
integrity sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ==
|
||||
dependencies:
|
||||
is-wsl "^2.1.0"
|
||||
|
||||
os-name@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801"
|
||||
integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==
|
||||
dependencies:
|
||||
macos-release "^2.2.0"
|
||||
windows-release "^3.1.0"
|
||||
|
||||
p-finally@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
|
||||
integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
|
||||
|
||||
p-queue@^2.4.2:
|
||||
version "2.4.2"
|
||||
resolved "https://registry.npmjs.org/p-queue/-/p-queue-2.4.2.tgz#03609826682b743be9a22dba25051bd46724fc34"
|
||||
integrity sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng==
|
||||
|
||||
p-retry@^4.0.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.1.0.tgz#9ce7cef2069e84bf590df3b8ec18d740109338d6"
|
||||
integrity sha512-oepllyG9gX1qH4Sm20YAKxg1GA7L7puhvGnTfimi31P07zSIj7SDV6YtuAx9nbJF51DES+2CIIRkXs8GKqWJxA==
|
||||
dependencies:
|
||||
"@types/retry" "^0.12.0"
|
||||
retry "^0.12.0"
|
||||
|
||||
path-key@^2.0.0, path-key@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
|
||||
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
|
||||
|
||||
pify@^4.0.0:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
|
||||
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
|
||||
|
||||
psl@^1.1.28:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2"
|
||||
integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==
|
||||
|
||||
pump@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
|
||||
integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
|
||||
dependencies:
|
||||
end-of-stream "^1.1.0"
|
||||
once "^1.3.1"
|
||||
|
||||
punycode@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
|
||||
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
|
||||
|
||||
qs@^6.5.2:
|
||||
version "6.9.0"
|
||||
resolved "https://registry.npmjs.org/qs/-/qs-6.9.0.tgz#d1297e2a049c53119cb49cca366adbbacc80b409"
|
||||
integrity sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==
|
||||
|
||||
request-promise-core@1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346"
|
||||
integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==
|
||||
dependencies:
|
||||
lodash "^4.17.11"
|
||||
|
||||
request-promise-native@^1.0.7:
|
||||
version "1.0.7"
|
||||
resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59"
|
||||
integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==
|
||||
dependencies:
|
||||
request-promise-core "1.1.2"
|
||||
stealthy-require "^1.1.1"
|
||||
tough-cookie "^2.3.3"
|
||||
|
||||
retry@^0.12.0:
|
||||
version "0.12.0"
|
||||
resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
|
||||
integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
|
||||
|
||||
safe-buffer@^5.0.1:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
|
||||
integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
|
||||
|
||||
semver@^5.5.0:
|
||||
version "5.7.1"
|
||||
resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
|
||||
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
|
||||
|
||||
shebang-command@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
|
||||
integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
|
||||
dependencies:
|
||||
shebang-regex "^1.0.0"
|
||||
|
||||
shebang-regex@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
|
||||
integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
|
||||
|
||||
signal-exit@^3.0.0:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
|
||||
integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
|
||||
|
||||
stealthy-require@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
|
||||
integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
|
||||
|
||||
strip-eof@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
|
||||
integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
|
||||
|
||||
tough-cookie@^2.3.3:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
|
||||
integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
|
||||
dependencies:
|
||||
psl "^1.1.28"
|
||||
punycode "^2.1.1"
|
||||
|
||||
typescript@^3.6.4:
|
||||
version "3.6.4"
|
||||
resolved "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d"
|
||||
integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==
|
||||
|
||||
universal-user-agent@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.0.tgz#27da2ec87e32769619f68a14996465ea1cb9df16"
|
||||
integrity sha512-eM8knLpev67iBDizr/YtqkJsF3GK8gzDc6st/WKzrTuPtcsOKW/0IdL4cnMBsU69pOx0otavLWBDGTwg+dB0aA==
|
||||
dependencies:
|
||||
os-name "^3.1.0"
|
||||
|
||||
universalify@^0.1.0:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
|
||||
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
|
||||
|
||||
url-template@^2.0.8:
|
||||
version "2.0.8"
|
||||
resolved "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21"
|
||||
integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE=
|
||||
|
||||
uuid@^3.2.1:
|
||||
version "3.3.3"
|
||||
resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866"
|
||||
integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==
|
||||
|
||||
which@^1.2.9:
|
||||
version "1.3.1"
|
||||
resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
|
||||
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
|
||||
dependencies:
|
||||
isexe "^2.0.0"
|
||||
|
||||
windows-release@^3.1.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f"
|
||||
integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==
|
||||
dependencies:
|
||||
execa "^1.0.0"
|
||||
|
||||
wrappy@1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
||||
|
||||
yallist@^3.0.2:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
|
||||
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
|
||||
@ -4,34 +4,37 @@ It is not used for patch releases. See [patch_release_issue_template.md](patch_r
|
||||
for the patch release checklist.
|
||||
|
||||
Run a find replace on:
|
||||
- MAJOR.MINOR
|
||||
- YYYY-MM
|
||||
- $VERSION
|
||||
- $RELEASE_DATE
|
||||
- $FIVE_WORKING_DAYS_BEFORE_RELEASE
|
||||
- $FOUR_WORKING_DAYS_BEFORE_RELEASE
|
||||
- $THREE_WORKING_DAYS_BEFORE_RELEASE
|
||||
- $ONE_WORKING_DAY_BEFORE_RELEASE
|
||||
-->
|
||||
|
||||
# MAJOR.MINOR Release (YYYY-MM-20)
|
||||
# $VERSION Release ($RELEASE_DATE)
|
||||
|
||||
## At the start of the month (YYYY-MM-01)
|
||||
**Note:** All `yarn run release ...` commands should be run from `dev/release`.
|
||||
|
||||
- [ ] Choose dates/times for the steps in this release process and update this issue template accordingly. Note that this template references _working days_, which do not include weekends or holidays observed by Sourcegraph.
|
||||
- [ ] Add events to the shared Release Schedule calendar in Google and invite team@sourcegraph.com.
|
||||
- [ ] Creating the release branch.
|
||||
- [ ] Tagging the final release.
|
||||
- [ ] Publishing the blog post.
|
||||
- [ ] Send message to #dev-announce with a link to this tracking issue to notify the team of the release schedule.
|
||||
- [ ] Create the [retrospective document](retrospectives/index.md) and schedule the retrospective meeting within a few days _after_ the release. Send calendar invites to team@sourcegraph.com, and ensure there is a Zoom meeting on the invite.
|
||||
## At the start of the iteration
|
||||
|
||||
- [ ] Create the retrospective doc for the next iteration by copying the previous one.
|
||||
- [ ] Update `dev/release/config.json` with the parameters for the current release.
|
||||
- [ ] Add calendar events and reminders for key dates in the release cycle: `yarn run release add-timeline-to-calendar`
|
||||
- [ ] Create the release tracking issue (i.e., this issue): `yarn run release tracking-issue:create`
|
||||
- [ ] Post link to tracking to #dev-announce: `yarn run release tracking-issue:announce`
|
||||
- [ ] Create a new test grid for MAJOR.MINOR by cloning the previous [release testing grid on Monday.com](https://sourcegraph-team.monday.com) and renaming it to "MAJOR.MINOR Release test grid".
|
||||
- [ ] Reset all tested cells to "To test", unless the "Automated" column is marked as "Done". See [this article for how to update multiple values in Monday.com](https://support.monday.com/hc/en-us/articles/115005335049-Batch-Actions-Edit-multiple-items-in-one-click).
|
||||
- [ ] Assign rows in the release testing grid to engineers from the team that owns the row.
|
||||
- [ ] Create reminders for yourself to preform the remaining sections in this checklist at appropriate times.
|
||||
|
||||
## 5 working days before release (YYYY-MM-DD)
|
||||
## 5 working days before release ($FIVE_WORKING_DAYS_BEFORE_RELEASE)
|
||||
|
||||
- [ ] Use `./dev/release-ping.sh` to message teammates who have open issues / PRs in the milestone and ask them to remove those that won't be done by the time that the release branch is scheduled to be created.
|
||||
- [ ] Verify that there is a draft of the blog post and that it will be ready to be merged on time.
|
||||
- [ ] Ping each team, and ask them to identify which of the optional rows that they own on the release testing grid should be tested this iteration.
|
||||
- [ ] Ping the @distribution team to determine which environments each row on the release testing grid should be tested in.
|
||||
|
||||
## 4 working days before release (YYYY-MM-DD)
|
||||
## 4 working days before release ($FOUR_WORKING_DAYS_BEFORE_RELEASE)
|
||||
|
||||
- [ ] **HH:MM AM/PM PT** Add a new section header for this version to the [CHANGELOG](https://github.com/sourcegraph/sourcegraph/blob/master/CHANGELOG.md#unreleased) immediately under the `## Unreleased changes` heading and add new empty sections under `## Unreleased changes` ([example](https://github.com/sourcegraph/sourcegraph/pull/2323)).
|
||||
- [ ] Create the `MAJOR.MINOR` branch for this release off of the changelog commit that you created in the previous step.
|
||||
@ -80,9 +83,7 @@ Run a find replace on:
|
||||
```
|
||||
- [ ] Mention that testing is the top priority, it is expected to take the whole day, and that known or suspected regressions should be tagged as release blockers. Mention that, for other issues found, high-level details like customer impact should be added to help Product determine whether it's a release blocker.
|
||||
|
||||
|
||||
|
||||
## 3 working days before release (YYYY-MM-DD)
|
||||
## 3 working days before release ($THREE_WORKING_DAYS_BEFORE_RELEASE)
|
||||
|
||||
- [ ] Send a message to #dev-announce to report whether any [release blocking issues](releases.md#blocking) were found.
|
||||
- [ ] Add any [release blocking issues](releases.md#blocking) as checklist items here and start working to resolve them.
|
||||
@ -95,7 +96,7 @@ Run a find replace on:
|
||||
- Re-test any flows that might have been impacted by commits that have been cherry picked into the release branch.
|
||||
- Tag additional release candidates.
|
||||
|
||||
## 1 working day before release (YYYY-MM-DD)
|
||||
## 1 working day before release ($ONE_WORKING_DAY_BEFORE_RELEASE)
|
||||
|
||||
- [ ] **HH:MM AM/PM PT** Tag the final release.
|
||||
```
|
||||
|
||||
Loading…
Reference in New Issue
Block a user