Skip to content

Commit

Permalink
fix: dont require OS input and use correct shell per os
Browse files Browse the repository at this point in the history
  • Loading branch information
Nick Fields committed Jan 2, 2021
1 parent 877a0ac commit d0aac35
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 79 deletions.
36 changes: 35 additions & 1 deletion .github/workflows/ci_cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ jobs:
expected: failure
actual: ${{ steps.sad_path_timeout.outcome }}

- name: sad-path (wrong shell)
- name: sad-path (wrong shell for OS)
id: wrong_shell
uses: ./
continue-on-error: true
Expand All @@ -215,6 +215,40 @@ jobs:
expected: failure
actual: ${{ steps.wrong_shell.outcome }}

ci_windows:
name: Run Windows Tests
if: startsWith(github.ref, 'refs/heads')
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v1
with:
node-version: 12
- name: Install dependencies
run: npm ci
- name: Powershell test
uses: ./
with:
timeout_minutes: 1
max_attempts: 2
shell: powershell
command: Get-ComputerInfo
- name: CMD.exe test
uses: ./
with:
timeout_minutes: 1
max_attempts: 2
shell: cmd
command: echo %PATH%
- name: Python test
uses: ./
with:
timeout_minutes: 1
max_attempts: 2
shell: python
command: print 1, 2, 3

# runs on push to master only
cd:
Expand Down
5 changes: 0 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,6 @@ Retries an Action step on failure or timeout. This is currently intended to repl

**Required** The command to run

### `OS`

**Required** The OS passed from the runner (runner.OS)

### `retry_wait_seconds`

