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

READY: Add alternative action files related to js_action branch #154

Merged
merged 2 commits into from
Apr 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 28 additions & 1 deletion Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ It is a cause of failed jobs. For this case, the action `wretry.action` can retr
- Retries shell commands. Uses default shells to run commands.
- Can retry single action or single command ( multiline command ), but not both simultaneously.
- Retries `main`, `pre` and `post` stages of external actions.
- Always has `pre` and `post` stages. If external action has `pre` or/and `post` stage, then action run it also.
- Default action always includes both `pre` and `post` stages. If an external action contains a `pre` and/or `post` stage, the action will also execute these stages.
- The repository includes subdirectories with alternative action setups that can skip the `pre` or/and `post` stages, as necessary.
- Action handles conditions in `JavaScript` and `Docker` actions ( fields `pre-if` and `post-if` ). Some conditions can be unsolvable and then action skips the stage.
- Resolves external action default inputs from next contexts : `github`, `env`, `job`, `matrix`, `inputs`.
- Retries actions with defined number of attempts ( default is 2 ).
Expand Down Expand Up @@ -148,6 +149,32 @@ jobs:

To setup job output we access output `outputs` of the step `my-action`. In the job `job2` we parse this output to JSON. The environment variable `OUPUT1` represents full JSON and the variable `OUPUT2` represents key `foo` of the parsed JSON.

## How to skip `pre` or/and `post` stages

The repository provides three subdirectories, each containing a different setup for action retries:

- `pre`: This directory retries the `pre` and `main` stages.
- `post`: This directory retries the `main` and `post` stages.
- `main`: This directory retries only the `main` stage.

It is crucial to note that, regardless of the retried action specification, the actions in the repository will only execute the declared stages. This behavior can disrupt your workflow, so please use the actions with caution.

### Selecting the Alternative Action

You have a few options for obtaining a compatible action implementation:
- Run the workflow with the required action, but without the `wretry.action`, and check the stages in the workflow run.
- Open the action directory and review the `action.yml` file. Look for any extra stages listed besides `main`.
- If you run command, then you can get `main` action that skips `pre` and `post` stages.

### Declaration of alternative action

To choose an alternative action add the action subdirectory in declaration of `wretry.action`. For example, the declaration with `main` subdirectory:
```yml
- uses: Wandalen/wretry.action/main@master
```

You can choose either method based on your preference. If you prefer not to perform additional manipulations, you can select the default `wretry.action` that retries all available stages of the external action.

## Example usage

### Retry action
Expand Down
5 changes: 5 additions & 0 deletions main/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://stand-with-ukraine.pp.ua)

# action::retry [![status](https://github.com/Wandalen/wretry.action/actions/workflows/wRetryActionPublish.yml/badge.svg)](https://github.com/Wandalen/wretry.action/actions/workflows/wRetryActionPublish.yml) [![stable](https://img.shields.io/badge/stability-stable-brightgreen.svg)](https://github.com/emersion/stability-badges#stable)

An alternative [action](../Readme.md) declaration that skips `pre` and `post` stages. It is useful for retrying actions with only `main` stage.
70 changes: 70 additions & 0 deletions main/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: retry action
author: |
Wandalen <wandalen@obox.systems>
dmvict <dm.vict.kr@gmail.com>
branding:
icon: activity
color: white
description: Retries an Github Action step on failure
inputs:
action:
description: 'Github action name. Should be defined action or command, not both.'
required: false
command:
description: 'Command to run. Should be defined action or command, not both.'
required: false
with:
description: An options map for Github action
required: false
current_path:
description: >-
Setup working directory for the action. Works with only commands. Default
is `github.workspace` path.
required: false
attempt_limit:
description: Number of attempts
required: false
default: 2
attempt_delay:
description: A delay between attempts in ms
required: false
default: 0
time_out:
description: >-
Set time out in ms for entire step including all retries. By default
actions sets no time out.
required: false
default: false
retry_condition:
description: >-
Use any valid expression to decide the continuation of retries. Default
value is true.
required: false
default: true
github_token:
description: A token to access private actions. Does not required for public actions.
required: false
outputs:
outputs:
description: A pretty print JSON map with outputs from the wrapped action.
value: '${{ toJSON( steps.retry.outputs ) }}'
runs:
using: composite
steps:
- name: retry
id: retry
uses: Wandalen/wretry.action/main@js_action
with:
action: '${{ inputs.action }}'
command: '${{ inputs.command }}'
with: '${{ inputs.with }}'
current_path: '${{ inputs.current_path }}'
attempt_limit: '${{ inputs.attempt_limit }}'
attempt_delay: '${{ inputs.attempt_delay }}'
retry_condition: '${{ inputs.retry_condition }}'
env_context: '${{ toJSON( env ) }}'
github_context: '${{ toJSON( github ) }}'
job_context: '${{ toJSON( job ) }}'
matrix_context: '${{ toJSON( matrix ) }}'
time_out: '${{ inputs.time_out }}'
github_token: '${{ inputs.github_token }}'
5 changes: 5 additions & 0 deletions post/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://stand-with-ukraine.pp.ua)

# action::retry [![status](https://github.com/Wandalen/wretry.action/actions/workflows/wRetryActionPublish.yml/badge.svg)](https://github.com/Wandalen/wretry.action/actions/workflows/wRetryActionPublish.yml) [![stable](https://img.shields.io/badge/stability-stable-brightgreen.svg)](https://github.com/emersion/stability-badges#stable)

