Update GHCR #270
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
on: | |
workflow_dispatch: | |
schedule: | |
- cron: 0 3 * * * | |
name: Update GHCR | |
jobs: | |
ghcr_config: | |
name: Read GHCR config | |
if: github.event_name == 'workflow_dispatch' || vars.enabled_workflows == 'all' | |
runs-on: ubuntu-latest | |
permissions: | |
contents: read | |
outputs: | |
external_images: ${{ steps.ghcr_config.outputs.external_images }} | |
internal_images: ${{ steps.ghcr_config.outputs.internal_images }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Get images list | |
id: ghcr_config | |
run: | | |
repo_owner=${{ github.repository_owner }} | |
config=`cat .github/workflows/config/ghcr_config.json | jq ".external_images"` | |
images=`echo "$config" | jq '.[].source'` | |
external_images="{\"images\":[],\"tags\":[]}" | |
for image in $images; do | |
image_data=`echo "$config" | jq ".[] | select(.source==$image)"` | |
source=`echo $image_data | jq -r '.source'` | |
platforms=`echo $image_data | jq -r '.platforms'` | |
original_name=`echo $source | sed -e 's@.*\.io/\(\)@\1@'` | |
package_name=${original_name#${repo_owner,,}} | |
tags=`echo "$image_data" | jq -r '.tags[]'` | |
external_images=`echo $external_images | jq ".images |= . + [\"$source\"]"` | |
info={\"$source\":{\"platforms\":\"$platforms\",\"package_name\":\"$package_name\"}} | |
external_images=`echo $external_images | jq ". |= . + $info"` | |
for tag in $tags; do | |
external_images=`echo $external_images | jq ".tags |= . + [\"$source:$tag\"]"` | |
done | |
done | |
config=`cat .github/workflows/config/ghcr_config.json | jq ".internal_images"` | |
images=`echo "$config" | jq '.[].name'` | |
internal_images="{\"package_names\":[]}" | |
for image in $images; do | |
image_data=`echo "$config" | jq ".[] | select(.name==$image)"` | |
package_name=`echo $image_data | jq -r '.name'` | |
nr_tags_to_keep=`echo $image_data | jq -r '.tags_to_keep'` | |
internal_images=`echo $internal_images | jq ".package_names |= . + [\"$package_name\"]"` | |
info={\"$package_name\":{\"nr_tags_to_keep\":\"$nr_tags_to_keep\"}} | |
internal_images=`echo $internal_images | jq ". |= . + $info"` | |
done | |
echo "internal_images=$(echo $internal_images)" >> $GITHUB_OUTPUT | |
echo "external_images=$(echo $external_images)" >> $GITHUB_OUTPUT | |
delete_images: | |
name: Delete old images on GHCR | |
needs: ghcr_config | |
runs-on: ubuntu-latest | |
permissions: | |
packages: write | |
environment: | |
name: ghcr-deployment | |
url: ${{ vars.deployment_url }} | |
strategy: | |
matrix: | |
image: ${{ fromJson(needs.ghcr_config.outputs.external_images).images }} | |
fail-fast: false | |
steps: | |
- name: Login to GitHub CR | |
uses: docker/login-action@v3 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ github.token }} | |
- name: Delete old images | |
uses: actions/delete-package-versions@v4 | |
with: | |
package-name: ${{ fromJson(needs.ghcr_config.outputs.external_images)[format('{0}', matrix.image)].package_name }} | |
package-type: 'container' | |
min-versions-to-keep: 1 # the used action does not support 0 here | |
continue-on-error: true | |
push_images: | |
name: Push new images to GHCR | |
needs: [ghcr_config, delete_images] | |
runs-on: ubuntu-latest | |
permissions: | |
packages: write | |
environment: | |
name: ghcr-deployment | |
url: ${{ vars.deployment_url }} | |
strategy: | |
matrix: | |
tag: ${{ fromJson(needs.ghcr_config.outputs.external_images).tags }} | |
fail-fast: false | |
steps: | |
- name: Login to GitHub CR | |
uses: docker/login-action@v3 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ github.token }} | |
- name: Set up context for buildx | |
run: | | |
docker context create builder_context | |
- name: Set up buildx runner | |
uses: docker/setup-buildx-action@v3 | |
with: | |
endpoint: builder_context | |
- name: Prepare push | |
id: metadata | |
run: | | |
dockerfile=image.Dockerfile | |
echo 'FROM ${{ matrix.tag }}' > $dockerfile | |
repo_owner=${{ github.repository_owner }} | |
original_name=`echo ${{ matrix.tag }} | rev | cut -d : -f2- | rev` | |
original_tag=`echo ${{ matrix.tag }} | rev | cut -d : -f1 | rev` | |
external_images='${{ needs.ghcr_config.outputs.external_images }}' | |
package_name=`echo $external_images | jq -r ".\"$original_name\".package_name"` | |
platforms=`echo $external_images | jq -r ".\"$original_name\".platforms"` | |
# No need to specify labels - they propagate automatically | |
echo "dockerfile=$dockerfile" >> $GITHUB_OUTPUT | |
echo "tags=${{ vars.registry }}/${repo_owner,,}/${package_name}:${original_tag}" >> $GITHUB_OUTPUT | |
echo "platforms=$platforms" >> $GITHUB_OUTPUT | |
- name: Push image to GHCR | |
id: docker_build | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
file: ${{ steps.metadata.outputs.dockerfile }} | |
tags: ${{ steps.metadata.outputs.tags }} | |
labels: ${{ steps.metadata.outputs.labels }} | |
platforms: ${{ steps.metadata.outputs.platforms }} | |
push: true | |
delete_internal_images: | |
name: Clean up internal images on GHCR | |
needs: ghcr_config | |
runs-on: ubuntu-latest | |
permissions: | |
packages: write | |
environment: | |
name: ghcr-deployment | |
url: ${{ vars.deployment_url }} | |
strategy: | |
matrix: | |
package_name: ${{ fromJson(needs.ghcr_config.outputs.internal_images).package_names }} | |
fail-fast: false | |
steps: | |
- name: Login to GitHub CR | |
uses: docker/login-action@v3 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ github.token }} | |
- name: Delete old images | |
uses: actions/delete-package-versions@v4 | |
with: | |
package-name: ${{ matrix.package_name }} | |
package-type: 'container' | |
min-versions-to-keep: ${{ fromJson(needs.ghcr_config.outputs.internal_images)[format('{0}', matrix.package_name)].nr_tags_to_keep }} | |
continue-on-error: true |