UNPKG

3.27 kBtext/coffeescriptView Raw
1_ = require 'lodash'
2path = require 'path'
3url = require 'url'
4yaml = require 'node-yaml'
5colors = require 'colors'
6fs = require 'fs'
7debug = require('debug')('deploy-state-util:project-service')
8
9class ProjectService
10 constructor: ({ config }) ->
11 throw new Error 'Missing config argument' unless config?
12 @travisYml = path.join process.cwd(), '.travis.yml'
13 @packagePath = path.join process.cwd(), 'package.json'
14 @dockerFilePath = path.join process.cwd(), 'Dockerfile'
15 @webhookUrl = url.format {
16 hostname: config['deploy-state'].hostname,
17 protocol: 'https',
18 slashes: true,
19 pathname: '/deployments/travis-ci'
20 }
21
22 configure: ({ isPrivate }, callback) =>
23 @_modifyTravis { isPrivate }, (error) =>
24 return callback error if error?
25 @_modifyDockerfile (error) =>
26 return callback error if error?
27 @_modifyPackage callback
28
29 _modifyPackage: (callback) =>
30 try
31 packageJSON = _.cloneDeep require @packagePath
32 catch error
33 debug 'modify package.json require error', error
34 return callback() unless packageJSON?
35 orgPackage = _.cloneDeep packageJSON
36 packageJSON.scripts ?= {}
37 packageJSON.scripts['test'] ?= 'mocha'
38 packageJSON.scripts['coverage'] ?= 'nyc npm test'
39 packageJSON.scripts['mocha:json'] ?= 'env NPM_ENV=test mocha --reporter json > coverage/mocha.json'
40 packageJSON.scripts['test:watch'] ?= 'mocha -w -R mocha-multi --reporter-options spec=-,mocha-osx-reporter=-'
41 packageJSON.devDependencies ?= {}
42 packageJSON.devDependencies['nyc'] ?= '^8.3.0'
43 packageJSON.devDependencies['mocha-osx-reporter'] ?= '^0.1.2'
44 packageJSON.devDependencies['mocha-multi'] ?= '^0.9.1'
45 packageJSON.devDependencies['mocha'] ?= '^2.5.3'
46 return callback null if _.isEqual packageJSON, orgPackage
47 console.log colors.magenta('NOTICE'), colors.white('modifying package.json - make sure you run npm install')
48 packageStr = JSON.stringify(packageJSON, null, 2)
49 fs.writeFile @packagePath, "#{packageStr}\n", callback
50
51 _modifyTravis: ({ isPrivate }, callback) =>
52 yaml.read @travisYml, (error, data) =>
53 return callback error if error?
54 return callback new Error('Missing .travis.yml') unless data?
55 orgData = _.cloneDeep data
56 type = 'pro' if isPrivate
57 type ?= 'org'
58 _.set data, 'notifications.webhooks', "#{@webhookUrl}/#{type}"
59 data.after_success ?= []
60 after_success = [
61 'npm run coverage'
62 'npm run mocha:json'
63 'bash <(curl -s https://codecov.io/bash)'
64 'bash <(curl -s https://codecov.octoblu.com/bash)'
65 ]
66 _.pullAll data.after_success, after_success
67 data.after_success = _.concat data.after_success, after_success
68 return callback null if _.isEqual orgData, data
69 console.log colors.magenta('NOTICE'), colors.white('modifying .travis.yml')
70 yaml.write @travisYml, data, callback
71
72 _modifyDockerfile: (callback) =>
73 console.log colors.magenta('NOTICE'), colors.white('make sure you add a HEALTHCHECK to your Dockerfile')
74 console.log ' ', colors.cyan('Example'), colors.white('`HEALTHCHECK CMD curl --fail http://localhost:80/healthcheck || exit 1`')
75 callback null
76
77module.exports = ProjectService