An alternative [action](../Readme.md) declaration that skips `pre` stage. It is useful for retrying actions with `post` stage.
70 changes: 70 additions & 0 deletions post/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: retry action
author: |
Wandalen <wandalen@obox.systems>
dmvict <dm.vict.kr@gmail.com>
branding:
icon: activity
color: white
description: Retries an Github Action step on failure
inputs:
action:
description: 'Github action name. Should be defined action or command, not both.'
required: false
command:
description: 'Command to run. Should be defined action or command, not both.'
required: false
with:
description: An options map for Github action
required: false
current_path:
description: >-
Setup working directory for the action. Works with only commands. Default
is `github.workspace` path.
required: false
attempt_limit:
description: Number of attempts
required: false
default: 2
attempt_delay:
description: A delay between attempts in ms
required: false
default: 0
time_out:
description: >-
Set time out in ms for entire step including all retries. By default
actions sets no time out.
required: false
default: false
retry_condition:
description: >-
Use any valid expression to decide the continuation of retries. Default
value is true.
required: false
default: true
github_token:
description: A token to access private actions. Does not required for public actions.
required: false
outputs:
outputs:
description: A pretty print JSON map with outputs from the wrapped action.
value: '${{ toJSON( steps.retry.outputs ) }}'
runs:
using: composite
steps:
- name: retry
id: retry
uses: Wandalen/wretry.action/post@js_action
with:
action: '${{ inputs.action }}'
command: '${{ inputs.command }}'
with: '${{ inputs.with }}'
current_path: '${{ inputs.current_path }}'
attempt_limit: '${{ inputs.attempt_limit }}'
attempt_delay: '${{ inputs.attempt_delay }}'
retry_condition: '${{ inputs.retry_condition }}'
env_context: '${{ toJSON( env ) }}'
github_context: '${{ toJSON( github ) }}'
job_context: '${{ toJSON( job ) }}'
matrix_context: '${{ toJSON( matrix ) }}'
time_out: '${{ inputs.time_out }}'
github_token: '${{ inputs.github_token }}'
5 changes: 5 additions & 0 deletions pre/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://stand-with-ukraine.pp.ua)

# action::retry [![status](https://github.com/Wandalen/wretry.action/actions/workflows/wRetryActionPublish.yml/badge.svg)](https://github.com/Wandalen/wretry.action/actions/workflows/wRetryActionPublish.yml) [![stable](https://img.shields.io/badge/stability-stable-brightgreen.svg)](https://github.com/emersion/stability-badges#stable)

An alternative [action](../Readme.md) declaration that skips `post` stage. It is useful for retrying actions with `pre` stage.
70 changes: 70 additions & 0 deletions pre/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: retry action
author: |
Wandalen <wandalen@obox.systems>
dmvict <dm.vict.kr@gmail.com>
branding:
icon: activity
color: white
description: Retries an Github Action step on failure
inputs:
action:
description: 'Github action name. Should be defined action or command, not both.'
required: false
command:
description: 'Command to run. Should be defined action or command, not both.'
required: false
with:
description: An options map for Github action
required: false
current_path:
description: >-
Setup working directory for the action. Works with only commands. Default
is `github.workspace` path.
required: false
attempt_limit:
description: Number of attempts
required: false
default: 2
attempt_delay:
description: A delay between attempts in ms
required: false
default: 0
time_out:
description: >-
Set time out in ms for entire step including all retries. By default
actions sets no time out.
required: false
default: false
retry_condition:
description: >-
Use any valid expression to decide the continuation of retries. Default
value is true.
required: false
default: true
github_token:
description: A token to access private actions. Does not required for public actions.
required: false
outputs:
outputs:
description: A pretty print JSON map with outputs from the wrapped action.
value: '${{ toJSON( steps.retry.outputs ) }}'
runs:
using: composite
steps:
- name: retry
id: retry
uses: Wandalen/wretry.action/pre@js_action
with:
action: '${{ inputs.action }}'
command: '${{ inputs.command }}'
with: '${{ inputs.with }}'
current_path: '${{ inputs.current_path }}'
attempt_limit: '${{ inputs.attempt_limit }}'
attempt_delay: '${{ inputs.attempt_delay }}'
retry_condition: '${{ inputs.retry_condition }}'
env_context: '${{ toJSON( env ) }}'
github_context: '${{ toJSON( github ) }}'
job_context: '${{ toJSON( job ) }}'
matrix_context: '${{ toJSON( matrix ) }}'
time_out: '${{ inputs.time_out }}'
github_token: '${{ inputs.github_token }}'
20 changes: 13 additions & 7 deletions step/ActionWrite.s
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,19 @@ function actionWrite( frame )

/* */

const actionPath = fileProvider.path.join( module.dirPath, 'action.yml' );
const action = fileProvider.fileReadUnknown( actionPath );
action.runs.steps[ 0 ].uses = `Wandalen/wretry.action@v${ module.about.version }_js_action`;

logger.log( `Updating action. Setup used action version to "Wandalen/wretry.action@v${ module.about.version }_js_action".` );

fileProvider.fileWrite({ filePath : actionPath, data : action, encoding : 'yaml' });
const subdirectories = [ '', 'main', 'pre', 'post' ];
for( let i = 0 ; i < subdirectories.length ; i++ )
{
const slash = subdirectories[ i ] === '' ? '' : '/';
const actionRelativePath = `${ subdirectories[ i ] }${ slash }action.yml`;
const actionPath = fileProvider.path.join( module.dirPath, actionRelativePath );
const action = fileProvider.fileReadUnknown( actionPath );
action.runs.steps[ 0 ].uses = `Wandalen/wretry.action${ slash }${ subdirectories[ i ] }@v${ module.about.version }_js_action`;

logger.log( `Updating action file "${ actionRelativePath }". Setup action version to "${ action.runs.steps[ 0 ].uses }".` );

fileProvider.fileWrite({ filePath : actionPath, data : action, encoding : 'yaml' });
}
}

module.exports = actionWrite;