
Image Actions is a Github Action built by performance experts at Calibre that automatically compresses JPEGs, PNGs and WebPs in Pull Requests.
Image Actions offers:
...and more!
.github/workflows/calibreapp-image-actions.yml file in your repository with the following configuration:name: Compress Images
on:
pull_request:
# Run Image Actions when JPG, JPEG, PNG or WebP files are added or changed.
# See https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#onpushpull_requestpaths for reference.
paths:
- '**.jpg'
- '**.jpeg'
- '**.png'
- '**.webp'
jobs:
build:
# Only run on Pull Requests within the same repository, and not from forks.
if: github.event.pull_request.head.repo.full_name == github.repository
name: calibreapp/image-actions
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@master
- name: Compress Images
uses: calibreapp/image-actions@master
with:
# The `GITHUB_TOKEN` is automatically generated by GitHub and scoped only to the repository that is currently running the action. By default, the action can’t update Pull Requests initiated from forked repositories.
# See https://docs.github.com/en/actions/reference/authentication-in-a-workflow and https://help.github.com/en/articles/virtual-environments-for-github-actions#token-permissions
githubToken: ${{ secrets.GITHUB_TOKEN }}

By default, Image Actions will compress images so that they’re smaller and will leave your assets looking clear and crisp. If you want to change or expand those defaults, read on for available options.
:warning: If you are using an older version of Image Actions referencing .github/calibre/image-actions.yml, we suggest you migrate to the latest configuration format.
Add the following arguments to the workflow definition to control compression settings:
with:
jpegQuality: '80'
jpegProgressive: false
pngQuality: '80'
webpQuality: '80'
Options:
Add the following argument to the workflow definition to ignore selected paths:
with:
ignorePaths: 'node_modules/**,build'
ignorePaths accepts a comma-separated string with globbing support of paths to ignore when looking for images to compress.
By default, Image Actions adds optimised images to the current Pull Request and posts a summary comment.
Use the compressOnly option with true value to skip the commit and summary comment if you want to handle this separately (including for forks):
with:
compressOnly: true
compressOnly accepts a Boolean value (true or false) and defaults to false.
It is also possible to run Image Actions on demand or on a recurring schedule. By using the compressOnly option, in conjunction with create-pull-request action by @peter-evans, a new Pull Request will be raised if there are optimised images in a repository.
See an example below:
# Compress images on demand (workflow_dispatch), and at 11pm every Sunday (schedule).
# Open a Pull Request if any images can be compressed.
name: Compress Images
on:
workflow_dispatch:
schedule:
- cron: '00 23 * * 0'
jobs:
build:
name: calibreapp/image-actions
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@master
- name: Compress Images
id: calibre
uses: calibreapp/image-actions@master
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
compressOnly: true
- name: Create New Pull Request If Needed
if: steps.calibre.outputs.markdown != ''
uses: peter-evans/create-pull-request@master
with:
title: Compressed Images Nightly
branch-suffix: timestamp
commit-message: Compressed Images
body: ${{ steps.calibre.outputs.markdown }}
By default, GitHub Actions do not have permission to alter forked repositories. For this reason, Image Actions only works for Pull Requests from branches in the same repository as the destination branch. There are several workarounds for this limitation:
Replace the default GITHUB_TOKEN with a Personal Access Token (PAT) which does have permission to access forked repositories. Be aware that this introduces potential security concerns (which is why it not available by default).
Run Image Actions only for Pull Requests in the current repository. This approach is advised when not using Personal Access Tokens (PATs) to avoid wasting time and compute for compressions that will not be committed. Use the following configuration to check if a Pull Request belongs to the repository:
if: github.event.pull_request.head.repo.full_name == github.repository
compressOnly mode on pushes to master, and then raise a new Pull Request for any images committed without being compressed (e.g. from a forked repository PR). See the configuration in the below example which uses the create-pull-request action by @peter-evans to open the new Pull Request (this only raises a Pull Request if any files are changed in previous steps).name: Compress Images on Push to Master
on:
push:
branches:
- master
paths:
- '**.jpg'
- '**.jpeg'
- '**.png'
- '**.webp'
jobs:
build:
name: calibreapp/image-actions
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@master
- name: Compress Images
id: calibre
uses: calibreapp/image-actions@master
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
compressOnly: true
- name: Create New Pull Request If Needed
if: steps.calibre.outputs.markdown != ''
uses: peter-evans/create-pull-request@master
with:
title: Compressed Images
branch-suffix: timestamp
commit-message: Compressed Images
body: ${{ steps.calibre.outputs.markdown }}
You can combine all of the above customisation options into one all-encompassing workflow to avoid having to set up separate workflows with a lot of duplication.
The example below ensures the right order of task execution within Image Actions. If you’d like to reuse it, make sure to change example/example_repo to your repository details.
# Image Actions will run in the following scenarios:
# - on Pull Requests containing images (not including forks)
# - on pushing of images to `master` (for forks)
# - on demand (https://github.blog/changelog/2020-07-06-github-actions-manual-triggers-with-workflow_dispatch/)
# - at 11 PM every Sunday in anything gets missed with any of the above scenarios
# For Pull Requests, the images are added to the PR.
# For other scenarios, a new PR will be opened if any images are compressed.
name: Compress images
on:
pull_request:
paths:
- '**.jpg'
- '**.jpeg'
- '**.png'
- '**.webp'
push:
branches:
- master
paths:
- '**.jpg'
- '**.jpeg'
- '**.png'
- '**.webp'
workflow_dispatch:
schedule:
- cron: '00 23 * * 0'
jobs:
build:
name: calibreapp/image-actions
runs-on: ubuntu-latest
# Only run on main repo on and PRs that match the main repo.
if: |
github.repository == 'example/example_repo' &&
(github.event_name != 'pull_request' ||
github.event.pull_request.head.repo.full_name == github.repository)
steps:
- name: Checkout Branch
uses: actions/checkout@master
- name: Compress Images
id: calibre
uses: calibreapp/image-actions@master
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
# For non-Pull Requests, run in compressOnly mode and we'll PR after.
compressOnly: ${{ github.event_name != 'pull_request' }}
- name: Create Pull Request
# If it's not a Pull Request then commit any changes as a new PR.
if: |
github.event_name != 'pull_request' &&
steps.calibre.outputs.markdown != ''
uses: peter-evans/create-pull-request@master
with:
title: Auto Compress Images
branch-suffix: timestamp
commit-message: Compress Images
body: ${{ steps.calibre.outputs.markdown }}
If you are using an older version of Image Actions, we recommend checking that your settings are up-to-date.
GITHUB_TOKEN definitionIf your calibreapp-image-actions.yml file has a reference to docker:// or GITHUB_TOKEN as follows:
- name: calibreapp/image-actions
uses: docker://calibreapp/github-image-actions
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Update your configuration to:
- name: Compress Images
uses: calibreapp/image-actions@master
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
If your repository uses .github/calibre/image-actions.yml for configuration, it should be moved into .github/workflows/calibreapp-image-actions.yml. Then delete the image-actions.yml file.
ignorePathsignorePaths is no longer an array and is now a comma separated list. E.g. ignorePaths: "node_modules/**,bin".
To submit a feature, bug fix, or enhancement to Image Actions, follow these steps:
npm install.npm run build or npm run watch (for continuous rebuild-on-save) to build the project.npm run test to run the test suite.docker build -t calibreapp/image-actions:dev ..We value and appreciate all contributions.
Image Actions is helping developers, designers and organisations across the world to make their sites and applications faster. Here’s some of them:
Related reading:
Image compression tools:
Image Actions is licensed under a GNU General Public License.
Content type
Image
Digest
Size
428 MB
Last updated
almost 6 years ago
docker pull calibreapp/github-image-actions