A reusable GitHub Actions workflow for cleaning up old container images from container registries based on tag patterns and retention policies.
- GitHub Container Registry (GHCR)
- Harbor
We consider three tag patterns and associated retention days. The defaults can be changed with arguments.
- Version tags: for releases
- The default catches semantic versioning (like
0.8.1), also with av(likev1.2.12) andlatest - Images will never be deleted
- The default catches semantic versioning (like
- Test tags: for release candidates, or pull-requests
- The default catches
pr-123 - Default: 30 days
- The default catches
- Others
- Anything not matching version or test patterns, also untagged images
- Default: 7 days
| Variable | Description | Required | Default |
|---|---|---|---|
REGISTRY_TYPE |
Registry type: harbor or ghcr |
Yes | - |
REPOSITORY_NAME |
Repository/package name | Yes | - |
DRY_RUN |
Enable dry-run mode | No | true |
VERSION_PATTERN |
Regex pattern for version tags (protected from deletion) | No | ^(v\d+\.\d+\.\d+.*|latest)$ |
TEST_PATTERN |
Regex pattern for test/PR tags | No | ^pr-\d+$ |
TEST_RETENTION_DAYS |
Days to keep test-tagged images (0 = delete immediately) | No | 30 |
OTHERS_RETENTION_DAYS |
Days to keep all other images (0 = delete immediately) | No | 7 |
GITHUB_TOKEN: GitHub token withpackages:writepermission (defaults togithub.token)GITHUB_REPO_OWNER: GitHub organization or user name (automatically set togithub.repository_ownerin GitHub Actions)
HARBOR_URL: Harbor registry URLHARBOR_USERNAME: Harbor usernameHARBOR_PASSWORD: Harbor passwordHARBOR_PROJECT_NAME: Harbor project name
on:
workflow_dispatch:
schedule:
- cron: "5 * * * *"
jobs:
clean:
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- uses: developmentseed/[email protected] # x-release-please-version
env:
REGISTRY_TYPE: ghcr
REPOSITORY_NAME: my-package-name
TEST_RETENTION_DAYS: 30
OTHERS_RETENTION_DAYS: 7
DRY_RUN: false
# GITHUB_TOKEN and GITHUB_REPO_OWNER are automatically set by the actionjobs:
cleanup:
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- uses: developmentseed/[email protected] # x-release-please-version
env:
REGISTRY_TYPE: harbor
REPOSITORY_NAME: data-pipeline
HARBOR_URL: ${{ secrets.HARBOR_URL }}
HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }}
HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }}
HARBOR_PROJECT_NAME: my-projectexport GITHUB_TOKEN=your-token
export GITHUB_REPO_OWNER=repo-owner-or-org
export REGISTRY_TYPE=ghcr
export REPOSITORY_NAME=my-package-name
export TEST_RETENTION_DAYS=30
export OTHERS_RETENTION_DAYS=7
python -m container_registry_cleanup