--- /dev/null
+#!/usr/bin/env python3
+
+
+def get_image_tag(
+ repo_name: str,
+ pkg_name: str,
+ pkg_version: str,
+) -> str:
+ """
+ Returns a string representing the normal image for a given package
+ """
+ return f"ghcr.io/{repo_name}/builder/{pkg_name}:{pkg_version}"
+
+
+def get_cache_image_tag(
+ repo_name: str,
+ pkg_name: str,
+ pkg_version: str,
+ branch_name: str,
+) -> str:
+ """
+ Returns a string representing the expected image cache tag for a given package
+
+ Registry type caching is utilized for the builder images, to allow fast
+ rebuilds, generally almost instant for the same version
+ """
+ return f"ghcr.io/{repo_name}/builder/cache/{pkg_name}:{pkg_version}"
from pathlib import Path
from typing import Final
-
-def _get_image_tag(
- repo_name: str,
- pkg_name: str,
- pkg_version: str,
-) -> str:
- return f"ghcr.io/{repo_name}/builder/{pkg_name}:{pkg_version}"
+from common import get_cache_image_tag
+from common import get_image_tag
def _main():
args: Final = parser.parse_args()
+ # Read from environment variables set by GitHub Actions
repo_name: Final[str] = os.environ["GITHUB_REPOSITORY"]
+ branch_name: Final[str] = os.environ["GITHUB_REF_NAME"]
# Default output values
version = None
if args.package == "frontend":
# Version is just the branch or tag name
- version = os.environ["GITHUB_REF_NAME"]
+ version = branch_name
elif args.package in pipfile_data["default"]:
# Read the version from Pipfile.lock
pkg_data = pipfile_data["default"][args.package]
"name": args.package,
"version": version,
"git_tag": git_tag,
- "image_tag": _get_image_tag(repo_name, args.package, version),
+ "image_tag": get_image_tag(repo_name, args.package, version),
+ "cache_tag": get_cache_image_tag(
+ repo_name,
+ args.package,
+ version,
+ branch_name,
+ ),
}
# Add anything special a package may need
uses: actions/setup-python@v3
with:
python-version: "3.9"
- -
- name: Make script executable
- run: |
- chmod +x ${GITHUB_WORKSPACE}/docker-builders/get-build-json.py
-
name: Setup qpdf image
id: qpdf-setup
run: |
- build_json=$(python ${GITHUB_WORKSPACE}/docker-builders/get-build-json.py qpdf)
+ build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py qpdf)
echo ${build_json}
name: Setup psycopg2 image
id: psycopg2-setup
run: |
- build_json=$(python ${GITHUB_WORKSPACE}/docker-builders/get-build-json.py psycopg2)
+ build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py psycopg2)
echo ${build_json}
name: Setup pikepdf image
id: pikepdf-setup
run: |
- build_json=$(python ${GITHUB_WORKSPACE}/docker-builders/get-build-json.py pikepdf)
+ build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py pikepdf)
echo ${build_json}
name: Setup jbig2enc image
id: jbig2enc-setup
run: |
- build_json=$(python ${GITHUB_WORKSPACE}/docker-builders/get-build-json.py jbig2enc)
+ build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py jbig2enc)
echo ${build_json}
name: Setup frontend image
id: frontend-setup
run: |
- build_json=$(python ${GITHUB_WORKSPACE}/docker-builders/get-build-json.py frontend)
+ build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py frontend)
echo ${build_json}
-
name: Checkout
uses: actions/checkout@v3
- with:
- fetch-depth: 2
- -
- name: Get changed frontend files
- id: changed-files-specific
- uses: tj-actions/changed-files@v18.1
- with:
- files: |
- src-ui/**
-
name: Login to Github Container Registry
uses: docker/login-action@v1
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- -
- name: Determine if build needed
- id: build-skip-check
- # Skip building the frontend if the tag exists and no src-ui files changed
- run: |
- if ! docker manifest inspect ${{ fromJSON(needs.prepare-docker-build.outputs.frontend-json).image_tag }} &> /dev/null ; then
- echo "Build required, no existing image"
- echo ::set-output name=frontend-build-needed::true
- elif ${{ steps.changed-files-specific.outputs.any_changed }} == 'true' ; then
- echo "Build required, src-ui changes"
- echo ::set-output name=frontend-build-needed::true
- else
- echo "No build required"
- echo ::set-output name=frontend-build-needed::false
- fi
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- if: ${{ steps.build-skip-check.outputs.frontend-build-needed == 'true' }}
-
name: Set up QEMU
uses: docker/setup-qemu-action@v1
- if: ${{ steps.build-skip-check.outputs.frontend-build-needed == 'true' }}
-
name: Compile frontend
uses: docker/build-push-action@v2
- if: ${{ steps.build-skip-check.outputs.frontend-build-needed == 'true' }}
with:
context: .
file: ./docker-builders/Dockerfile.frontend
# But the platform is set to the runner's native for speedup
platforms: linux/amd64
push: true
- cache-from: type=gha
- cache-to: type=gha,mode=max
+ cache-from: type=registry,ref=${{ fromJSON(needs.prepare-docker-build.outputs.frontend-json).cache_tag }}
+ cache-to: type=registry,mode=max,ref=${{ fromJSON(needs.prepare-docker-build.outputs.frontend-json).cache_tag }}
-
name: Export frontend artifact from docker
run: |
-
name: Get changed files
id: changed-files-specific
- uses: tj-actions/changed-files@v18.1
+ uses: tj-actions/changed-files@v18.7
with:
files: |
src/**
name: Build ${{ fromJSON(inputs.build-json).name }} @ ${{ fromJSON(inputs.build-json).version }}
runs-on: ubuntu-latest
steps:
+ -
+ name: Checkout
+ uses: actions/checkout@v3
-
name: Login to Github Container Registry
uses: docker/login-action@v1
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- -
- name: Determine if build needed
- id: build-skip-check
- run: |
- if ! docker manifest inspect ${{ fromJSON(inputs.build-json).image_tag }} &> /dev/null ; then
- echo "Building, no image exists with this version"
- echo ::set-output name=image-exists::false
- else
- echo "Not building, image exists with this version"
- echo ::set-output name=image-exists::true
- fi
- -
- name: Checkout
- uses: actions/checkout@v3
- if: ${{ steps.build-skip-check.outputs.image-exists == 'false' }}
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- if: ${{ steps.build-skip-check.outputs.image-exists == 'false' }}
-
name: Set up QEMU
uses: docker/setup-qemu-action@v1
- if: ${{ steps.build-skip-check.outputs.image-exists == 'false' }}
-
name: Build ${{ fromJSON(inputs.build-json).name }}
uses: docker/build-push-action@v2
- if: ${{ steps.build-skip-check.outputs.image-exists == 'false' }}
with:
context: .
file: ${{ inputs.dockerfile }}
platforms: linux/amd64,linux/arm64,linux/arm/v7
build-args: ${{ inputs.build-args }}
push: true
- cache-from: type=gha
- cache-to: type=gha,mode=max
+ cache-from: type=registry,ref=${{ fromJSON(inputs.build-json).cache_tag }}
+ cache-to: type=registry,mode=max,ref=${{ fromJSON(inputs.build-json).cache_tag }}