1
0
mirror of synced 2025-12-21 19:06:49 -05:00
Files
docs/script/deployment/create-app.js
2021-09-08 00:53:42 +00:00

63 lines
1.7 KiB
JavaScript

#!/usr/bin/env node
import Heroku from 'heroku-client'
import createAppName from './create-staging-app-name.js'
export default async function createApp(pullRequest) {
// Extract some important properties from the PR
const {
number: pullNumber,
base: {
repo: { name: repo },
},
head: { ref: branch },
user: author,
} = pullRequest
const appName = createAppName({ prefix: 'ghd', repo, pullNumber, branch })
// Check if there's already a Heroku App for this PR, if not create one
let appExists = true
const heroku = new Heroku({ token: process.env.HEROKU_API_TOKEN })
try {
await heroku.get(`/apps/${appName}`)
} catch (e) {
appExists = false
}
if (!appExists) {
try {
const newApp = await heroku.post('/apps', {
body: {
name: appName,
},
})
console.log('Heroku App created', newApp)
} catch (error) {
throw new Error(`Failed to create Heroku App ${appName}. Error: ${error}`)
}
// Add PR author (if staff) as a collaborator on the new staging app
try {
if (author.site_admin === true) {
await heroku.post(`/apps/${appName}/collaborators`, {
body: {
user: `${author.login}@github.com`,
// We don't want an email invitation for every new staging app
silent: true,
},
})
console.log(`Added PR author @${author.login} as a Heroku app collaborator`)
}
} catch (error) {
// It's fine if this fails, it shouldn't block the app from deploying!
console.warn(`Warning: failed to add PR author as a Heroku app collaborator. Error: ${error}`)
}
} else {
console.log(`Heroku App ${appName} already exists.`)
}
return appName
}