Commit 0444993c authored by Adrian DC's avatar Adrian DC
Browse files

feat: implement #3: support job retry values upon executions

parent 643ec92e
Loading
Loading
Loading
Loading
Loading
+2 −0
Changes for .gitlab-ci.yml: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -101,6 +101,8 @@ stages:
    - gitlabci-local -c ./tests/environment/.gitlab-ci.yml -v ./:/opt -w /opt/ 'Job 2'
    - gitlabci-local -c ./tests/entrypoints/.gitlab-ci.yml -d
    - gitlabci-local -c ./tests/entrypoints/.gitlab-ci.yml -p
    - gitlabci-local -c ./tests/retry/.gitlab-ci.yml -p failure && exit 1 || true
    - gitlabci-local -c ./tests/retry/.gitlab-ci.yml -p success

'Deploy Test':
  stage: deploy
+11 −1
Changes for gitlabci_local/parser.py: 11 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -189,11 +189,13 @@ def stager(options, job_name, job_data, global_values):
    job['name'] = job_name
    job['stage'] = job_data['stage']
    job['image'] = global_values['image']
    job['entrypoint'] = global_values['entrypoint'][:] if global_values['entrypoint'] else None
    job['entrypoint'] = global_values['entrypoint'][:] if global_values[
        'entrypoint'] else None
    job['variables'] = dict(global_values['variables'])
    job['before_script'] = global_values['before_script'][:]
    job['script'] = []
    job['after_script'] = global_values['after_script'][:]
    job['retry'] = 0
    job['when'] = 'on_success'
    job['tags'] = []

@@ -226,6 +228,14 @@ def stager(options, job_name, job_data, global_values):
    if 'after_script' in job_data and job_data['after_script']:
        job['after_script'] = job_data['after_script'][:]

    # Extract job retry
    if 'retry' in job_data:
        retry_data = job_data['retry']
        if isinstance(retry_data, dict):
            job['retry'] = int(retry_data['max'])
        else:
            job['retry'] = int(retry_data)

    # Extract job when
    if 'when' in job_data and job_data['when'] in [
            'on_success', 'on_failure', 'always', 'manual'
+8 −0
Changes for gitlabci_local/runner.py: 8 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -40,8 +40,16 @@ def launcher(options, jobs):
            result = True

        # Run job
        attempt = 0
        expected = result
        result = runner(options, jobs[job], result)

        # Retry job if allowed
        if expected and not result and jobs[job]['retry'] > 0:
            while not result and attempt < jobs[job]['retry']:
                attempt += 1
                result = runner(options, jobs[job], expected)

    # Result
    return True if result else False

tests/retry/.gitignore

0 → 100644
+2 −0
Changes for tests/retry/.gitignore: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
# Intermediates
retry.tmp
+48 −0
Changes for tests/retry/.gitlab-ci.yml: 48 added lines, 0 removed lines.
Original line number Diff line number Diff line
image: alpine:3

stages:
  - failure
  - success

'Job 1':
  stage: failure
  script:
    - echo 'Job 1'
    - echo '1' >./retry.tmp
    - 'false'
  retry: 0

'Job 2':
  stage: success
  script:
    - echo 'Job 2'
    - echo $(($(cat ./retry.tmp) + 1)) >./retry.tmp
    - grep '3' ./retry.tmp
  retry: 1

'Job 3':
  stage: success
  script:
    - echo 'Job 3'
    - echo $(($(cat ./retry.tmp) + 1)) >./retry.tmp
    - grep '6' ./retry.tmp
  retry: 2

'Job 4':
  stage: success
  script:
    - echo 'Job 4'
    - echo $(($(cat ./retry.tmp) + 1)) >./retry.tmp
    - grep '9' ./retry.tmp
  retry:
    max: 2
    when:
      - runner_system_failure
      - stuck_or_timeout_failure

'Job 5':
  stage: success
  script:
    - echo 'Job 5'
    - echo $(($(cat ./retry.tmp) + 1)) >./retry.tmp
    - grep '10' ./retry.tmp