**Optional** Number of seconds to wait before attempting the next retry. Defaults to `10`
Expand Down Expand Up @@ -69,7 +65,6 @@ uses: nick-invision/retry@v2
with:
timeout_minutes: 10
max_attempts: 3
os: ${{ runner.os }}
shell: pwsh
command: dir
```
Expand Down
4 changes: 0 additions & 4 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,9 @@ inputs:
description: Number of seconds to wait before attempting the next retry
required: false
default: 10
OS:
description: OS Passed from Runner (runner.OS)
required: true
shell:
description: Shell to Use to retry (Default is pwsh)
required: false
default: pwsh
polling_interval_seconds:
description: Number of seconds to wait for each check that command has completed running
required: false
Expand Down
79 changes: 37 additions & 42 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -247,13 +247,13 @@ var util_1 = __webpack_require__(322);
var TIMEOUT_MINUTES = getInputNumber('timeout_minutes', false);
var TIMEOUT_SECONDS = getInputNumber('timeout_seconds', false);
var MAX_ATTEMPTS = getInputNumber('max_attempts', true) || 3;
var OS = core_1.getInput('os', { required: true });
var COMMAND = core_1.getInput('command', { required: true });
var RETRY_WAIT_SECONDS = getInputNumber('retry_wait_seconds', false) || 10;
var SHELL = core_1.getInput('shell') || 'pwsh';
var SHELL = core_1.getInput('shell');
var POLLING_INTERVAL_SECONDS = getInputNumber('polling_interval_seconds', false) || 1;
var RETRY_ON = core_1.getInput('retry_on') || 'any';
var WARNING_ON_RETRY = core_1.getInput('warning_on_retry').toLowerCase() === 'true';
var OS = process.platform;
var OUTPUT_TOTAL_ATTEMPTS_KEY = 'total_attempts';
var OUTPUT_EXIT_CODE_KEY = 'exit_code';
var OUTPUT_EXIT_ERROR_KEY = 'exit_error';
Expand Down Expand Up @@ -307,6 +307,39 @@ function getTimeout() {
}
throw new Error('Must specify either timeout_minutes or timeout_seconds inputs');
}
function getExecutable() {
if (!SHELL) {
return OS === 'win32' ? 'powershell' : 'bash';
}
var executable;
switch (SHELL) {
case "bash":
case "python":
case "pwsh": {
executable = SHELL;
break;
}
case "sh": {
if (OS === 'win32') {
throw new Error("Shell " + SHELL + " not allowed on OS " + OS);
}
executable = SHELL;
break;
}
case "cmd":
case "powershell": {
if (OS !== 'win32') {
throw new Error("Shell " + SHELL + " not allowed on OS " + OS);
}
executable = SHELL + ".exe";
break;
}
default: {
throw new Error("Shell " + SHELL + " required");
}
}
return executable;
}
function runCmd() {
var _a, _b;
return __awaiter(this, void 0, void 0, function () {
Expand All @@ -315,48 +348,10 @@ function runCmd() {
switch (_c.label) {
case 0:
end_time = Date.now() + getTimeout();
executable = getExecutable();
exit = 0;
done = false;
executable = SHELL + ".exe";
switch (SHELL) {
case "pwsh": {
executable = SHELL;
break;
}
case "bash": {
executable = SHELL;
break;
}
case "python": {
executable = SHELL;
break;
}
case "sh": {
if (OS === 'Windows') {
throw new Error("Shell " + SHELL + " not allowed on OS " + OS);
}
executable = SHELL;
break;
}
case "cmd": {
if (OS !== 'Windows') {
throw new Error("Shell " + SHELL + " not allowed on OS " + OS);
}
executable = SHELL + ".exe";
break;
}
case "powershell": {
if (OS !== 'Windows') {
throw new Error("Shell " + SHELL + " not allowed on OS " + OS);
}
executable = SHELL + ".exe";
break;
}
default: {
throw new Error("Shell " + SHELL + " required");
break;
}
}
core_1.debug("Running command " + COMMAND + " on " + OS + " using shell " + executable);
child = child_process_1.exec(COMMAND, { 'shell': executable });
(_a = child.stdout) === null || _a === void 0 ? void 0 : _a.on('data', function (data) {
process.stdout.write(data);
Expand Down
1 change: 0 additions & 1 deletion sample.env
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,5 @@ INPUT_MAX_ATTEMPTS=3
INPUT_COMMAND="node -e 'process.exit(99)'"
INPUT_RETRY_WAIT_SECONDS=10
SHELL=pwsh
OS=Linux
INPUT_POLLING_INTERVAL_SECONDS=1
INPUT_RETRY_ON=any
47 changes: 21 additions & 26 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ import { wait } from './util';
const TIMEOUT_MINUTES = getInputNumber('timeout_minutes', false);
const TIMEOUT_SECONDS = getInputNumber('timeout_seconds', false);
const MAX_ATTEMPTS = getInputNumber('max_attempts', true) || 3;
const OS = getInput('os', { required: true });
const COMMAND = getInput('command', { required: true });
const RETRY_WAIT_SECONDS = getInputNumber('retry_wait_seconds', false) || 10;
const SHELL = getInput('shell') || 'pwsh';
const SHELL = getInput('shell');
const POLLING_INTERVAL_SECONDS = getInputNumber('polling_interval_seconds', false) || 1;
const RETRY_ON = getInput('retry_on') || 'any';
const WARNING_ON_RETRY = getInput('warning_on_retry').toLowerCase() === 'true';

const OS = process.platform;
const OUTPUT_TOTAL_ATTEMPTS_KEY = 'total_attempts';
const OUTPUT_EXIT_CODE_KEY = 'exit_code';
const OUTPUT_EXIT_ERROR_KEY = 'exit_error';
Expand Down Expand Up @@ -63,54 +63,49 @@ function getTimeout(): number {
throw new Error('Must specify either timeout_minutes or timeout_seconds inputs');
}

async function runCmd() {
const end_time = Date.now() + getTimeout();

exit = 0;
done = false;
function getExecutable(): string {
if (!SHELL) {
return OS === 'win32' ? 'powershell' : 'bash';
}

let executable: string = SHELL + ".exe";
let executable: string;
switch (SHELL) {
case "bash":
case "python":
case "pwsh": {
executable = SHELL;
break;
}
case "bash": {
executable = SHELL;
break;
}
case "python": {
executable = SHELL;
break;
}
case "sh": {
if (OS === 'Windows') {
if (OS === 'win32') {
throw new Error(`Shell ${SHELL} not allowed on OS ${OS}`);
}
executable = SHELL;
break;
}
case "cmd": {
if (OS !== 'Windows') {
throw new Error(`Shell ${SHELL} not allowed on OS ${OS}`);
}
executable = SHELL + ".exe";
break;
}
case "cmd":
case "powershell": {
if (OS !== 'Windows') {
if (OS !== 'win32') {
throw new Error(`Shell ${SHELL} not allowed on OS ${OS}`);
}
executable = SHELL + ".exe";
break;
}
default: {
throw new Error(`Shell ${SHELL} required`);
break;
}
}
return executable
}

async function runCmd() {
const end_time = Date.now() + getTimeout();
const executable = getExecutable();

exit = 0;
done = false;

debug(`Running command ${COMMAND} on ${OS} using shell ${executable}`)
var child = exec(COMMAND, { 'shell': executable });

child.stdout?.on('data', (data) => {
Expand Down

0 comments on commit d0aac35

Please sign in to comment.