conventional-changelog-action/src/index.js

135 lines
4.8 KiB
JavaScript

const core = require('@actions/core')
const conventionalRecommendedBump = require('conventional-recommended-bump')
const path = require('path')
const getVersioning = require('./version')
const git = require('./helpers/git')
const changelog = require('./helpers/generateChangelog')
async function run() {
try {
const gitCommitMessage = core.getInput('git-message')
const gitUserName = core.getInput('git-user-name')
const gitUserEmail = core.getInput('git-user-email')
const tagPrefix = core.getInput('tag-prefix')
const preset = core.getInput('preset')
const preCommit = core.getInput('pre-commit')
const outputFile = core.getInput('output-file')
const releaseCount = core.getInput('release-count')
const versionFile = core.getInput('version-file')
const versionPath = core.getInput('version-path')
const skipVersionFile = core.getInput('skip-version-file').toLowerCase() === 'true'
const skipCommit = core.getInput('skip-commit').toLowerCase() === 'true'
const skipEmptyRelease = core.getInput('skip-on-empty').toLowerCase() === 'true'
core.info(`Using "${preset}" preset`)
core.info(`Using "${gitCommitMessage}" as commit message`)
core.info(`Using "${gitUserName}" as git user.name`)
core.info(`Using "${gitUserEmail}" as git user.email`)
core.info(`Using "${releaseCount}" release count`)
core.info(`Using "${versionFile}" as version file`)
core.info(`Using "${versionPath}" as version path`)
core.info(`Using "${tagPrefix}" as tag prefix`)
core.info(`Using "${outputFile}" as output file`)
if (preCommit) {
core.info(`Using "${preCommit}" as pre-commit script`)
}
core.info(`Skipping empty releases is "${skipEmptyRelease ? 'enabled' : 'disabled'}"`)
core.info(`Skipping the update of the version file is "${skipVersionFile ? 'enabled' : 'disabled'}"`)
core.info('Pull to make sure we have the full git history')
await git.pull()
conventionalRecommendedBump({ preset, tagPrefix }, async(error, recommendation) => {
if (error) {
core.setFailed(error.message)
return
}
core.info(`Recommended release type: ${recommendation.releaseType}`)
// If we have a reason also log it
if (recommendation.reason) {
core.info(`Because: ${recommendation.reason}`)
}
// If skipVersionFile or skipCommit is true we use GIT to determine the new version because
// skipVersionFile can mean there is no version file and skipCommit can mean that the user
// is only interested in tags
const fileExtension = skipVersionFile || skipCommit
? 'git'
: versionFile.split('.').pop()
const versioning = getVersioning(fileExtension)
// File type not supported
if (versioning === null) {
throw new Error(`File extension "${fileExtension}" from file "${versionFile}" is not supported`)
}
versioning.init(path.resolve(versionFile), versionPath)
// Bump the version in the package.json
await versioning.bump(
recommendation.releaseType,
)
// Generate the string changelog
const stringChangelog = await changelog.generateStringChangelog(tagPrefix, preset, versioning.newVersion, 1)
core.info('Changelog generated')
core.info(stringChangelog)
// Removes the version number from the changelog
const cleanChangelog = stringChangelog.split('\n').slice(3).join('\n').trim()
if (skipEmptyRelease && cleanChangelog === '') {
core.info('Generated changelog is empty and skip-on-empty has been activated so we skip this step')
core.setOutput('skipped', 'true')
return
}
core.info(`New version: ${versioning.newVersion}`)
// If output file === 'false' we don't write it to file
if (outputFile !== 'false') {
// Generate the changelog
await changelog.generateFileChangelog(tagPrefix, preset, versioning.newVersion, outputFile, releaseCount)
}
const gitTag = `${tagPrefix}${versioning.newVersion}`
if (!skipCommit) {
// Add changed files to git
if (preCommit) {
await require(path.resolve(preCommit)).preCommit({
tag: gitTag,
version: versioning.newVersion,
})
}
await git.add('.')
await git.commit(gitCommitMessage.replace('{version}', gitTag))
}
// Create the new tag
await git.createTag(gitTag)
core.info('Push all changes')
await git.push()
// Set outputs so other actions (for example actions/create-release) can use it
core.setOutput('changelog', stringChangelog)
core.setOutput('clean_changelog', cleanChangelog)
core.setOutput('version', versioning.newVersion)
core.setOutput('tag', gitTag)
core.setOutput('skipped', 'false')
})
} catch (error) {
core.setFailed(error.message)
}
}
run()