Use GitHub Actions to remove unused images from your repo
Steve Martinelli
by Steve Martinelli

Tags

  • software
  • git
  • bash

This post is an update from my previous “Remove unused images from your git project” post.

With a functional bash script that I could re-use for any git repo, I wanted to make the process of cleaning up my repo as painless and automated as possible. The initial goal was to make the script available on DockerHub (which it is), but that soon evolved to being able to run the script with a GitHub Action.

The code for this post can be found in this repo: https://github.com/stevemar/image-deleter

Creating a Docker Image

Being able to run our script with Docker was pretty easy, we needed to package it up in a Dockerfile and modify it a bit so it’s looking at a mounted volume (hardcoded to /source). Here’s the Dockerfile that was used.

FROM bash:4.4
RUN apk add --no-cache git grep
COPY rm-images.sh .
ENTRYPOINT [ "bash", "/rm-images.sh", "/source" ]

Once I published the first version I was able to run it with just one command:

docker run -v `pwd`:/source stevemar/image-deleter:latest

This would mount the current path (determined with pwd to /source) and then call our image on DockerHub. The file would be marked as deleted and we saved some time by not having to carry our script around with us to every new repo.

Creating a GitHub Action

Going one step further, where we don’t have to run anything, but rather we integrate that clean up into our repo would be the best case scenario. So why not try creating a GitHub Action?

Turns out creating a GitHub Action based on a Docker image is just a few lines of YAML. Here’s the action.yml that was used.

name: 'Stale Image Remover'
description: 'Remove stale images from your repo'

runs:
  using: 'docker'
  image: 'Dockerfile'

branding:
  icon: 'git-pull-request'
  color: 'blue'

his effectively allows our Action to be consumed by others, so long as they include this block of text in as a job their Action

  - name: Remove the images
    uses: stevemar/image-deleter@v1.0.1

Once a new version was released I immediately made it available on the Marketplace: Here’s the “Stale Image Remover” on the Marketplace.

Testing it all out

I created a repo to test the action, here’s the repo. The action makes use of the “Create Pull Request” action to create a pull request against the repo. An example action can be found here: https://github.com/stevemar/testing-images/blob/master/.github/workflows/main.yml

on:
  push:
    branches:
      - master

jobs:
  rm_old_images:
    runs-on: ubuntu-latest
    name: A job to remove images
    steps:
      - name: Checking out our code
        uses: actions/checkout@master
      - name: Remove the images
        uses: stevemar/image-deleter@v1.0.1
      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v2
        with:
          token: $
          commit-message: Remove unused images
          title: '[Automated PR] Remove unused images'
          body: |
            Found a few images that can be removed
            [1]: https://github.com/stevemar/image-deleter
      - name: Check outputs
        run: |
          echo "Pull Request Number - $"
          echo "Pull Request Number - $"

Most of this action can be copy and pasted directly to your repo and it’ll start working right away. You just need to create a Secret called GH_TOKEN, which is based on your API key. You can tweak the commit message, title, and body to whatever you like. Shout out to Peter Evans for the fantastic GitHub Action he created.

Setup a Secret

Once the job is published you can check out the logs…

GitHub Action Logs

And then see a Pull Request come in automatically…

Automated Pull Request

Summary

That’s it, hopefully I’ll make a video of this soon!