From df2f741a87868c176697d790b56786571c94a82f Mon Sep 17 00:00:00 2001 From: Oktawian Chojnacki Date: Wed, 19 Oct 2022 13:27:50 +0200 Subject: [PATCH] Provide `gitPath` for Windows to avoid failures on `windows-2022` (GitHub-hosted runner) (#137) ### Problem: Observed error on `windows-2022` ([GitHub-hosted runner](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources)) that `git` command cannot be found. ### Issue: Cannot find git executable on on windows-2022 (GitHub-hosted runner) #136 ### Solution: This path improvement makes use of existing `path.js` to resolve and return correct `git.exe` path for Windows, leaving the executable name as it was for other operating systems. ### Caveats: No idea how and why this `c://progra~1//git//usr//bin//git.exe` mumbo-jumbo works but it apparently did for other executables so figured it should work for `git.exe` (and it does). --- cleanup.js | 4 ++-- dist/cleanup.js | 24 +++++++++++------------- dist/index.js | 38 ++++++++++++++++++-------------------- index.js | 18 +++++++++--------- paths.js | 20 +++++++++----------- 5 files changed, 49 insertions(+), 55 deletions(-) diff --git a/cleanup.js b/cleanup.js index 34b2bbc..6b7ab7d 100644 --- a/cleanup.js +++ b/cleanup.js @@ -1,11 +1,11 @@ const core = require('@actions/core'); const { execFileSync } = require('child_process'); -const { sshAgent } = require('./paths.js'); +const { sshAgentCmd } = require('./paths.js'); try { // Kill the started SSH agent console.log('Stopping SSH agent'); - execFileSync(sshAgent, ['-k'], { stdio: 'inherit' }); + execFileSync(sshAgentCmd, ['-k'], { stdio: 'inherit' }); } catch (error) { console.log(error.message); console.log('Error stopping the SSH agent, proceeding anyway'); diff --git a/dist/cleanup.js b/dist/cleanup.js index dc2c19b..f978a12 100644 --- a/dist/cleanup.js +++ b/dist/cleanup.js @@ -599,12 +599,12 @@ exports.debug = debug; // for test const core = __webpack_require__(470); const { execFileSync } = __webpack_require__(129); -const { sshAgent } = __webpack_require__(972); +const { sshAgentCmd } = __webpack_require__(972); try { // Kill the started SSH agent console.log('Stopping SSH agent'); - execFileSync(sshAgent, ['-k'], { stdio: 'inherit' }); + execFileSync(sshAgentCmd, ['-k'], { stdio: 'inherit' }); } catch (error) { console.log(error.message); console.log('Error stopping the SSH agent, proceeding anyway'); @@ -2824,23 +2824,21 @@ exports.default = _default; const os = __webpack_require__(87); module.exports = (process.env['OS'] != 'Windows_NT') ? { - // Use getent() system call, since this is what ssh does; makes a difference in Docker-based // Action runs, where $HOME is different from the pwent - home: os.userInfo().homedir, - sshAgent: 'ssh-agent', - sshAdd: 'ssh-add' - + homePath: os.userInfo().homedir, + sshAgentCmd: 'ssh-agent', + sshAddCmd: 'ssh-add', + gitCmd: 'git' } : { - - home: os.homedir(), - sshAgent: 'c://progra~1//git//usr//bin//ssh-agent.exe', - sshAdd: 'c://progra~1//git//usr//bin//ssh-add.exe' - + // Assuming GitHub hosted `windows-*` runners for now + homePath: os.homedir(), + sshAgentCmd: 'c://progra~1//git//usr//bin//ssh-agent.exe', + sshAddCmd: 'c://progra~1//git//usr//bin//ssh-add.exe', + gitCmd: 'c://progra~1//git//usr//bin//git.exe' }; - /***/ }) /******/ }); \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 46f6582..20f7d61 100644 --- a/dist/index.js +++ b/dist/index.js @@ -322,7 +322,7 @@ const core = __webpack_require__(470); const child_process = __webpack_require__(129); const fs = __webpack_require__(747); const crypto = __webpack_require__(417); -const { home, sshAgent, sshAdd } = __webpack_require__(972); +const { homePath, sshAgentCmd, sshAddCmd, gitCmd } = __webpack_require__(972); try { const privateKey = core.getInput('ssh-private-key'); @@ -334,7 +334,7 @@ try { return; } - const homeSsh = home + '/.ssh'; + const homeSsh = homePath + '/.ssh'; console.log(`Adding GitHub.com keys to ${homeSsh}/known_hosts`); @@ -349,7 +349,7 @@ try { const sshAgentArgs = (authSock && authSock.length > 0) ? ['-a', authSock] : []; // Extract auth socket path and agent pid and set them as job variables - child_process.execFileSync(sshAgent, sshAgentArgs).toString().split("\n").forEach(function(line) { + child_process.execFileSync(sshAgentCmd, sshAgentArgs).toString().split("\n").forEach(function(line) { const matches = /^(SSH_AUTH_SOCK|SSH_AGENT_PID)=(.*); export \1/.exec(line); if (matches && matches.length > 0) { @@ -362,16 +362,16 @@ try { console.log("Adding private key(s) to agent"); privateKey.split(/(?=-----BEGIN)/).forEach(function(key) { - child_process.execFileSync(sshAdd, ['-'], { input: key.trim() + "\n" }); + child_process.execFileSync(sshAddCmd, ['-'], { input: key.trim() + "\n" }); }); console.log("Key(s) added:"); - child_process.execFileSync(sshAdd, ['-l'], { stdio: 'inherit' }); + child_process.execFileSync(sshAddCmd, ['-l'], { stdio: 'inherit' }); console.log('Configuring deployment key(s)'); - child_process.execFileSync(sshAdd, ['-L']).toString().split(/\r?\n/).forEach(function(key) { + child_process.execFileSync(sshAddCmd, ['-L']).toString().split(/\r?\n/).forEach(function(key) { const parts = key.match(/\bgithub\.com[:/]([_.a-z0-9-]+\/[_.a-z0-9-]+)/i); if (!parts) { @@ -386,9 +386,9 @@ try { fs.writeFileSync(`${homeSsh}/key-${sha256}`, key + "\n", { mode: '600' }); - child_process.execSync(`git config --global --replace-all url."git@key-${sha256}.github.com:${ownerAndRepo}".insteadOf "https://github.com/${ownerAndRepo}"`); - child_process.execSync(`git config --global --add url."git@key-${sha256}.github.com:${ownerAndRepo}".insteadOf "git@github.com:${ownerAndRepo}"`); - child_process.execSync(`git config --global --add url."git@key-${sha256}.github.com:${ownerAndRepo}".insteadOf "ssh://git@github.com/${ownerAndRepo}"`); + child_process.execSync(`${gitCmd} config --global --replace-all url."git@key-${sha256}.github.com:${ownerAndRepo}".insteadOf "https://github.com/${ownerAndRepo}"`); + child_process.execSync(`${gitCmd} config --global --add url."git@key-${sha256}.github.com:${ownerAndRepo}".insteadOf "git@github.com:${ownerAndRepo}"`); + child_process.execSync(`${gitCmd} config --global --add url."git@key-${sha256}.github.com:${ownerAndRepo}".insteadOf "ssh://git@github.com/${ownerAndRepo}"`); const sshConfig = `\nHost key-${sha256}.github.com\n` + ` HostName github.com\n` @@ -2903,23 +2903,21 @@ exports.default = _default; const os = __webpack_require__(87); module.exports = (process.env['OS'] != 'Windows_NT') ? { - // Use getent() system call, since this is what ssh does; makes a difference in Docker-based // Action runs, where $HOME is different from the pwent - home: os.userInfo().homedir, - sshAgent: 'ssh-agent', - sshAdd: 'ssh-add' - + homePath: os.userInfo().homedir, + sshAgentCmd: 'ssh-agent', + sshAddCmd: 'ssh-add', + gitCmd: 'git' } : { - - home: os.homedir(), - sshAgent: 'c://progra~1//git//usr//bin//ssh-agent.exe', - sshAdd: 'c://progra~1//git//usr//bin//ssh-add.exe' - + // Assuming GitHub hosted `windows-*` runners for now + homePath: os.homedir(), + sshAgentCmd: 'c://progra~1//git//usr//bin//ssh-agent.exe', + sshAddCmd: 'c://progra~1//git//usr//bin//ssh-add.exe', + gitCmd: 'c://progra~1//git//usr//bin//git.exe' }; - /***/ }) /******/ }); \ No newline at end of file diff --git a/index.js b/index.js index 5dbc831..0384fc4 100644 --- a/index.js +++ b/index.js @@ -2,7 +2,7 @@ const core = require('@actions/core'); const child_process = require('child_process'); const fs = require('fs'); const crypto = require('crypto'); -const { home, sshAgent, sshAdd } = require('./paths.js'); +const { homePath, sshAgentCmd, sshAddCmd, gitCmd } = require('./paths.js'); try { const privateKey = core.getInput('ssh-private-key'); @@ -14,7 +14,7 @@ try { return; } - const homeSsh = home + '/.ssh'; + const homeSsh = homePath + '/.ssh'; console.log(`Adding GitHub.com keys to ${homeSsh}/known_hosts`); @@ -29,7 +29,7 @@ try { const sshAgentArgs = (authSock && authSock.length > 0) ? ['-a', authSock] : []; // Extract auth socket path and agent pid and set them as job variables - child_process.execFileSync(sshAgent, sshAgentArgs).toString().split("\n").forEach(function(line) { + child_process.execFileSync(sshAgentCmd, sshAgentArgs).toString().split("\n").forEach(function(line) { const matches = /^(SSH_AUTH_SOCK|SSH_AGENT_PID)=(.*); export \1/.exec(line); if (matches && matches.length > 0) { @@ -42,16 +42,16 @@ try { console.log("Adding private key(s) to agent"); privateKey.split(/(?=-----BEGIN)/).forEach(function(key) { - child_process.execFileSync(sshAdd, ['-'], { input: key.trim() + "\n" }); + child_process.execFileSync(sshAddCmd, ['-'], { input: key.trim() + "\n" }); }); console.log("Key(s) added:"); - child_process.execFileSync(sshAdd, ['-l'], { stdio: 'inherit' }); + child_process.execFileSync(sshAddCmd, ['-l'], { stdio: 'inherit' }); console.log('Configuring deployment key(s)'); - child_process.execFileSync(sshAdd, ['-L']).toString().split(/\r?\n/).forEach(function(key) { + child_process.execFileSync(sshAddCmd, ['-L']).toString().split(/\r?\n/).forEach(function(key) { const parts = key.match(/\bgithub\.com[:/]([_.a-z0-9-]+\/[_.a-z0-9-]+)/i); if (!parts) { @@ -66,9 +66,9 @@ try { fs.writeFileSync(`${homeSsh}/key-${sha256}`, key + "\n", { mode: '600' }); - child_process.execSync(`git config --global --replace-all url."git@key-${sha256}.github.com:${ownerAndRepo}".insteadOf "https://github.com/${ownerAndRepo}"`); - child_process.execSync(`git config --global --add url."git@key-${sha256}.github.com:${ownerAndRepo}".insteadOf "git@github.com:${ownerAndRepo}"`); - child_process.execSync(`git config --global --add url."git@key-${sha256}.github.com:${ownerAndRepo}".insteadOf "ssh://git@github.com/${ownerAndRepo}"`); + child_process.execSync(`${gitCmd} config --global --replace-all url."git@key-${sha256}.github.com:${ownerAndRepo}".insteadOf "https://github.com/${ownerAndRepo}"`); + child_process.execSync(`${gitCmd} config --global --add url."git@key-${sha256}.github.com:${ownerAndRepo}".insteadOf "git@github.com:${ownerAndRepo}"`); + child_process.execSync(`${gitCmd} config --global --add url."git@key-${sha256}.github.com:${ownerAndRepo}".insteadOf "ssh://git@github.com/${ownerAndRepo}"`); const sshConfig = `\nHost key-${sha256}.github.com\n` + ` HostName github.com\n` diff --git a/paths.js b/paths.js index 8ee7afd..edeb197 100644 --- a/paths.js +++ b/paths.js @@ -1,18 +1,16 @@ const os = require('os'); module.exports = (process.env['OS'] != 'Windows_NT') ? { - // Use getent() system call, since this is what ssh does; makes a difference in Docker-based // Action runs, where $HOME is different from the pwent - home: os.userInfo().homedir, - sshAgent: 'ssh-agent', - sshAdd: 'ssh-add' - + homePath: os.userInfo().homedir, + sshAgentCmd: 'ssh-agent', + sshAddCmd: 'ssh-add', + gitCmd: 'git' } : { - - home: os.homedir(), - sshAgent: 'c://progra~1//git//usr//bin//ssh-agent.exe', - sshAdd: 'c://progra~1//git//usr//bin//ssh-add.exe' - + // Assuming GitHub hosted `windows-*` runners for now + homePath: os.homedir(), + sshAgentCmd: 'c://progra~1//git//usr//bin//ssh-agent.exe', + sshAddCmd: 'c://progra~1//git//usr//bin//ssh-add.exe', + gitCmd: 'c://progra~1//git//usr//bin//git.exe' }; -