2020-05-19 15:25:54 +02:00
import * as core from '@actions/core' ;
2022-06-30 21:55:32 +02:00
import * as exec from '@actions/exec' ;
2020-05-19 15:25:54 +02:00
import * as installer from './installer' ;
2021-11-29 10:18:31 +01:00
import fs from 'fs' ;
2020-05-19 15:25:54 +02:00
import * as auth from './authutil' ;
import * as path from 'path' ;
2021-06-16 08:52:44 +02:00
import { restoreCache } from './cache-restore' ;
2022-03-31 21:10:37 +02:00
import { isGhes , isCacheFeatureAvailable } from './cache-utils' ;
2020-09-03 14:40:40 +02:00
import os = require ( 'os' ) ;
2020-05-19 15:25:54 +02:00
export async function run() {
try {
//
// Version is optional. If supplied, install / use from the tool cache
// If not supplied then task is still used to setup proxy, auth, etc...
//
2021-11-29 10:18:31 +01:00
let version = resolveVersionInput ( ) ;
2020-05-19 15:25:54 +02:00
2020-12-08 23:15:38 +01:00
let arch = core . getInput ( 'architecture' ) ;
2021-06-16 08:52:44 +02:00
const cache = core . getInput ( 'cache' ) ;
2020-09-06 18:09:41 +02:00
2020-12-08 23:15:38 +01:00
// if architecture supplied but node-version is not
2020-09-06 18:09:41 +02:00
// if we don't throw a warning, the already installed x64 node will be used which is not probably what user meant.
if ( arch && ! version ) {
core . warning (
2020-12-09 18:27:02 +01:00
'`architecture` is provided but `node-version` is missing. In this configuration, the version/architecture of Node will not be changed. To fix this, provide `architecture` in combination with `node-version`'
2020-09-06 18:09:41 +02:00
) ;
}
2020-09-03 14:40:40 +02:00
if ( ! arch ) {
arch = os . arch ( ) ;
}
2020-05-19 15:25:54 +02:00
if ( version ) {
let token = core . getInput ( 'token' ) ;
2022-11-02 12:24:44 +01:00
let auth = ! token ? undefined : ` token ${ token } ` ;
2020-05-19 15:25:54 +02:00
let stable = ( core . getInput ( 'stable' ) || 'true' ) . toUpperCase ( ) === 'TRUE' ;
2020-06-29 20:56:37 +02:00
const checkLatest =
( core . getInput ( 'check-latest' ) || 'false' ) . toUpperCase ( ) === 'TRUE' ;
2020-09-03 14:40:40 +02:00
await installer . getNode ( version , stable , checkLatest , auth , arch ) ;
2020-05-19 15:25:54 +02:00
}
2022-10-03 16:02:04 +02:00
await printEnvDetailsAndSetOutput ( ) ;
2022-06-30 21:55:32 +02:00
2020-05-19 15:25:54 +02:00
const registryUrl : string = core . getInput ( 'registry-url' ) ;
const alwaysAuth : string = core . getInput ( 'always-auth' ) ;
if ( registryUrl ) {
auth . configAuthentication ( registryUrl , alwaysAuth ) ;
}
2022-03-31 21:10:37 +02:00
if ( cache && isCacheFeatureAvailable ( ) ) {
2021-08-02 19:44:59 +02:00
const cacheDependencyPath = core . getInput ( 'cache-dependency-path' ) ;
await restoreCache ( cache , cacheDependencyPath ) ;
2021-06-16 08:52:44 +02:00
}
const matchersPath = path . join ( __dirname , '../..' , '.github' ) ;
2021-01-20 16:28:35 +01:00
core . info ( ` ##[add-matcher] ${ path . join ( matchersPath , 'tsc.json' ) } ` ) ;
core . info (
2020-05-19 15:25:54 +02:00
` ##[add-matcher] ${ path . join ( matchersPath , 'eslint-stylish.json' ) } `
) ;
2021-01-20 16:28:35 +01:00
core . info (
2020-05-19 15:25:54 +02:00
` ##[add-matcher] ${ path . join ( matchersPath , 'eslint-compact.json' ) } `
) ;
2021-11-29 10:18:31 +01:00
} catch ( err ) {
core . setFailed ( err . message ) ;
2020-05-19 15:25:54 +02:00
}
}
2021-11-29 10:18:31 +01:00
function resolveVersionInput ( ) : string {
2022-02-24 14:31:57 +01:00
let version = core . getInput ( 'node-version' ) ;
2022-06-30 00:37:53 +02:00
const versionFileInput = core . getInput ( 'node-version-file' ) ;
2021-11-29 10:18:31 +01:00
if ( version && versionFileInput ) {
core . warning (
'Both node-version and node-version-file inputs are specified, only node-version will be used'
) ;
}
if ( version ) {
return version ;
}
if ( versionFileInput ) {
const versionFilePath = path . join (
process . env . GITHUB_WORKSPACE ! ,
versionFileInput
) ;
2022-06-29 21:01:42 +02:00
2021-11-29 10:18:31 +01:00
if ( ! fs . existsSync ( versionFilePath ) ) {
throw new Error (
` The specified node version file at: ${ versionFilePath } does not exist `
) ;
}
2022-06-29 21:01:42 +02:00
2022-06-30 00:37:53 +02:00
version = installer . parseNodeVersionFile (
fs . readFileSync ( versionFilePath , 'utf8' )
) ;
2022-06-29 21:01:42 +02:00
2021-11-29 10:18:31 +01:00
core . info ( ` Resolved ${ versionFileInput } as ${ version } ` ) ;
}
return version ;
}
2022-10-03 16:02:04 +02:00
export async function printEnvDetailsAndSetOutput() {
core . startGroup ( 'Environment details' ) ;
const promises = [ 'node' , 'npm' , 'yarn' ] . map ( async tool = > {
const output = await getToolVersion ( tool , [ '--version' ] ) ;
if ( tool === 'node' ) {
core . setOutput ( ` ${ tool } -version ` , output ) ;
}
core . info ( ` ${ tool } : ${ output } ` ) ;
} ) ;
await Promise . all ( promises ) ;
core . endGroup ( ) ;
}
async function getToolVersion ( tool : string , options : string [ ] ) {
try {
const { stdout , stderr , exitCode } = await exec . getExecOutput ( tool , options , {
ignoreReturnCode : true ,
silent : true
} ) ;
if ( exitCode > 0 ) {
core . warning ( ` [warning] ${ stderr } ` ) ;
return '' ;
}
return stdout ;
} catch ( err ) {
return '' ;
}
}