@@ -3,112 +3,127 @@ const exec = require('@actions/exec');
33const path = require ( 'path' ) ;
44const fs = require ( 'fs' ) ;
55
6- // Static version - update manually when new func releases are available
7- const DEFAULT_FUNC_VERSION = 'knative-v1.20.1 ' ;
6+ // Using latest as default
7+ const DEFAULT_FUNC_VERSION = 'latest ' ;
88
99// Returns the binary name for the current OS/arch from GitHub releases
1010function getOsBinName ( ) {
11- const runnerOS = process . env . RUNNER_OS ;
12- const runnerArch = process . env . RUNNER_ARCH ;
13-
14- if ( runnerOS === 'Linux' ) {
15- switch ( runnerArch ) {
16- case 'X64' : return 'func_linux_amd64' ;
17- case 'ARM64' : return 'func_linux_arm64' ;
18- case 'PPC64LE' : return 'func_linux_ppc64le' ;
19- case 'S390X' : return 'func_linux_s390x' ;
20- default : return 'unknown' ;
11+ const runnerOS = process . env . RUNNER_OS ;
12+ const runnerArch = process . env . RUNNER_ARCH ;
13+
14+ if ( runnerOS === 'Linux' ) {
15+ switch ( runnerArch ) {
16+ case 'X64' : return 'func_linux_amd64' ;
17+ case 'ARM64' : return 'func_linux_arm64' ;
18+ case 'PPC64LE' : return 'func_linux_ppc64le' ;
19+ case 'S390X' : return 'func_linux_s390x' ;
20+ default : return 'unknown' ;
21+ }
22+ } else if ( runnerOS === 'macOS' ) {
23+ return runnerArch === 'X64' ? 'func_darwin_amd64' : 'func_darwin_arm64' ;
24+ } else if ( runnerOS === 'Windows' ) {
25+ return 'func_windows_amd64.exe' ;
26+ } else {
27+ return 'unknown' ;
2128 }
22- } else if ( runnerOS === 'macOS' ) {
23- return runnerArch === 'X64' ? 'func_darwin_amd64' : 'func_darwin_arm64' ;
24- } else if ( runnerOS === 'Windows' ) {
25- return 'func_windows_amd64.exe' ;
26- } else {
27- return 'unknown' ;
28- }
2929}
3030
3131// Normalizes version to release tag format: knative-vX.Y.Z
3232// Ex.: '1.16' or 'v1.16' will return 'knative-v1.16.0'
3333function smartVersionUpdate ( version ) {
34- const versionRegex = / ^ (?< knprefix > k n a t i v e - ) ? (?< prefix > v ? ) (?< major > \d + ) \. (?< minor > \d + ) ( .(?< patch > \d + ) ) ? $ / ;
35- const match = version . match ( versionRegex ) ;
36- if ( ! match ) {
37- throw new Error ( `Invalid version format (${ version } ). Expected format: "1.16[.X]" or "v1.16[.X]"` ) ;
38- }
39- const knprefix = 'knative-' ;
40- const prefix = 'v' ;
41- const patch = match . groups . patch ?? 0 ;
42- return `${ knprefix } ${ prefix } ${ match . groups . major } .${ match . groups . minor } .${ patch } ` ;
34+ const versionRegex = / ^ (?< knprefix > k n a t i v e - ) ? (?< prefix > v ? ) (?< major > \d + ) \. (?< minor > \d + ) ( .(?< patch > \d + ) ) ? $ / ;
35+ const match = version . match ( versionRegex ) ;
36+ if ( ! match ) {
37+ throw new Error ( `Invalid version format (${ version } ). Expected format: "1.16[.X]" or "v1.16[.X]"` ) ;
38+ }
39+ const knprefix = 'knative-' ;
40+ const prefix = 'v' ;
41+ const patch = match . groups . patch ?? 0 ;
42+ return `${ knprefix } ${ prefix } ${ match . groups . major } .${ match . groups . minor } .${ patch } ` ;
4343}
4444
4545const DEFAULT_BINARY_SOURCE = 'https://github.com/knative/func/releases/download' ;
46+ const DEFAULT_LATEST_BINARY_SOURCE = 'https://github.com/knative/func/releases/latest/download' ;
4647
4748// Downloads binary from release URL and makes it executable
48- async function downloadFuncBinary ( version , osBinName , binPath , binarySource ) {
49- const url = `${ binarySource } /${ version } /${ osBinName } ` ;
50- core . info ( `Downloading from: ${ url } ` ) ;
49+ async function downloadFuncBinary ( url , binPath ) {
50+ core . info ( `Downloading from: ${ url } ` ) ;
5151
52- await exec . exec ( 'curl' , [ '-L' , '--fail' , '-o' , binPath , url ] ) ;
52+ await exec . exec ( 'curl' , [ '-L' , '--fail' , '-o' , binPath , url ] ) ;
5353
54- if ( ! fs . existsSync ( binPath ) ) {
55- throw new Error ( "Download failed, couldn't find the binary on disk" ) ;
56- }
54+ if ( ! fs . existsSync ( binPath ) ) {
55+ throw new Error ( "Download failed, couldn't find the binary on disk" ) ;
56+ }
5757
58- if ( process . env . RUNNER_OS !== 'Windows' ) {
59- await exec . exec ( 'chmod' , [ '+x' , binPath ] ) ;
60- }
58+ if ( process . env . RUNNER_OS !== 'Windows' ) {
59+ await exec . exec ( 'chmod' , [ '+x' , binPath ] ) ;
60+ }
6161}
6262
6363// Adds binary directory to PATH for current and subsequent steps
6464async function addBinToPath ( binPath ) {
65- const dir = path . dirname ( binPath ) ;
66- fs . appendFileSync ( process . env . GITHUB_PATH , `\n${ dir } ` ) ;
65+ const dir = path . dirname ( binPath ) ;
66+ fs . appendFileSync ( process . env . GITHUB_PATH , `\n${ dir } ` ) ;
6767
68- if ( ! process . env . PATH . includes ( dir ) ) {
69- process . env . PATH = process . env . PATH + path . delimiter + dir ;
70- core . info ( `${ dir } added to PATH` ) ;
71- }
68+ if ( ! process . env . PATH . includes ( dir ) ) {
69+ process . env . PATH = process . env . PATH + path . delimiter + dir ;
70+ core . info ( `${ dir } added to PATH` ) ;
71+ }
7272}
7373
7474async function run ( ) {
75- const osBinName = core . getInput ( 'binary' ) || getOsBinName ( ) ;
76- if ( osBinName === "unknown" ) {
77- core . setFailed ( "Invalid os binary determination, try setting it specifically using 'binary'" ) ;
78- return ;
79- }
80-
81- const versionInput = core . getInput ( 'version' ) || DEFAULT_FUNC_VERSION ;
82- const destination = core . getInput ( 'destination' ) || process . cwd ( ) ;
83- const binarySource = core . getInput ( 'binarySource' ) || DEFAULT_BINARY_SOURCE ;
84- let bin = core . getInput ( 'name' ) || 'func' ;
85- if ( process . env . RUNNER_OS === 'Windows' && ! bin . endsWith ( '.exe' ) ) {
86- bin += '.exe' ;
87- }
88-
89- let version ;
90- try {
91- version = smartVersionUpdate ( versionInput ) ;
92- } catch ( error ) {
93- core . setFailed ( error . message ) ;
94- return ;
95- }
96-
97- if ( ! fs . existsSync ( destination ) ) {
98- fs . mkdirSync ( destination , { recursive : true } ) ;
99- }
100-
101- const fullPathBin = path . resolve ( destination , bin ) ;
102-
103- try {
104- await downloadFuncBinary ( version , osBinName , fullPathBin , binarySource ) ;
105- } catch ( error ) {
106- core . setFailed ( `Download failed: ${ error . message } ` ) ;
107- return ;
108- }
109-
110- await addBinToPath ( fullPathBin ) ;
111- await exec . exec ( fullPathBin , [ 'version' ] ) ;
75+ const osBinName = core . getInput ( 'binary' ) || getOsBinName ( ) ;
76+ if ( osBinName === "unknown" ) {
77+ core . setFailed ( "Invalid os binary determination, try setting it specifically using 'binary'" ) ;
78+ return ;
79+ }
80+
81+ const versionInput = core . getInput ( 'version' ) || DEFAULT_FUNC_VERSION ;
82+ const destination = core . getInput ( 'destination' ) || process . cwd ( ) ;
83+ const binarySourceInput = core . getInput ( 'binarySource' ) ;
84+ let bin = core . getInput ( 'name' ) || 'func' ;
85+ if ( process . env . RUNNER_OS === 'Windows' && ! bin . endsWith ( '.exe' ) ) {
86+ bin += '.exe' ;
87+ }
88+
89+ let version = '' ;
90+ let binarySource ;
91+
92+ // resolve version 'latest'
93+ if ( versionInput . toLowerCase ( ) . trim ( ) == 'latest' ) {
94+ core . info ( "Using latest version..." ) ;
95+ binarySource = binarySourceInput || DEFAULT_LATEST_BINARY_SOURCE ;
96+ } else {
97+ // try smart version update
98+ try {
99+ binarySource = binarySourceInput || DEFAULT_BINARY_SOURCE ;
100+ version = smartVersionUpdate ( versionInput ) ;
101+ } catch ( error ) {
102+ core . setFailed ( error . message ) ;
103+ return ;
104+ }
105+ }
106+
107+ if ( ! fs . existsSync ( destination ) ) {
108+ fs . mkdirSync ( destination , { recursive : true } ) ;
109+ }
110+
111+ const fullPathBin = path . resolve ( destination , bin ) ;
112+
113+ // resolve url based on <specific/latest> version
114+ const url = version
115+ ? `${ binarySource } /${ version } /${ osBinName } `
116+ : `${ binarySource } /${ osBinName } `
117+
118+ try {
119+ await downloadFuncBinary ( url , fullPathBin ) ;
120+ } catch ( error ) {
121+ core . setFailed ( `Download failed: ${ error . message } ` ) ;
122+ return ;
123+ }
124+
125+ await addBinToPath ( fullPathBin ) ;
126+ await exec . exec ( fullPathBin , [ 'version' ] ) ;
112127}
113128
114- run ( ) ;
129+ run ( ) ;
0 commit comments