Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: retry only on specific exit code #58

Merged
merged 7 commits into from Apr 26, 2022
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
39 changes: 37 additions & 2 deletions .github/workflows/ci_cd.yml
@@ -1,8 +1,7 @@
name: CI/CD
on:
push:
branches:
- '**'

jobs:
# runs on branch pushes only
ci:
Expand Down Expand Up @@ -79,6 +78,42 @@ jobs:
command: node -e "process.exit(1)"
on_retry_command: node -e "console.log('this is a retry command')"

- name: retry_on_exit_code (with expected error code)
id: retry_on_exit_code_expected
uses: ./
continue-on-error: true
with:
timeout_minutes: 1
retry_on_exit_code: 2
max_attempts: 3
command: node -e "process.exit(2)"
- uses: nick-invision/assert-action@v1
with:
expected: failure
actual: ${{ steps.retry_on_exit_code_expected.outcome }}
- uses: nick-invision/assert-action@v1
with:
expected: 3
actual: ${{ steps.retry_on_exit_code_expected.outputs.total_attempts }}

- name: retry_on_exit_code (with unexpected error code)
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@andersfischernielsen @erwinw

Can you take a look at this test failure? I made a few tweaks to your tests, first being that a duplicate id was used which caused the entire workflow to fail, then I added assertions to your two tests.

The assertion is failing for your retry_on_exit_code (with unexpected error code) test. I assert that if an unexpected exit code is thrown (exit code 1), and the retry_on_exit_code is set (exit code 2), then the rerun should only occur once not 3x as is happening currently. I think you need to also handle max_attempts when retry_on_exit_code is set and skip additional attempts if an unexpected exit code is returned.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @nick-fields , well danged, I've poked gently asked @andersfischernielsen to have a look at this!

id: retry_on_exit_code_unexpected
uses: ./
continue-on-error: true
with:
timeout_minutes: 1
retry_on_exit_code: 2
max_attempts: 3
command: node -e "process.exit(1)"
- uses: nick-invision/assert-action@v1
with:
expected: failure
actual: ${{ steps.retry_on_exit_code_unexpected.outcome }}
- uses: nick-invision/assert-action@v1
with:
expected: 1
actual: ${{ steps.retry_on_exit_code_unexpected.outputs.total_attempts }}

- name: on-retry-cmd (on-retry fails)
id: on-retry-cmd-fails
uses: ./
Expand Down
3 changes: 3 additions & 0 deletions action.yml
Expand Up @@ -39,6 +39,9 @@ inputs:
new_command_on_retry:
description: Command to run if the first attempt fails. This command will be called on all subsequent attempts.
required: false
retry_on_exit_code:
description: Specific exit code to retry on. This will only retry for the given error code and fail immediately other error codes.
required: false
outputs:
total_attempts:
description: The final number of attempts made
Expand Down
4 changes: 3 additions & 1 deletion dist/index.js
Expand Up @@ -289,6 +289,7 @@ var WARNING_ON_RETRY = core_1.getInput('warning_on_retry').toLowerCase() === 'tr
var ON_RETRY_COMMAND = core_1.getInput('on_retry_command');
var CONTINUE_ON_ERROR = getInputBoolean('continue_on_error');
var NEW_COMMAND_ON_RETRY = core_1.getInput('new_command_on_retry');
var RETRY_ON_EXIT_CODE = getInputNumber('retry_on_exit_code', false);
var OS = process.platform;
var OUTPUT_TOTAL_ATTEMPTS_KEY = 'total_attempts';
var OUTPUT_EXIT_CODE_KEY = 'exit_code';
Expand Down Expand Up @@ -499,7 +500,8 @@ function runAction() {
// error: timeout
throw error_2;
case 7:
if (!(exit > 0 && RETRY_ON === 'timeout')) return [3 /*break*/, 8];
if (!(((RETRY_ON_EXIT_CODE && RETRY_ON_EXIT_CODE !== exit) || exit > 0) &&
RETRY_ON === 'timeout')) return [3 /*break*/, 8];
// error: error
throw error_2;
case 8: return [4 /*yield*/, runRetryCmd()];
Expand Down
6 changes: 5 additions & 1 deletion src/index.ts
Expand Up @@ -18,6 +18,7 @@ const WARNING_ON_RETRY = getInput('warning_on_retry').toLowerCase() === 'true';
const ON_RETRY_COMMAND = getInput('on_retry_command');
const CONTINUE_ON_ERROR = getInputBoolean('continue_on_error');
const NEW_COMMAND_ON_RETRY = getInput('new_command_on_retry');
const RETRY_ON_EXIT_CODE = getInputNumber('retry_on_exit_code', false);

const OS = process.platform;
const OUTPUT_TOTAL_ATTEMPTS_KEY = 'total_attempts';
Expand Down Expand Up @@ -187,7 +188,10 @@ async function runAction() {
} else if (!done && RETRY_ON === 'error') {
// error: timeout
throw error;
} else if (exit > 0 && RETRY_ON === 'timeout') {
} else if (
((RETRY_ON_EXIT_CODE && RETRY_ON_EXIT_CODE !== exit) || exit > 0) &&
RETRY_ON === 'timeout'
) {
// error: error
throw error;
} else {
Expand Down