From cbcfd75b31f1df9a9f4cdaf931d070dc59b2f1c6 Mon Sep 17 00:00:00 2001 From: Imran Iqbal Date: Wed, 20 Feb 2019 18:17:16 +0000 Subject: [PATCH] feat(semantic-release): configure for this formula * https://github.com/semantic-release/semantic-release - Fully automated version management and package publishing. * This commit introduces automation for the following processes: - (1) Version number bumped based on commit message types. - (2) Tags and releases created in GitHub. - (3) Changelog updated using the same content in the GitHub release. - (4) `FORMULA` version number updated. - (5) PR comments sent to inform which release includes the changes. --- .travis.yml | 23 +++++++++++ README.rst | 7 ++++ release-rules.js | 16 +++++++ release.config.js | 103 ++++++++++++++++++++++++++++++++++++++++++++++ update_FORMULA.sh | 2 + 5 files changed, 151 insertions(+) create mode 100644 release-rules.js create mode 100644 release.config.js create mode 100755 update_FORMULA.sh diff --git a/.travis.yml b/.travis.yml index dde9c8f1..1f9aebb4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,3 +17,26 @@ env: script: - bundle exec kitchen verify ${INSTANCE} +before_deploy: + # Only deploy if the build passed successfully + - test $TRAVIS_TEST_RESULT = 0 + +jobs: + # Only run if this is the `master` branch + if: branch = master + include: + # Define the release stage that runs semantic-release + - stage: release + language: node_js + node_js: lts/* + before_install: skip + script: + - npm install @semantic-release/changelog@3 -D + - npm install @semantic-release/exec@3 -D + - npm install @semantic-release/git@7 -D + deploy: + provider: script + skip_cleanup: true + script: + - npx semantic-release@15 + diff --git a/README.rst b/README.rst index 45cffbbb..d117a1a5 100644 --- a/README.rst +++ b/README.rst @@ -2,6 +2,13 @@ template-formula ================ +|img_travis| |img_sr| + +.. |img_travis| image:: https://travis-ci.com/saltstack-formulas/template-formula.svg?branch=master + :target: https://travis-ci.com/saltstack-formulas/template-formula +.. |img_sr| image:: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg + :target: https://github.com/semantic-release/semantic-release + A SaltStack formula that is empty. It has dummy content to help with a quick start on a new formula and it serves as a style guide. diff --git a/release-rules.js b/release-rules.js new file mode 100644 index 00000000..159cac30 --- /dev/null +++ b/release-rules.js @@ -0,0 +1,16 @@ +// No release is triggered for the types commented out below. +// Commits using these types will be incorporated into the next release. +module.exports = [ + {breaking: true, release: 'major'}, + // {type: 'build', release: 'patch'}, + // {type: 'chore', release: 'patch'}, + // {type: 'ci', release: 'patch'}, + {type: 'docs', release: 'patch'}, + {type: 'feat', release: 'minor'}, + {type: 'fix', release: 'patch'}, + {type: 'perf', release: 'patch'}, + {type: 'refactor', release: 'patch'}, + {type: 'revert', release: 'patch'}, + {type: 'style', release: 'patch'}, + {type: 'test', release: 'patch'}, +]; diff --git a/release.config.js b/release.config.js new file mode 100644 index 00000000..b07b1418 --- /dev/null +++ b/release.config.js @@ -0,0 +1,103 @@ +module.exports = { + branch: 'master', + plugins: [ + ['@semantic-release/commit-analyzer', { + preset: 'angular', + releaseRules: './release-rules.js', + }], + '@semantic-release/release-notes-generator', + ['@semantic-release/changelog', { + changelogFile: 'CHANGELOG.md', + changelogTitle: '# Changelog', + }], + ['@semantic-release/exec', { + prepareCmd: 'sh ./update_FORMULA.sh ${nextRelease.version}', + }], + ['@semantic-release/git', { + assets: ['CHANGELOG.md', 'FORMULA'], + }], + '@semantic-release/github', + ], + generateNotes: { + preset: 'angular', + writerOpts: { + // Required due to upstream bug preventing all types being displayed. + // Bug: https://github.com/conventional-changelog/conventional-changelog/issues/317 + // Fix: https://github.com/conventional-changelog/conventional-changelog/pull/410 + transform: (commit, context) => { + const issues = [] + + commit.notes.forEach(note => { + note.title = `BREAKING CHANGES` + }) + + if (commit.type === `feat`) { + commit.type = `Features` + } else if (commit.type === `fix`) { + commit.type = `Bug Fixes` + } else if (commit.type === `perf`) { + commit.type = `Performance Improvements` + } else if (commit.type === `revert`) { + commit.type = `Reverts` + } else if (commit.type === `docs`) { + commit.type = `Documentation` + } else if (commit.type === `style`) { + commit.type = `Styles` + } else if (commit.type === `refactor`) { + commit.type = `Code Refactoring` + } else if (commit.type === `test`) { + commit.type = `Tests` + } else if (commit.type === `build`) { + commit.type = `Build System` + } else if (commit.type === `ci`) { + commit.type = `Continuous Integration` + } else { + return + } + + if (commit.scope === `*`) { + commit.scope = `` + } + + if (typeof commit.hash === `string`) { + commit.hash = commit.hash.substring(0, 7) + } + + if (typeof commit.subject === `string`) { + let url = context.repository + ? `${context.host}/${context.owner}/${context.repository}` + : context.repoUrl + if (url) { + url = `${url}/issues/` + // Issue URLs. + commit.subject = commit.subject.replace(/#([0-9]+)/g, (_, issue) => { + issues.push(issue) + return `[#${issue}](${url}${issue})` + }) + } + if (context.host) { + // User URLs. + commit.subject = commit.subject.replace(/\B@([a-z0-9](?:-?[a-z0-9/]){0,38})/g, (_, username) => { + if (username.includes('/')) { + return `@${username}` + } + + return `[@${username}](${context.host}/${username})` + }) + } + } + + // remove references that already appear in the subject + commit.references = commit.references.filter(reference => { + if (issues.indexOf(reference.issue) === -1) { + return true + } + + return false + }) + + return commit + }, + }, + }, +}; diff --git a/update_FORMULA.sh b/update_FORMULA.sh new file mode 100755 index 00000000..8c4f3658 --- /dev/null +++ b/update_FORMULA.sh @@ -0,0 +1,2 @@ +#!/bin/sh +sed -i -e "s_^\(version:\).*_\1 ${1}_" FORMULA