Skip to content

Commit

Permalink
Merge branch 'caribou' into caribou
Browse files Browse the repository at this point in the history
  • Loading branch information
Patrick Heneise committed Aug 21, 2017
2 parents 6ce95c6 + 12b3539 commit 830291c
Show file tree
Hide file tree
Showing 10 changed files with 7,717 additions and 181 deletions.
17 changes: 6 additions & 11 deletions .travis.yml
@@ -1,22 +1,17 @@
sudo: false
dist: trusty
language: node_js
cache:
directories:
- node_modules
- $HOME/.npm
notifications:
email: false
node_js:
- 5
- 4
- iojs
- '0.12'
- '0.10'
before_install:
- npm i -g npm@^2.0.0
before_script:
- npm prune
- 8
after_success:
- npm run coverage:upload
- npm run semantic-release
services:
- couchdb
branches:
except:
- /^v\d+\.\d+\.\d+$/
10 changes: 8 additions & 2 deletions README.md
Expand Up @@ -106,7 +106,7 @@ format that includes a **type**, a **scope** and a **subject** ([full explanatio
<footer>
```

You can simplify using this convention for yourself and contributors by using [commitizen](https://github.com/commitizen/cz-cli) and [validate-commit-msg](https://github.com/kentcdodds/validate-commit-msg).
You can simplify using this convention for yourself and contributors by using [commitizen](https://github.com/commitizen/cz-cli) and [validate-commit-msg](https://github.com/kentcdodds/validate-commit-msg) or [semantic-git-commit-cli](https://github.com/JPeer264/node-semantic-git-commit-cli).

### Patch Release

Expand Down Expand Up @@ -262,7 +262,13 @@ It is indeed a great idea because it _forces_ you to follow best practices. If y

### Why should I trust `semantic-release` with my releases?

`semantic-release` has a full unit- and integration-test-suite that tests _actual_ `npm` publishes against the [npm-registry-couchapp](https://github.com/npm/npm-registry-couchapp/) on all major node.js versions from `^0.10` on. A new version won’t get published if it doesn’t pass on all these engines.
`semantic-release` has a full unit- and integration-test-suite that tests _actual_ `npm` publishes against the [npm-registry-couchapp](https://github.com/npm/npm-registry-couchapp/). A new version won’t get published if it doesn’t pass on all these engines.

### Why does `semantic-release` require node version >= 8

Being able to write code for just the most recent node versions greatly simplifies development. More language features are available, no transpilation is required, less test builds are to be run, awaited and debugged.

For a special purpose tool like `semantic-release`, that's only meant to be used in controlled CI environments, we think it's okay to have such a high version requirement. As `semantic-release` handles package publishing we expect almost every project to have at least one build job running node 8 already – and that's all it takes. Even if that's not that case `semantic-release` can still be executed with the help of [npx](https://www.npmjs.com/package/npx) (`npx -p node@8 npm run semantic-release`).

## Badge

Expand Down
172 changes: 16 additions & 156 deletions bin/semantic-release.js
@@ -1,165 +1,25 @@
#!/usr/bin/env node

var fs = require('fs')
var path = require('path')
var url = require('url')
// Bad news: We have to write plain ES5 in this file
// Good news: It's the only file of the entire project

var _ = require('lodash')
var log = require('npmlog')
var nopt = require('nopt')
var npmconf = require('npmconf')
var normalizeData = require('normalize-package-data')
var semver = require('semver')

log.heading = 'semantic-release'
var env = process.env
var pkg = JSON.parse(fs.readFileSync('./package.json'))
var originalPkg = _.cloneDeep(pkg)
normalizeData(pkg)
var knownOptions = {
branch: String,
debug: Boolean,
'github-token': String,
'github-url': String,
'analyze-commits': [path, String],
'generate-notes': [path, String],
'verify-conditions': [path, String],
'verify-release': [path, String]
}
var options = _.defaults(
_.mapKeys(nopt(knownOptions), function (value, key) {
return _.camelCase(key)
}),
pkg.release,
{
branch: 'master',
fallbackTags: {
next: 'latest'
},
debug: !env.CI,
githubToken: env.GH_TOKEN || env.GITHUB_TOKEN,
githubUrl: env.GH_URL
}
)
var plugins = require('../src/lib/plugins')(options)

npmconf.load({}, function (err, conf) {
if (err) {
log.error('init', 'Failed to load npm config.', err)
process.exit(1)
}

var npm = {
auth: {
token: env.NPM_TOKEN
},
cafile: conf.get('cafile'),
loglevel: conf.get('loglevel'),
registry: require('../src/lib/get-registry')(pkg, conf),
tag: (pkg.publishConfig || {}).tag || conf.get('tag') || 'latest'
}

// normalize trailing slash
npm.registry = url.format(url.parse(npm.registry))

log.level = npm.loglevel

var config = {
env: env,
pkg: pkg,
options: options,
plugins: plugins,
npm: npm
}

var hide = {}
if (options.githubToken) hide.githubToken = '***'

log.verbose('init', 'options:', _.assign({}, options, hide))
log.verbose('init', 'Verifying config.')

var errors = require('../src/lib/verify')(config)
errors.forEach(function (err) {
log.error('init', err.message + ' ' + err.code)
})
if (errors.length) process.exit(1)

if (options.argv.remain[0] === 'pre') {
log.verbose('pre', 'Running pre-script.')
log.verbose('pre', 'Veriying conditions.')

plugins.verifyConditions(config, function (err) {
if (err) {
log[options.debug ? 'warn' : 'error']('pre', err.message)
if (!options.debug) process.exit(1)
}
if (semver.lt(process.version, '8.0.0')) {
console.error(
`semantic-release: node version >= 8 is required. Found ${process.version}.
var nerfDart = require('nerf-dart')(npm.registry)
var wroteNpmRc = false
If there is another job running on node version >= 8, it will be picked as
the build leader and you can safely ignore this message.
if (env.NPM_OLD_TOKEN && env.NPM_EMAIL) {
// Using the old auth token format is not considered part of the public API
// This might go away anytime (i.e. once we have a better testing strategy)
conf.set('_auth', '${NPM_OLD_TOKEN}', 'project') // eslint-disable-line no-template-curly-in-string
conf.set('email', '${NPM_EMAIL}', 'project') // eslint-disable-line no-template-curly-in-string
wroteNpmRc = true
} else if (env.NPM_TOKEN) {
conf.set(nerfDart + ':_authToken', '${NPM_TOKEN}', 'project') // eslint-disable-line no-template-curly-in-string
wroteNpmRc = true
}
If you don't have node 8 in your build matrix you can use "npx" to restore
compatibility with minimal overhead:
conf.save('project', function (err) {
if (err) return log.error('pre', 'Failed to save npm config.', err)
$ npx -p node@8 npm run semantic-release
if (wroteNpmRc) log.verbose('pre', 'Wrote authToken to .npmrc.')

require('../src/pre')(config, function (err, release) {
if (err) {
log.error('pre', 'Failed to determine new version.')

var args = ['pre', (err.code ? err.code + ' ' : '') + err.message]
if (err.stack) args.push(err.stack)
log.error.apply(log, args)
process.exit(1)
}

var message = 'Determined version ' + release.version + ' as "' + npm.tag + '".'

log.verbose('pre', message)

if (options.debug) {
log.error('pre', message + ' Not publishing in debug mode.', release)
process.exit(1)
}

try {
var shrinkwrap = JSON.parse(fs.readFileSync('./npm-shrinkwrap.json'))
shrinkwrap.version = release.version
fs.writeFileSync('./npm-shrinkwrap.json', JSON.stringify(shrinkwrap, null, 2))
log.verbose('pre', 'Wrote version ' + release.version + 'to npm-shrinkwrap.json.')
} catch (e) {
log.silly('pre', 'Couldn\'t find npm-shrinkwrap.json.')
}

fs.writeFileSync('./package.json', JSON.stringify(_.assign(originalPkg, {
version: release.version
}), null, 2))

log.verbose('pre', 'Wrote version ' + release.version + ' to package.json.')
})
})
})
} else if (options.argv.remain[0] === 'post') {
log.verbose('post', 'Running post-script.')

require('../src/post')(config, function (err, published, release) {
if (err) {
log.error('post', 'Failed to publish release notes.', err)
process.exit(1)
}
npx is bundled with npm >= 5.4, or available via npm. More info: npm.im/npx`)
process.exit(1)
}

log.verbose('post', (published ? 'Published' : 'Generated') + ' release notes.', release)
})
} else {
log.error('post', 'Command "' + options.argv.remain[0] + '" not recognized. Use either "pre" or "post"')
}
})
// node 8+ from this point on
require('../src')

0 comments on commit 830291c

Please sign in to comment.