diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 49030f7ea..3ba498fd7 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -7,11 +7,6 @@ on: - 'main' tags: - 'v*' - pull_request: - types: [opened, synchronize, reopened] - branches: [ master ] - paths: - - '.github/workflows/build.yaml' jobs: build-and-push-image: @@ -33,6 +28,33 @@ jobs: with: submodules: recursive + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + tool-cache: false + android: true + dotnet: true + haskell: true + large-packages: false + swap-storage: true + + - name: Install soci + uses: lerentis/soci-installer@v1.0.1 + with: + soci-release: 'v0.4.0' + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2.10.0 + + - name: Set up containerd for ubuntu + uses: crazy-max/ghaction-setup-containerd@v2.2.0 + with: + config-inline: | + version = 2 + + # persistent data location + root = "/var/lib/kubelet/containerd" + - name: Docker meta id: meta uses: docker/metadata-action@v5 @@ -45,18 +67,88 @@ jobs: type=sha,prefix=,suffix=,format=short type=raw,value=latest + - name: Create a hash from tags + env: + tags: ${{ steps.meta.outputs.tags }} + id: vars + run: | + tag_hash=$(echo -n "$tags" | md5sum | awk '{print $1}') + echo "tag_hash=$tag_hash" >> $GITHUB_OUTPUT + echo "cache_dir=/var/lib/kubelet/images/cache" >> $GITHUB_OUTPUT + echo "image_dir=/var/lib/kubelet/images" >> $GITHUB_OUTPUT + echo "image_path=/var/lib/kubelet/images/lorax" >> $GITHUB_OUTPUT + + - name: Create and update image/cache directory + env: + image_dir: ${{ steps.vars.outputs.image_dir }} + cache_dir: ${{ steps.vars.outputs.cache_dir }} + run: | + sudo mkdir -p $image_dir + sudo chown ubuntu:ubuntu $image_dir + + sudo mkdir -p $cache_dir + sudo chown ubuntu:ubuntu $cache_dir + + - name: Export Docker image as OCI + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile # Path to your Dockerfile + push: false + tags: ${{ steps.meta.outputs.tags }} + outputs: type=oci,compression=gzip,dest=${{ steps.vars.outputs.image_path }}-${{ steps.vars.outputs.tag_hash }}.tar.gz + cache-from: type=local,src=${{ steps.vars.outputs.cache_dir }} + cache-to: type=local,mode=max,image-manifest=true,oci-mediatypes=true,dest=${{ steps.vars.outputs.cache_dir }} + + - name: Import image in containerd + env: + tag_hash: ${{ steps.vars.outputs.tag_hash }} + image_path: ${{ steps.vars.outputs.image_path }} + run: | + echo "Importing $image_path-$tag_hash to Containerd" + sudo ctr i import --no-unpack --all-platforms --digests $image_path-$tag_hash.tar.gz + - name: Log in to GitHub Container Registry uses: docker/login-action@v1 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GHCR_PAT }} + + - name: Push image with containerd + env: + tags: ${{ steps.meta.outputs.tags }} + run: | + for tag in $tags + do + echo "Pushing $tag to GHCR" + sudo ctr i push --user "${{ github.repository_owner }}:${{ secrets.GHCR_PAT }}" $tag + done - - name: Build and Push Image - uses: docker/build-push-action@v2 - with: - context: . - file: ./Dockerfile # Path to your Dockerfile - push: true + - name: Create and push soci index + env: tags: ${{ steps.meta.outputs.tags }} + run: | + export SOCI_PATH=$HOME/.soci/soci + for tag in $tags + do + echo "Creating soci index for $tag" + sudo $SOCI_PATH create $tag + echo "Pushing soci index for $tag" + sudo $SOCI_PATH push --user ${{ github.repository_owner }}:${{ secrets.GHCR_PAT }} $tag + done + + - name: Prune older images + env: + tag_hash: ${{ steps.vars.outputs.tag_hash }} + image_path: ${{ steps.vars.outputs.image_path }} + run: | + # Delete images older than a day from docker store + docker image prune -a -f --filter "until=24h" + + # Delete the on disk copy + rm -rf "$image_path-$tag_hash.tar.gz" + # Delete the SHA image(s) from containerd store + sudo ctr i rm $(sudo ctr i ls -q) + \ No newline at end of file