Compare commits

...

12 commits

Author SHA1 Message Date
e1c97d5d85
Release 0.9.2 2025-06-30 21:42:19 +02:00
72dbd50b25
Remove .github folder 2025-06-30 21:42:18 +02:00
1903dde042
Read out HOME instead of the os query info
As when using the gitea-actions-runner on NixOS
it is using systemd dynamic user
2025-06-30 21:42:17 +02:00
Jano Paetzold
a6f90b1f12
Release v0.9.1 2025-03-17 15:05:58 +01:00
Jano Paetzold
72c0bfd31a Improve documentation on why we use os.userInfo()
(use correct syscall name)

Co-authored-by: Matthias Pigulla <mp@webfactory.de>
2025-01-08 19:00:56 +01:00
Jano Paetzold
e3f1a8e046
Acknowledge custom command inputs in cleanup.js (#235)
Refactored version of https://github.com/webfactory/ssh-agent/pull/183.

Fixes: https://github.com/webfactory/ssh-agent/issues/208
2025-01-08 17:59:51 +01:00
Jano Paetzold
b504c19775 Update CHANGELOG.md 2025-01-08 17:52:14 +01:00
Matthias Pigulla
dc588b651f
Update version numbers in the README examples 2024-02-06 10:28:20 +01:00
Kevin Glavin
204eb35a4e
Bump to node20 (#201)
Fix for deprecated node16

Node.js 16 actions are deprecated. Please update the following actions
to use Node.js 20: webfactory/ssh-agent@v0.8.0. For more information
see:
https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/
2024-02-06 10:26:21 +01:00
Felix Seifert
9f6f312a31
chore: update all versions of actions/checkout to v4 (#199)
In this PR, I update the `actions/checkout` versions. When I recently
started using this action, I was confused about whether it works with
the newest checkout action. I tested it and everything is fine. For
future users, we should display examples with the newest versions.
2024-02-06 09:38:02 +01:00
Benjamin Ragheb
2e59dd7d06
Remove outdated claim from README (#206)
Since #171 was merged, this action no longer touches `known_hosts`; this
line should have been removed from the README at that time.
2024-02-05 07:37:14 +01:00
wolf++
fd34b8dee2
Update README.md to reflect latest version (#196) 2023-11-02 17:03:13 +01:00
9 changed files with 163 additions and 198 deletions

View file

@ -1,46 +0,0 @@
on: [ push, pull_request ]
jobs:
deployment_keys_demo:
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest, macOS-latest, windows-latest ]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- name: Setup key
uses: ./
with:
ssh-private-key: |
${{ secrets.MPDUDE_TEST_1_DEPLOY_KEY }}
${{ secrets.MPDUDE_TEST_2_DEPLOY_KEY }}
- run: |
git clone https://github.com/mpdude/test-1.git test-1-http
git clone git@github.com:mpdude/test-1.git test-1-git
git clone ssh://git@github.com/mpdude/test-1.git test-1-git-ssh
git clone https://github.com/mpdude/test-2.git test-2-http
git clone git@github.com:mpdude/test-2.git test-2-git
git clone ssh://git@github.com/mpdude/test-2.git test-2-git-ssh
docker_demo:
runs-on: ubuntu-latest
container:
image: ubuntu:latest
steps:
- uses: actions/checkout@v3
- run: apt update && apt install -y openssh-client git
- name: Setup key
uses: ./
with:
ssh-private-key: |
${{ secrets.MPDUDE_TEST_1_DEPLOY_KEY }}
${{ secrets.MPDUDE_TEST_2_DEPLOY_KEY }}
- run: |
git clone https://github.com/mpdude/test-1.git test-1-http
git clone git@github.com:mpdude/test-1.git test-1-git
git clone ssh://git@github.com/mpdude/test-1.git test-1-git-ssh
git clone https://github.com/mpdude/test-2.git test-2-http
git clone git@github.com:mpdude/test-2.git test-2-git
git clone ssh://git@github.com/mpdude/test-2.git test-2-git-ssh

View file

@ -7,112 +7,137 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## v0.9.2 [2025-06-30] (khs.codes)
- Support running under NixOS with dynamic user setting, or at least attempt to
## v0.9.1 [2024-03-17]
### Fixed
- Fix path used to execute ssh-agent in cleanup.js to respect custom paths set by input (#235)
## v0.9.0 [2024-02-06]
### Changed
- Update all versions of `actions/checkout` to v4 (#199)
- Update to Node 20 (#201)
## v0.8.0 [2023-03-24]
### Changed
- No longer writing GitHub's SSH host keys to `known_hosts` (#171)
- Update to actions/checkout@v3 (#143)
- Allow the user to override the commands for git, ssh-agent, and ssh-add (#154)
## v0.7.0 [2022-10-19] ## v0.7.0 [2022-10-19]
### Added ### Added
* Add the `log-public-key` input that can be used to turn off logging key identities (#122) - Add the `log-public-key` input that can be used to turn off logging key identities (#122)
### Fixed ### Fixed
* Fix path to `git` binary on Windows, assuming GitHub-hosted runners (#136, #137) - Fix path to `git` binary on Windows, assuming GitHub-hosted runners (#136, #137)
* Fix a nonsensical log message (#139) - Fix a nonsensical log message (#139)
## v0.6.0 [2022-10-19] ## v0.6.0 [2022-10-19]
### Changed ### Changed
* Update the version of Node used by the action from 12 to 16 (https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/). - Update the version of Node used by the action from 12 to 16 (https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/).
## v0.5.4 [2021-11-21] ## v0.5.4 [2021-11-21]
### Fixed ### Fixed
* Update changed GitHub Host Keys (#102, #101) - Update changed GitHub Host Keys (#102, #101)
### Changed ### Changed
* Various documentation (README) improvements and additions - Various documentation (README) improvements and additions
* Change logging to more precisely state that _public_ keys are being printed - Change logging to more precisely state that _public_ keys are being printed
## v0.5.3 [2021-06-11] ## v0.5.3 [2021-06-11]
### Fixed ### Fixed
* Fixed cleanup phase to really terminate the ssh-agent (#80) - Fixed cleanup phase to really terminate the ssh-agent (#80)
* Fix termination of ssh-agent also on workflow failure (#79) - Fix termination of ssh-agent also on workflow failure (#79)
### Changed ### Changed
* Various documentation (README) improvements and additions - Various documentation (README) improvements and additions
## v0.5.2 [2021-04-07] ## v0.5.2 [2021-04-07]
### Fixed ### Fixed
* Use case-insensitive regex matching when scanning key comments (#68, #70, #71) - Use case-insensitive regex matching when scanning key comments (#68, #70, #71)
### Changed ### Changed
* Log when a key is _not_ used as a deploy key (#69) - Log when a key is _not_ used as a deploy key (#69)
## v0.5.1 [2021-03-10] ## v0.5.1 [2021-03-10]
### Fixed ### Fixed
* Fix deployment key mapping on Windows virtual environment by using SSH binaries from the Git - Fix deployment key mapping on Windows virtual environment by using SSH binaries from the Git
suite, terminate ssh-agent upon actio termination on Windows as well (#63) suite, terminate ssh-agent upon actio termination on Windows as well (#63)
* Handle ENOENT exceptions with a graceful message - Handle ENOENT exceptions with a graceful message
### Changed ### Changed
* Various documentation (README) improvements and additions - Various documentation (README) improvements and additions
## v0.5.0 [2021-02-19] ## v0.5.0 [2021-02-19]
### Added ### Added
* Add support for GitHub Deployment Keys through key comments (#59). Fixes #30, closes #38. - Add support for GitHub Deployment Keys through key comments (#59). Fixes #30, closes #38.
* Support for container-based workflows and Windows (#17) - Support for container-based workflows and Windows (#17)
### Fixed ### Fixed
* Fix scripts/build.js to work on Windows (#38) - Fix scripts/build.js to work on Windows (#38)
### Changed ### Changed
* Various documentation (README) improvements and additions - Various documentation (README) improvements and additions
## v0.4.1 [2020-10-07] ## v0.4.1 [2020-10-07]
### Fixed ### Fixed
* This action no longer relies on `set-env`, which has been deprecated. - This action no longer relies on `set-env`, which has been deprecated.
## v0.4.0 ## v0.4.0
### Changed ### Changed
* A failure to kill the agent in the post-action step will no longer fail the workflow run. That way, you can kill the agent yourself when necessary (#33). - A failure to kill the agent in the post-action step will no longer fail the workflow run. That way, you can kill the agent yourself when necessary (#33).
## v0.3.0 [2020-05-18] ## v0.3.0 [2020-05-18]
### Added ### Added
* A new post-action step will automatically clean up the running agent at the end of a job. This helps with self-hosted runners, which are non-ephemeral. (@thommyhh, #27) - A new post-action step will automatically clean up the running agent at the end of a job. This helps with self-hosted runners, which are non-ephemeral. (@thommyhh, #27)
### Changed ### Changed
* Unless the SSH_AUTH_SOCK is configured explicitly, the SSH agent will now use a random file name for the socket. That way, multiple, concurrent SSH agents can be used on self-hosted runners. (@thommyhh, #27) - Unless the SSH_AUTH_SOCK is configured explicitly, the SSH agent will now use a random file name for the socket. That way, multiple, concurrent SSH agents can be used on self-hosted runners. (@thommyhh, #27)
## v0.2.0 [2020-01-14] ## v0.2.0 [2020-01-14]
### Added ### Added
* Multiple SSH keys can now be provided (#14, closes #7). Thanks to - Multiple SSH keys can now be provided (#14, closes #7). Thanks to
@webknjaz and @bradmartin for support and tests. @webknjaz and @bradmartin for support and tests.
* Catch empty ssh-private-key input values and exit with a helpful - Catch empty ssh-private-key input values and exit with a helpful
error message right away. error message right away.
## v0.1.0 [2019-09-15] ## v0.1.0 [2019-09-15]

View file

@ -2,9 +2,8 @@
This action This action
* starts the `ssh-agent`, * starts the `ssh-agent`,
* exports the `SSH_AUTH_SOCK` environment variable, * exports the `SSH_AUTH_SOCK` environment variable, and
* loads one or several private SSH key into the agent and * loads one or several private SSH key into the agent.
* configures `known_hosts` for GitHub.com.
It should work in all GitHub Actions virtual environments, including container-based workflows. It should work in all GitHub Actions virtual environments, including container-based workflows.
@ -27,7 +26,7 @@ GitHub Actions only have access to the repository they run for. So, in order to
* In your repository, go to the *Settings > Secrets* menu and create a new secret. In this example, we'll call it `SSH_PRIVATE_KEY`. * In your repository, go to the *Settings > Secrets* menu and create a new secret. In this example, we'll call it `SSH_PRIVATE_KEY`.
* Put the contents of the *private* SSH key file into the contents field. <br> * Put the contents of the *private* SSH key file into the contents field. <br>
* This key should start with `-----BEGIN ... PRIVATE KEY-----`, consist of many lines and ends with `-----END ... PRIVATE KEY-----`. * This key should start with `-----BEGIN ... PRIVATE KEY-----`, consist of many lines and ends with `-----END ... PRIVATE KEY-----`.
5. In your workflow definition file, add the following step. Preferably this would be rather on top, near the `actions/checkout@v2` line. 5. In your workflow definition file, add the following step. Preferably this would be rather on top, near the `actions/checkout@v4` line.
```yaml ```yaml
# .github/workflows/my-workflow.yml # .github/workflows/my-workflow.yml
@ -35,9 +34,9 @@ jobs:
my_job: my_job:
... ...
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
# Make sure the @v0.7.0 matches the current version of the action # Make sure the @v0.9.0 matches the current version of the action
- uses: webfactory/ssh-agent@v0.7.0 - uses: webfactory/ssh-agent@v0.9.0
with: with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
# ... other steps # ... other steps
@ -52,7 +51,7 @@ You can set up different keys as different secrets and pass them all to the acti
```yaml ```yaml
# ... contents as before # ... contents as before
- uses: webfactory/ssh-agent@v0.7.0 - uses: webfactory/ssh-agent@v0.9.0
with: with:
ssh-private-key: | ssh-private-key: |
${{ secrets.FIRST_KEY }} ${{ secrets.FIRST_KEY }}

View file

@ -20,10 +20,11 @@ inputs:
description: 'git command' description: 'git command'
required: false required: false
runs: runs:
using: 'node16' using: 'node20'
main: 'dist/index.js' main: 'dist/index.js'
post: 'dist/cleanup.js' post: 'dist/cleanup.js'
post-if: 'always()' post-if: 'always()'
branding: branding:
icon: loader icon: loader
color: 'yellow' color: 'yellow'

View file

@ -1,4 +1,3 @@
const core = require('@actions/core');
const { execFileSync } = require('child_process'); const { execFileSync } = require('child_process');
const { sshAgentCmd } = require('./paths.js'); const { sshAgentCmd } = require('./paths.js');

72
dist/cleanup.js vendored
View file

@ -292,14 +292,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result; return result;
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.prepareKeyValueMessage = exports.issueFileCommand = void 0; exports.issueCommand = void 0;
// We use any as a valid input type // We use any as a valid input type
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
const fs = __importStar(__webpack_require__(747)); const fs = __importStar(__webpack_require__(747));
const os = __importStar(__webpack_require__(87)); const os = __importStar(__webpack_require__(87));
const uuid_1 = __webpack_require__(62);
const utils_1 = __webpack_require__(82); const utils_1 = __webpack_require__(82);
function issueFileCommand(command, message) { function issueCommand(command, message) {
const filePath = process.env[`GITHUB_${command}`]; const filePath = process.env[`GITHUB_${command}`];
if (!filePath) { if (!filePath) {
throw new Error(`Unable to find environment variable for file command ${command}`); throw new Error(`Unable to find environment variable for file command ${command}`);
@ -311,22 +310,7 @@ function issueFileCommand(command, message) {
encoding: 'utf8' encoding: 'utf8'
}); });
} }
exports.issueFileCommand = issueFileCommand; exports.issueCommand = issueCommand;
function prepareKeyValueMessage(key, value) {
const delimiter = `ghadelimiter_${uuid_1.v4()}`;
const convertedValue = utils_1.toCommandValue(value);
// These should realistically never happen, but just in case someone finds a
// way to exploit uuid generation let's not allow keys or values that contain
// the delimiter.
if (key.includes(delimiter)) {
throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
}
if (convertedValue.includes(delimiter)) {
throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
}
return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
}
exports.prepareKeyValueMessage = prepareKeyValueMessage;
//# sourceMappingURL=file-command.js.map //# sourceMappingURL=file-command.js.map
/***/ }), /***/ }),
@ -613,7 +597,6 @@ exports.debug = debug; // for test
/***/ 175: /***/ 175:
/***/ (function(__unusedmodule, __unusedexports, __webpack_require__) { /***/ (function(__unusedmodule, __unusedexports, __webpack_require__) {
const core = __webpack_require__(470);
const { execFileSync } = __webpack_require__(129); const { execFileSync } = __webpack_require__(129);
const { sshAgentCmd } = __webpack_require__(972); const { sshAgentCmd } = __webpack_require__(972);
@ -1684,6 +1667,7 @@ const file_command_1 = __webpack_require__(102);
const utils_1 = __webpack_require__(82); const utils_1 = __webpack_require__(82);
const os = __importStar(__webpack_require__(87)); const os = __importStar(__webpack_require__(87));
const path = __importStar(__webpack_require__(622)); const path = __importStar(__webpack_require__(622));
const uuid_1 = __webpack_require__(62);
const oidc_utils_1 = __webpack_require__(742); const oidc_utils_1 = __webpack_require__(742);
/** /**
* The code to exit an action * The code to exit an action
@ -1713,9 +1697,20 @@ function exportVariable(name, val) {
process.env[name] = convertedVal; process.env[name] = convertedVal;
const filePath = process.env['GITHUB_ENV'] || ''; const filePath = process.env['GITHUB_ENV'] || '';
if (filePath) { if (filePath) {
return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val)); const delimiter = `ghadelimiter_${uuid_1.v4()}`;
// These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
if (name.includes(delimiter)) {
throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
} }
if (convertedVal.includes(delimiter)) {
throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
}
const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
file_command_1.issueCommand('ENV', commandValue);
}
else {
command_1.issueCommand('set-env', { name }, convertedVal); command_1.issueCommand('set-env', { name }, convertedVal);
}
} }
exports.exportVariable = exportVariable; exports.exportVariable = exportVariable;
/** /**
@ -1733,7 +1728,7 @@ exports.setSecret = setSecret;
function addPath(inputPath) { function addPath(inputPath) {
const filePath = process.env['GITHUB_PATH'] || ''; const filePath = process.env['GITHUB_PATH'] || '';
if (filePath) { if (filePath) {
file_command_1.issueFileCommand('PATH', inputPath); file_command_1.issueCommand('PATH', inputPath);
} }
else { else {
command_1.issueCommand('add-path', {}, inputPath); command_1.issueCommand('add-path', {}, inputPath);
@ -1773,10 +1768,7 @@ function getMultilineInput(name, options) {
const inputs = getInput(name, options) const inputs = getInput(name, options)
.split('\n') .split('\n')
.filter(x => x !== ''); .filter(x => x !== '');
if (options && options.trimWhitespace === false) {
return inputs; return inputs;
}
return inputs.map(input => input.trim());
} }
exports.getMultilineInput = getMultilineInput; exports.getMultilineInput = getMultilineInput;
/** /**
@ -1809,12 +1801,8 @@ exports.getBooleanInput = getBooleanInput;
*/ */
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
function setOutput(name, value) { function setOutput(name, value) {
const filePath = process.env['GITHUB_OUTPUT'] || '';
if (filePath) {
return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
}
process.stdout.write(os.EOL); process.stdout.write(os.EOL);
command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value)); command_1.issueCommand('set-output', { name }, value);
} }
exports.setOutput = setOutput; exports.setOutput = setOutput;
/** /**
@ -1943,11 +1931,7 @@ exports.group = group;
*/ */
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
function saveState(name, value) { function saveState(name, value) {
const filePath = process.env['GITHUB_STATE'] || ''; command_1.issueCommand('save-state', { name }, value);
if (filePath) {
return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
}
command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
} }
exports.saveState = saveState; exports.saveState = saveState;
/** /**
@ -2837,11 +2821,10 @@ exports.default = _default;
/***/ (function(module, __unusedexports, __webpack_require__) { /***/ (function(module, __unusedexports, __webpack_require__) {
const os = __webpack_require__(87); const os = __webpack_require__(87);
const core = __webpack_require__(470);
module.exports = (process.env['OS'] != 'Windows_NT') ? { const defaults = (process.env['OS'] != 'Windows_NT') ? {
// Use getent() system call, since this is what ssh does; makes a difference in Docker-based homePath: os.homedir(),
// Action runs, where $HOME is different from the pwent
homePath: os.userInfo().homedir,
sshAgentCmdDefault: 'ssh-agent', sshAgentCmdDefault: 'ssh-agent',
sshAddCmdDefault: 'ssh-add', sshAddCmdDefault: 'ssh-add',
gitCmdDefault: 'git' gitCmdDefault: 'git'
@ -2853,6 +2836,17 @@ module.exports = (process.env['OS'] != 'Windows_NT') ? {
gitCmdDefault: 'c://progra~1//git//bin//git.exe' gitCmdDefault: 'c://progra~1//git//bin//git.exe'
}; };
const sshAgentCmdInput = core.getInput('ssh-agent-cmd');
const sshAddCmdInput = core.getInput('ssh-add-cmd');
const gitCmdInput = core.getInput('git-cmd');
module.exports = {
homePath: defaults.homePath,
sshAgentCmd: sshAgentCmdInput !== '' ? sshAgentCmdInput : defaults.sshAgentCmdDefault,
sshAddCmd: sshAddCmdInput !== '' ? sshAddCmdInput : defaults.sshAddCmdDefault,
gitCmd: gitCmdInput !== '' ? gitCmdInput : defaults.gitCmdDefault,
};
/***/ }) /***/ })

81
dist/index.js vendored
View file

@ -292,14 +292,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result; return result;
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.prepareKeyValueMessage = exports.issueFileCommand = void 0; exports.issueCommand = void 0;
// We use any as a valid input type // We use any as a valid input type
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
const fs = __importStar(__webpack_require__(747)); const fs = __importStar(__webpack_require__(747));
const os = __importStar(__webpack_require__(87)); const os = __importStar(__webpack_require__(87));
const uuid_1 = __webpack_require__(62);
const utils_1 = __webpack_require__(82); const utils_1 = __webpack_require__(82);
function issueFileCommand(command, message) { function issueCommand(command, message) {
const filePath = process.env[`GITHUB_${command}`]; const filePath = process.env[`GITHUB_${command}`];
if (!filePath) { if (!filePath) {
throw new Error(`Unable to find environment variable for file command ${command}`); throw new Error(`Unable to find environment variable for file command ${command}`);
@ -311,22 +310,7 @@ function issueFileCommand(command, message) {
encoding: 'utf8' encoding: 'utf8'
}); });
} }
exports.issueFileCommand = issueFileCommand; exports.issueCommand = issueCommand;
function prepareKeyValueMessage(key, value) {
const delimiter = `ghadelimiter_${uuid_1.v4()}`;
const convertedValue = utils_1.toCommandValue(value);
// These should realistically never happen, but just in case someone finds a
// way to exploit uuid generation let's not allow keys or values that contain
// the delimiter.
if (key.includes(delimiter)) {
throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
}
if (convertedValue.includes(delimiter)) {
throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
}
return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
}
exports.prepareKeyValueMessage = prepareKeyValueMessage;
//# sourceMappingURL=file-command.js.map //# sourceMappingURL=file-command.js.map
/***/ }), /***/ }),
@ -338,20 +322,12 @@ const core = __webpack_require__(470);
const child_process = __webpack_require__(129); const child_process = __webpack_require__(129);
const fs = __webpack_require__(747); const fs = __webpack_require__(747);
const crypto = __webpack_require__(417); const crypto = __webpack_require__(417);
const { homePath, sshAgentCmdDefault, sshAddCmdDefault, gitCmdDefault } = __webpack_require__(972); const { homePath, sshAgentCmd, sshAddCmd, gitCmd } = __webpack_require__(972);
try { try {
const privateKey = core.getInput('ssh-private-key'); const privateKey = core.getInput('ssh-private-key');
const logPublicKey = core.getBooleanInput('log-public-key', {default: true}); const logPublicKey = core.getBooleanInput('log-public-key', {default: true});
const sshAgentCmdInput = core.getInput('ssh-agent-cmd');
const sshAddCmdInput = core.getInput('ssh-add-cmd');
const gitCmdInput = core.getInput('git-cmd');
const sshAgentCmd = sshAgentCmdInput ? sshAgentCmdInput : sshAgentCmdDefault;
const sshAddCmd = sshAddCmdInput ? sshAddCmdInput : sshAddCmdDefault;
const gitCmd = gitCmdInput ? gitCmdInput : gitCmdDefault;
if (!privateKey) { if (!privateKey) {
core.setFailed("The ssh-private-key argument is empty. Maybe the secret has not been configured, or you are using a wrong secret name in your workflow file."); core.setFailed("The ssh-private-key argument is empty. Maybe the secret has not been configured, or you are using a wrong secret name in your workflow file.");
@ -1765,6 +1741,7 @@ const file_command_1 = __webpack_require__(102);
const utils_1 = __webpack_require__(82); const utils_1 = __webpack_require__(82);
const os = __importStar(__webpack_require__(87)); const os = __importStar(__webpack_require__(87));
const path = __importStar(__webpack_require__(622)); const path = __importStar(__webpack_require__(622));
const uuid_1 = __webpack_require__(62);
const oidc_utils_1 = __webpack_require__(742); const oidc_utils_1 = __webpack_require__(742);
/** /**
* The code to exit an action * The code to exit an action
@ -1794,9 +1771,20 @@ function exportVariable(name, val) {
process.env[name] = convertedVal; process.env[name] = convertedVal;
const filePath = process.env['GITHUB_ENV'] || ''; const filePath = process.env['GITHUB_ENV'] || '';
if (filePath) { if (filePath) {
return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val)); const delimiter = `ghadelimiter_${uuid_1.v4()}`;
// These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
if (name.includes(delimiter)) {
throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
} }
if (convertedVal.includes(delimiter)) {
throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
}
const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
file_command_1.issueCommand('ENV', commandValue);
}
else {
command_1.issueCommand('set-env', { name }, convertedVal); command_1.issueCommand('set-env', { name }, convertedVal);
}
} }
exports.exportVariable = exportVariable; exports.exportVariable = exportVariable;
/** /**
@ -1814,7 +1802,7 @@ exports.setSecret = setSecret;
function addPath(inputPath) { function addPath(inputPath) {
const filePath = process.env['GITHUB_PATH'] || ''; const filePath = process.env['GITHUB_PATH'] || '';
if (filePath) { if (filePath) {
file_command_1.issueFileCommand('PATH', inputPath); file_command_1.issueCommand('PATH', inputPath);
} }
else { else {
command_1.issueCommand('add-path', {}, inputPath); command_1.issueCommand('add-path', {}, inputPath);
@ -1854,10 +1842,7 @@ function getMultilineInput(name, options) {
const inputs = getInput(name, options) const inputs = getInput(name, options)
.split('\n') .split('\n')
.filter(x => x !== ''); .filter(x => x !== '');
if (options && options.trimWhitespace === false) {
return inputs; return inputs;
}
return inputs.map(input => input.trim());
} }
exports.getMultilineInput = getMultilineInput; exports.getMultilineInput = getMultilineInput;
/** /**
@ -1890,12 +1875,8 @@ exports.getBooleanInput = getBooleanInput;
*/ */
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
function setOutput(name, value) { function setOutput(name, value) {
const filePath = process.env['GITHUB_OUTPUT'] || '';
if (filePath) {
return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
}
process.stdout.write(os.EOL); process.stdout.write(os.EOL);
command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value)); command_1.issueCommand('set-output', { name }, value);
} }
exports.setOutput = setOutput; exports.setOutput = setOutput;
/** /**
@ -2024,11 +2005,7 @@ exports.group = group;
*/ */
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
function saveState(name, value) { function saveState(name, value) {
const filePath = process.env['GITHUB_STATE'] || ''; command_1.issueCommand('save-state', { name }, value);
if (filePath) {
return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
}
command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
} }
exports.saveState = saveState; exports.saveState = saveState;
/** /**
@ -2918,11 +2895,10 @@ exports.default = _default;
/***/ (function(module, __unusedexports, __webpack_require__) { /***/ (function(module, __unusedexports, __webpack_require__) {
const os = __webpack_require__(87); const os = __webpack_require__(87);
const core = __webpack_require__(470);
module.exports = (process.env['OS'] != 'Windows_NT') ? { const defaults = (process.env['OS'] != 'Windows_NT') ? {
// Use getent() system call, since this is what ssh does; makes a difference in Docker-based homePath: os.homedir(),
// Action runs, where $HOME is different from the pwent
homePath: os.userInfo().homedir,
sshAgentCmdDefault: 'ssh-agent', sshAgentCmdDefault: 'ssh-agent',
sshAddCmdDefault: 'ssh-add', sshAddCmdDefault: 'ssh-add',
gitCmdDefault: 'git' gitCmdDefault: 'git'
@ -2934,6 +2910,17 @@ module.exports = (process.env['OS'] != 'Windows_NT') ? {
gitCmdDefault: 'c://progra~1//git//bin//git.exe' gitCmdDefault: 'c://progra~1//git//bin//git.exe'
}; };
const sshAgentCmdInput = core.getInput('ssh-agent-cmd');
const sshAddCmdInput = core.getInput('ssh-add-cmd');
const gitCmdInput = core.getInput('git-cmd');
module.exports = {
homePath: defaults.homePath,
sshAgentCmd: sshAgentCmdInput !== '' ? sshAgentCmdInput : defaults.sshAgentCmdDefault,
sshAddCmd: sshAddCmdInput !== '' ? sshAddCmdInput : defaults.sshAddCmdDefault,
gitCmd: gitCmdInput !== '' ? gitCmdInput : defaults.gitCmdDefault,
};
/***/ }) /***/ })

View file

@ -2,20 +2,12 @@ const core = require('@actions/core');
const child_process = require('child_process'); const child_process = require('child_process');
const fs = require('fs'); const fs = require('fs');
const crypto = require('crypto'); const crypto = require('crypto');
const { homePath, sshAgentCmdDefault, sshAddCmdDefault, gitCmdDefault } = require('./paths.js'); const { homePath, sshAgentCmd, sshAddCmd, gitCmd } = require('./paths.js');
try { try {
const privateKey = core.getInput('ssh-private-key'); const privateKey = core.getInput('ssh-private-key');
const logPublicKey = core.getBooleanInput('log-public-key', {default: true}); const logPublicKey = core.getBooleanInput('log-public-key', {default: true});
const sshAgentCmdInput = core.getInput('ssh-agent-cmd');
const sshAddCmdInput = core.getInput('ssh-add-cmd');
const gitCmdInput = core.getInput('git-cmd');
const sshAgentCmd = sshAgentCmdInput ? sshAgentCmdInput : sshAgentCmdDefault;
const sshAddCmd = sshAddCmdInput ? sshAddCmdInput : sshAddCmdDefault;
const gitCmd = gitCmdInput ? gitCmdInput : gitCmdDefault;
if (!privateKey) { if (!privateKey) {
core.setFailed("The ssh-private-key argument is empty. Maybe the secret has not been configured, or you are using a wrong secret name in your workflow file."); core.setFailed("The ssh-private-key argument is empty. Maybe the secret has not been configured, or you are using a wrong secret name in your workflow file.");

View file

@ -1,16 +1,30 @@
const os = require('os'); const os = require("os");
const core = require("@actions/core");
module.exports = (process.env['OS'] != 'Windows_NT') ? { const defaults =
// Use getent() system call, since this is what ssh does; makes a difference in Docker-based process.env["OS"] != "Windows_NT"
// Action runs, where $HOME is different from the pwent ? {
homePath: os.userInfo().homedir, homePath: os.homedir(),
sshAgentCmdDefault: 'ssh-agent', sshAgentCmdDefault: "ssh-agent",
sshAddCmdDefault: 'ssh-add', sshAddCmdDefault: "ssh-add",
gitCmdDefault: 'git' gitCmdDefault: "git",
} : { }
: {
// Assuming GitHub hosted `windows-*` runners for now // Assuming GitHub hosted `windows-*` runners for now
homePath: os.homedir(), homePath: os.homedir(),
sshAgentCmdDefault: 'c://progra~1//git//usr//bin//ssh-agent.exe', sshAgentCmdDefault: "c://progra~1//git//usr//bin//ssh-agent.exe",
sshAddCmdDefault: 'c://progra~1//git//usr//bin//ssh-add.exe', sshAddCmdDefault: "c://progra~1//git//usr//bin//ssh-add.exe",
gitCmdDefault: 'c://progra~1//git//bin//git.exe' gitCmdDefault: "c://progra~1//git//bin//git.exe",
};
const sshAgentCmdInput = core.getInput("ssh-agent-cmd");
const sshAddCmdInput = core.getInput("ssh-add-cmd");
const gitCmdInput = core.getInput("git-cmd");
module.exports = {
homePath: defaults.homePath,
sshAgentCmd:
sshAgentCmdInput !== "" ? sshAgentCmdInput : defaults.sshAgentCmdDefault,
sshAddCmd: sshAddCmdInput !== "" ? sshAddCmdInput : defaults.sshAddCmdDefault,
gitCmd: gitCmdInput !== "" ? gitCmdInput : defaults.gitCmdDefault,
}; };