forked from DavidWells/netlify-sentry-plugin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
121 lines (100 loc) · 3.91 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
The Sentry Netlify build plugin:
- Notifies Sentry of new releases being deployed.
- Uploads source maps to Sentry.
- Sends Sentry the commit SHA of HEAD to enable commit features.
*/
const fs = require('fs')
const path = require('path')
const SentryCli = require('@sentry/cli')
const { promisify, inspect } = require('util')
const writeFile = promisify(fs.writeFile)
const deleteFile = promisify(fs.unlink)
const CWD = path.resolve(process.cwd())
const SENTRY_CONFIG_PATH = path.resolve(CWD, '.sentryclirc')
const DEFAULT_SOURCE_MAP_URL_PREFIX = "~/"
module.exports = {
onPostBuild: async (pluginApi) => {
/*
// Uncomment this block to see all the values pluginApi has
console.log('---------------------------------------------------')
console.log('Netlify Build Plugin API values')
console.log(inspect(pluginApi, { showHidden: false, depth: null }))
console.log('---------------------------------------------------')
*/
const { constants, inputs, utils } = pluginApi
const { PUBLISH_DIR, IS_LOCAL } = constants
const RUNNING_IN_NETLIFY = !IS_LOCAL
/* Set the user input settings */
const sentryOrg = process.env.SENTRY_ORG || inputs.sentryOrg
const sentryProject = process.env.SENTRY_PROJECT || inputs.sentryProject
const sentryAuthToken = process.env.SENTRY_AUTH_TOKEN || inputs.sentryAuthToken
const sentryEnvironment = process.env.SENTRY_ENVIRONMENT || process.env.CONTEXT
const sourceMapPath = inputs.sourceMapPath || PUBLISH_DIR
const sourceMapUrlPrefix = inputs.sourceMapUrlPrefix || DEFAULT_SOURCE_MAP_URL_PREFIX
const skipSetCommits = inputs.skipSetCommits || false
if (RUNNING_IN_NETLIFY) {
await createSentryConfig({ sentryOrg, sentryProject, sentryAuthToken })
/* Notify Sentry of release being deployed on Netlify */
await sentryRelease({
sentryAuthToken,
sentryEnvironment,
sourceMapPath,
sourceMapUrlPrefix,
skipSetCommits
})
console.log()
console.log('Successfully notified Sentry of deployment!')
console.log()
await deleteSentryConfig()
}
}
}
async function sentryRelease({ sentryAuthToken, sentryEnvironment, sourceMapPath, sourceMapUrlPrefix, skipSetCommits }) {
// default config file is read from ~/.sentryclirc
if (!sentryAuthToken) {
throw new Error('SentryCLI needs an authentication token. Please set env variable SENTRY_AUTH_TOKEN')
}
const release = process.env.COMMIT_REF
const cli = new SentryCli()
console.log('Creating new release with version: ', release)
// https://docs.sentry.io/cli/releases/#creating-releases
await cli.releases.new(release)
// https://docs.sentry.io/cli/releases/#managing-release-artifacts
await cli.releases.uploadSourceMaps(release, {
debug: false,
include: [sourceMapPath],
urlPrefix: sourceMapUrlPrefix,
rewrite: true,
ignore: ['node_modules']
})
// https://docs.sentry.io/cli/releases/#sentry-cli-commit-integration
if (!skipSetCommits) {
const repository = process.env.REPOSITORY_URL.split('/').slice(-2).join('/')
await cli.releases.setCommits(release, {
repo: repository,
commit: process.env.COMMIT_REF
})
}
// https://docs.sentry.io/cli/releases/#finalizing-releases
await cli.releases.finalize(release)
// https://docs.sentry.io/cli/releases/#creating-deploys
await cli.releases.execute(['releases', 'deploys', release, 'new', '-e', sentryEnvironment])
}
async function createSentryConfig({ sentryOrg, sentryProject, sentryAuthToken }) {
const sentryConfigFile = `
[auth]
token=${sentryAuthToken}
[defaults]
project=${sentryProject}
org=${sentryOrg}
`
await writeFile(SENTRY_CONFIG_PATH, sentryConfigFile, { flag: 'w+' })
}
async function deleteSentryConfig() {
await deleteFile(SENTRY_CONFIG_PATH)
}
function fileExists(s) {
// eslint-disable-next-line
return new Promise( r => fs.access(s, fs.F_OK, e => r(!e)))
}