autotag/app/main.js

128 lines
4.5 KiB
JavaScript
Raw Normal View History

import core from '@actions/core'
import os from 'os'
import semver from 'semver'
import Setup from './lib/setup.js'
import Package from './lib/package.js'
import Tag from './lib/tag.js'
import Regex from './lib/regex.js'
2020-04-03 01:58:51 +07:00
import Dockerfile from './lib/docker.js'
async function run () {
try {
Setup.debug()
Setup.requireAnyEnv('GITHUB_TOKEN', 'INPUT_GITHUB_TOKEN')
2020-04-02 01:41:56 +07:00
// Configure the default output
core.setOutput('tagcreated', 'no')
// Identify the tag parsing strategy
2020-04-02 01:51:57 +07:00
const strategy = (core.getInput('regex_pattern', { required: false }) || '').trim().length > 0 ? 'regex' : ((core.getInput('strategy', { required: false }) || 'package').trim().toLowerCase())
2022-10-13 05:39:08 +07:00
const root = core.getInput('root', { required: false }) || core.getInput('package_root', { required: false }) || (strategy === 'composer' ? 'composer.json' : null)
2021-06-02 17:53:21 +07:00
// If this value is true, the tag will not be pushed
const isDryRun = (core.getInput('dry_run', { required: false }) || '').trim().toLowerCase() === 'true'
2022-10-13 06:31:39 +07:00
console.log({isDryRun})
// Extract the version number using the supplied strategy
let version = core.getInput('root', { required: false })
version = version === null || version.trim().length === 0 ? null : version
const pattern = core.getInput('regex_pattern', { required: false })
switch (strategy) {
case 'docker':
2022-10-13 05:39:08 +07:00
version = version || (new Dockerfile(root || './')).version
break
2022-10-13 05:34:21 +07:00
case 'composer':
case 'package':
// Extract using the package strategy (this is the default strategy)
2022-10-13 05:39:08 +07:00
version = version || (new Package(root || './package.json')).version
break
case 'regex':
2022-10-13 00:23:41 +07:00
version = version || (new Regex(root, new RegExp(pattern, 'gim'))).version
break
default:
2022-10-13 05:34:21 +07:00
core.setFailed(`"${strategy}" is not a recognized tagging strategy. Choose from: 'package' (package.json), 'composer' (composer.json), 'docker' (uses Dockerfile), or 'regex' (JS-based RegExp).`)
return
}
const msg = ` using the ${strategy} extraction${strategy === 'regex' ? ' with the /' + pattern + '/gim pattern.' : ''}.`
if (!version) {
throw new Error(`No version identified${msg}`)
}
const minVersion = core.getInput('min_version', { required: false })
2022-10-13 05:34:21 +07:00
// Ensure that version and minVersion are valid SemVer strings
const minVersionSemVer = semver.coerce(minVersion)
const versionSemVer = semver.coerce(version)
if (!minVersionSemVer) {
core.warning(`Skipping min version check. ${minVersion} is not valid SemVer`)
}
if(!versionSemVer) {
core.warning(`Skipping min version check. ${version} is not valid SemVer`)
}
2022-10-13 05:34:21 +07:00
2021-02-01 17:12:31 +07:00
if (minVersionSemVer && versionSemVer && semver.lt(versionSemVer, minVersionSemVer)) {
2021-01-30 22:09:56 +07:00
core.warning(`Version "${version}" is lower than minimum "${minVersion}"`)
return
}
core.warning(`Recognized "${version}"${msg}`)
core.setOutput('version', version)
core.debug(` Detected version ${version}`)
// Configure a tag using the identified version
const tag = new Tag(
core.getInput('tag_prefix', { required: false }),
version,
core.getInput('tag_suffix', { required: false })
)
if (isDryRun) {
2022-10-12 23:48:09 +07:00
core.warning(`"${tag.name}" tag is not pushed because the dry_run option was set.`)
2021-06-02 17:53:21 +07:00
} else {
core.warning(`Attempting to create ${tag.name} tag.`)
}
core.setOutput('tagrequested', tag.name)
core.setOutput('prerelease', tag.prerelease ? 'yes' : 'no')
core.setOutput('build', tag.build ? 'yes' : 'no')
2020-04-02 02:28:38 +07:00
// Check for existance of tag and abort (short circuit) if it already exists.
if (await tag.exists()) {
2021-06-02 17:53:21 +07:00
core.setFailed(`"${tag.name}" tag already exists.` + os.EOL)
core.setOutput('tagname', '')
return
}
// The tag setter will autocorrect the message if necessary.
tag.message = core.getInput('tag_message', { required: false }).trim()
2020-04-02 01:41:56 +07:00
if (!isDryRun) {
2021-06-02 17:53:21 +07:00
await tag.push()
2022-10-13 05:34:21 +07:00
core.setOutput('tagcreated', 'yes')
2021-06-02 17:53:21 +07:00
}
2022-10-13 05:34:21 +07:00
2020-04-02 02:24:38 +07:00
core.setOutput('tagname', tag.name)
core.setOutput('tagsha', tag.sha)
core.setOutput('taguri', tag.uri)
core.setOutput('tagmessage', tag.message)
core.setOutput('tagref', tag.ref)
} catch (error) {
core.warning(error.message)
2020-04-02 02:09:24 +07:00
core.warning(error.stack)
core.setOutput('tagname', '')
core.setOutput('tagsha', '')
core.setOutput('taguri', '')
core.setOutput('tagmessage', '')
core.setOutput('tagref', '')
core.setOutput('tagcreated', 'no')
}
}
run()