.github: try parallel #53
Workflow file for this run
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
name: Test, Build and Deploy Images | |
env: | |
PROJECT: blueos | |
DOCKER: base | |
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} | |
IMAGE_LIMIT_SIZE_MB: 600 | |
on: | |
workflow_dispatch: | |
pull_request: | |
push: | |
schedule: | |
# Run every 6 days to keep our caches alive | |
- cron: '0 0 */6 * *' | |
jobs: | |
build: | |
runs-on: ubuntu-22.04 | |
strategy: | |
matrix: | |
platform: | |
# - linux/arm/v7 | |
# - linux/arm64 | |
- linux/amd64 | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Prepare | |
id: prepare | |
run: | | |
echo "buildx_args=VUE_APP_GIT_DESCRIBE=$(git describe --long --always --dirty --all)" >> $GITHUB_OUTPUT | |
echo "DOCKER_IMAGE=${DOCKER_USERNAME:-bluerobotics}/${PROJECT}-${DOCKER}" >> $GITHUB_ENV | |
platform=${{ matrix.platform }} | |
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV | |
- name: Docker meta | |
id: meta | |
uses: docker/metadata-action@v5 | |
with: | |
images: ${{ env.DOCKER_IMAGE }} | |
tags: | | |
type=ref,event=branch | |
type=ref,event=pr | |
type=semver,pattern={{version}} | |
type=semver,pattern={{major}}.{{minor}} | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
with: | |
platforms: all | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
with: | |
version: latest | |
- name: Cache APT | |
uses: actions/cache@v4 | |
id: cache | |
with: | |
path: | | |
var-cache-apt | |
var-lib-apt | |
key: ${{ matrix.platform }}-cache-apt-${{ hashFiles('Dockerfile') }} | |
restore-keys: ${{ matrix.platform }}-cache-apt- | |
- name: Inject cache into Docker | |
uses: reproducible-containers/buildkit-cache-dance@v3 | |
with: | |
cache-map: | | |
{ | |
"var-cache-apt": "/var/cache/apt", | |
"var-lib-apt": "/var/lib/apt" | |
} | |
skip-extraction: ${{ steps.cache.outputs.cache-hit }} | |
- name: Login to DockerHub | |
if: success() && github.event_name != 'pull_request' | |
uses: docker/login-action@v3 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
- name: Build and push by digest | |
id: build | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
file: Dockerfile | |
platforms: ${{ matrix.platform }} | |
labels: ${{ steps.meta.outputs.labels }} | |
push: ${{ github.event_name != 'pull_request' }} | |
# outputs: type=image,name=${{ env.DOCKER_IMAGE }},push-by-digest=true,name-canonical=true | |
outputs: type=image,name=${{ env.DOCKER_IMAGE }} | |
build-args: ${{ steps.prepare.outputs.buildx_args }} | |
tags: ${{ steps.meta.outputs.tags }} | |
cache-from: type=gha | |
cache-to: type=gha,mode=max | |
- name: Check size | |
run: | | |
docker image list | |
IMAGE_ID=$(docker images -q ${{ env.DOCKER_IMAGE }} | head -n 1) | |
IMAGE_SIZE_MB=$(( $(docker inspect $IMAGE_ID --format '{{.Size}}')/(2**20) )) | |
echo "Core size is: $IMAGE_SIZE_MB MB" | |
if (( IMAGE_SIZE_MB >= IMAGE_LIMIT_SIZE_MB )); then | |
echo "Image size is larger than the limit" | |
exit 1 | |
fi | |
- name: Export digest | |
run: | | |
mkdir -p /tmp/digests | |
digest="${{ steps.build.outputs.digest }}" | |
touch "/tmp/digests/${digest#sha256:}" | |
- name: Upload digest | |
uses: actions/upload-artifact@v4 | |
with: | |
name: digests-${{ env.PLATFORM_PAIR }} | |
path: /tmp/digests/* | |
if-no-files-found: error | |
retention-days: 1 | |
# - name: Create image artifact | |
# # We are serializing each export here because "Currently, multi-platform images cannot be | |
# # exported with the docker export type." (https://docs.docker.com/engine/reference/commandline/buildx_build/#output) | |
# run: | | |
# DOCKER_IMAGE=${DOCKER_USERNAME:-bluerobotics}/${PROJECT}-${DOCKER}} | |
# GIT_HASH_SHORT=$(git rev-parse --short "$GITHUB_SHA") | |
# IFS=',' read -ra platforms <<< "${{ matrix.platform }}" | |
# for platform in "${platforms[@]}"; do | |
# docker buildx build \ | |
# --platform $platform \ | |
# ${{ steps.prepare.outputs.buildx_args }} \ | |
# --tag ${DOCKER_IMAGE}:${GIT_HASH_SHORT} \ | |
# --output "type=docker,dest=BlueOS-base-${GIT_HASH_SHORT}.tar" | |
# done | |
# - name: Upload artifact | |
# uses: actions/upload-artifact@v4 | |
# with: | |
# name: BlueOS-base-docker-image.zip | |
# path: '*.tar' | |
merge: | |
runs-on: ubuntu-latest | |
needs: | |
- build | |
steps: | |
- name: Download digests | |
uses: actions/download-artifact@v4 | |
with: | |
path: /tmp/digests | |
pattern: digests-* | |
merge-multiple: true | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Docker meta | |
id: meta | |
uses: docker/metadata-action@v5 | |
with: | |
images: ${{ env.DOCKER_IMAGE }} | |
- name: Login to Docker Hub | |
uses: docker/login-action@v3 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
- name: Create manifest list and push | |
working-directory: /tmp/digests | |
run: | | |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ | |
$(printf '${{ env.DOCKER_IMAGE }}@sha256:%s ' *) | |
- name: Inspect image | |
run: | | |
docker buildx imagetools inspect ${{ env.DOCKER_IMAGE }}:${{ steps.meta.outputs.version }} | |