A GitHub Action to help with deleting workflow artifacts.
See also jimschubert/delete-artifacts.
Required Default: ${{github.token}}
GitHub token used to access the repository defined in the GITHUB_REPOSITORY input.
It is recommended to create a new personal access token with the least permissions (e.g. public_repo). Using a service account for the GitHub Token is also highly recommended.
Learn more about using secrets
Required Default: ${{github.repository}}
The target github repo in the format owner/repo
Optional
A specific Actions run identifier. You can use this to specify the current run and do some post-run cleanup.
Required
The minimum file size in bytes. The default is "0", effectively meaning it will start off by matching all files.
Consider applying another filter such as name or pattern if you'd like to avoid deleting everything.
NOTE This value must be a quoted integer.
Optional
The maximum file size in bytes. If not specified, there is no limit.
This option is useful if you have many small artifacts and want to keep a specific larger artifact.
NOTE This value must be a quoted integer.
Optional
The name of a specific artifact to delete. If not specified, this may result in all artifacts being deleted.
Optional
A POSIX regular expression. This is useful, for example, if you have matrix artifacts with a common prefix or suffix.
Optional
A duration string which defines the duration during which artifacts are considered "active" and will therefore not be deleted.
This setting is useful to avoid deleting artifacts for current or very recent runs (e.g. specify "10m"), or to allow for debugging of artifacts for some amount of time (e.g. specify "23h59m"). This acts as a retention period for artifacts when using otherwise aggressive deletion settings.
This format follows the go Duration formatting.
Optional
Specifies a custom log level.
Choose from these options:
- debug
- info
- warn
- error
Optional
Perform a dry-run. It's recommended to do this first to be sure you have correct settings.
The action itself does not output any arguments.
Artifacts become associated with a workflow once the workflow completes. You can use a repository dispatch to "kick off" an artifact cleanup.
This step requires a Personal Access Token, rather than the GITHUB_TOKEN
available by default
Create this first file at .github/workflows/generate.yml
:
name: Generate artifacts and trigger cleanup
on:
workflow_dispatch:
inputs:
size:
description: 'Target file size'
required: true
default: '1M'
name:
description: 'Artifact name'
required: true
default: 'artifact.bin'
defaults:
run:
shell: bash
jobs:
# This job represents your "standard" job. notice that the job outputs `github.run_id` as an example of passing variables to a triggering job
generate:
runs-on: ubuntu-latest
continue-on-error: false
outputs:
# We can use outputs across jobs in the final trigger job
target_run_id: ${{ github.run_id }}
steps:
# Generate a file of empty bytes (this could be a build task)
- name: Generate a file
run: |
truncate -s ${{ github.event.inputs.size }} ${{ github.event.inputs.name }}
echo "Created file ${{ github.event.inputs.name }} (${{ github.event.inputs.size }})"
# Upload the artifact. Artifacts expire after 90 days, which may count toward storage costs on private repositories
- name: Upload artifact as ${{ github.event.inputs.name }}
uses: actions/upload-artifact@v1
with:
name: ${{ github.event.inputs.name }}
path: ${{ github.event.inputs.name }}
# This example triggers via separate job to demonstrate passing variables between jobs and workflows, but the step can exist in a single job.
trigger:
runs-on: ubuntu-latest
needs: generate
continue-on-error: false
steps:
# See https://docs.github.com/en/rest/reference/repos#create-a-repository-dispatch-event
# This requires a Personal Access Token (PAT), the GITHUB_TOKEN provided to workflows will not work.
- name: Repository Dispatch
uses: peter-evans/repository-dispatch@v1.0.0
with:
# THIS MUST BE A PERSONAL ACCESS TOKEN
token: ${{secrets.TRIGGER_TOKEN}}
repository: ${{github.repository}}
event-type: triggered-event
# Payload properties can be any name. Note size, base_name, and run_id referring to this workflow's inputs and the generate tasks's outputs
client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "size": "${{ github.event.inputs.size }}", "base_name": "${{ github.event.inputs.name }}", "run_id": "${{needs.generate.outputs.target_run_id}}"}'
Create the following file at .github/workflows/cleanup.yml
:
name: Cleanup
on:
repository_dispatch:
types:
- triggered-event
jobs:
# Demonstrate how to delete by name
delete-by-name:
runs-on: ubuntu-latest
continue-on-error: true
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Delete Artifact by Name
uses: jimschubert/delete-artifacts-action@v1
with:
log_level: 'debug'
artifact_name: '${{ github.event.client_payload.base_name }}'
min_bytes: '0'
# Demonstrate how to delete by active_duration
delete-by-retention-duration:
needs: delete-by-name
continue-on-error: true
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Delete Artifact by active duration (expect no deletions)
uses: jimschubert/delete-artifacts-action@v1
with:
log_level: 'debug'
min_bytes: '0'
active_duration: '30m'
- name: Sleep 2 minutes
run: |
echo "Sleeping for 2 minutes, then we'll use duration 1m30s"
sleep 120
- name: Delete Artifact by active duration (expect deletions)
uses: jimschubert/delete-artifacts-action@v1
with:
log_level: 'debug'
min_bytes: '0'
active_duration: '1m30s'
# Demonstrates how to use POSIX pattern for deleting artifacts
delete-by-pattern:
needs: delete-by-retention-duration
continue-on-error: true
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Delete by pattern
uses: jimschubert/delete-artifacts-action@v1
with:
log_level: 'debug'
min_bytes: '0'
pattern: '\.pat'
# Demonstrates how to use a run id for deleting artifacts
# This could be used for overall cleanup
delete-by-runId:
needs: [delete-by-pattern]
continue-on-error: true
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Delete by run id
if: ${{ github.event.client_payload.run_id }}
uses: jimschubert/delete-artifacts-action@v1
with:
log_level: 'debug'
min_bytes: '0'
run_id: '${{ github.event.client_payload.run_id }}'
The following example runs cleanup of all artifacts weekly at a specific time.
In your repository as .github/workflows/cleanup.yml
:
name: Weekly cleanup
on:
schedule:
- cron: "0 18 * * 6"
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Weekly Artifact Cleanup
uses: jimschubert/delete-artifacts-action@v1
with:
log_level: 'error'
min_bytes: '0'
This project is licensed under Apache 2.0.