2020-04-02 00:27:19 +07:00
import core from '@actions/core'
import os from 'os'
2021-01-30 22:19:26 +07:00
import semver from 'semver'
2020-04-02 00:27:19 +07:00
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'
2020-04-02 00:27:19 +07:00
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' )
2020-04-02 00:27:19 +07:00
// Identify the tag parsing strategy
const root = core . getInput ( 'root' , { required : false } ) || core . getInput ( 'package_root' , { required : false } ) || './'
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 ( ) )
2021-01-30 22:19:26 +07:00
2021-06-02 17:53:21 +07:00
// If this value is true, the tag will not be pushed
2022-10-12 23:48:09 +07:00
const isDryRun = core . getInput ( 'dry_run' , { required : false } ) ;
2020-04-02 00:27:19 +07:00
// Extract the version number using the supplied strategy
let version = core . getInput ( 'root' , { required : false } )
version = version === null || version . trim ( ) . length === 0 ? null : version
2020-09-11 09:29:49 +07:00
const pattern = core . getInput ( 'regex_pattern' , { required : false } )
2020-04-02 00:27:19 +07:00
switch ( strategy ) {
case 'docker' :
version = ( new Dockerfile ( root ) ) . version
break
case 'package' :
// Extract using the package strategy (this is the default strategy)
version = ( new Package ( root ) ) . version
break
case 'regex' :
2020-09-11 06:49:12 +07:00
version = ( new Regex ( root , new RegExp ( pattern , 'gim' ) ) ) . version
2020-04-02 00:27:19 +07:00
break
default :
core . setFailed ( ` " ${ strategy } " is not a recognized tagging strategy. Choose from: 'package' (package.json), 'docker' (uses Dockerfile), or 'regex' (JS-based RegExp). ` )
return
}
2020-09-11 09:22:51 +07:00
const msg = ` using the ${ strategy } extraction ${ strategy === 'regex' ? ' with the /' + pattern + '/gim pattern.' : '' } . `
if ( ! version ) {
throw new Error ( ` No version identified ${ msg } ` )
}
2021-01-30 22:19:26 +07:00
2022-10-12 23:49:34 +07:00
const minVersion = core . getInput ( 'min_version' , { required : false } )
2021-01-31 03:34:05 +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 ` )
}
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
}
2020-09-11 09:22:51 +07:00
core . warning ( ` Recognized " ${ version } " ${ msg } ` )
2020-04-02 00:27:19 +07:00
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 } )
)
2021-06-02 17:53:21 +07:00
if ( isDryRun === "true" ) {
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. ` )
}
2020-04-02 10:19:36 +07:00
core . setOutput ( 'tagrequested' , tag . name )
2020-04-05 06:28:01 +07:00
core . setOutput ( 'prerelease' , tag . prerelease ? 'yes' : 'no' )
core . setOutput ( 'build' , tag . build ? 'yes' : 'no' )
2020-04-02 02:28:38 +07:00
2020-04-02 00:27:19 +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 )
2020-04-02 00:27:19 +07:00
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
2021-06-02 17:53:21 +07:00
if ( isDryRun !== "true" ) {
await tag . push ( )
}
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 )
2020-04-02 01:41:56 +07:00
core . setOutput ( 'tagcreated' , 'yes' )
2020-04-02 00:27:19 +07:00
} catch ( error ) {
core . warning ( error . message )
2020-04-02 02:09:24 +07:00
core . warning ( error . stack )
2020-04-02 00:27:19 +07:00
core . setOutput ( 'tagname' , '' )
core . setOutput ( 'tagsha' , '' )
core . setOutput ( 'taguri' , '' )
core . setOutput ( 'tagmessage' , '' )
core . setOutput ( 'tagref' , '' )
core . setOutput ( 'tagcreated' , 'no' )
}
}
run ( )