1 | _ = require 'lodash'
|
2 | path = require 'path'
|
3 | url = require 'url'
|
4 | yaml = require 'node-yaml'
|
5 | colors = require 'colors'
|
6 | fs = require 'fs'
|
7 | debug = require('debug')('deploy-state-util:project-service')
|
8 |
|
9 | class 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 |
|
77 | module.exports = ProjectService
|