Skip to content

Instantly share code, notes, and snippets.

@gbraad
Last active March 11, 2025 06:03
Show Gist options
  • Save gbraad/f8a46c5958d158707d18a333a414a900 to your computer and use it in GitHub Desktop.
Save gbraad/f8a46c5958d158707d18a333a414a900 to your computer and use it in GitHub Desktop.
Multi-arch build with Podman using GitHub Actions

Multi-arch build with Podman using GitHub Actions

build-process.yml

name: build container - fedora-multi-arch
run-name: Building container - Fedora Multi-Arch

on:
  workflow_dispatch:

jobs:
  build-container-fedora-arm64:
    name: build-container-fedora-arm64
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-24.04-arm

    steps:
      - name: Install missing package
        run: |
          sudo apt-get update
          sudo apt-get install -y \
            podman

      - name: Check out repository code
        uses: actions/checkout@v4

      - name: Run podman build - fedora-arm
        run: |
          podman build -t ghcr.io/gbraad-dotfiles/fedora:arm64 \
            --build-arg=BASE_IMAGE="quay.io/fedora/fedora" \
            --build-arg=BASE_VERSION=41 \
            --build-arg=ARCH="aarch64" \
            -f .devcontainer/fedora/Containerfile .

      - name: Run podman save - fedora-arm
        run: |
          podman save ghcr.io/gbraad-dotfiles/fedora:arm64 \
            --format=oci-dir -o oci-arm64

      - uses: actions/upload-artifact@v4
        with:
          name: oci-arm64
          path: oci-arm64/


  build-container-fedora-amd64:
    name: build-container-fedora-amd64
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest

    steps:
      - name: Check out repository code
        uses: actions/checkout@v4

      - name: Run podman build - fedora
        run: |
          podman build -t ghcr.io/gbraad-dotfiles/fedora:amd64 \
            --build-arg=BASE_IMAGE="quay.io/fedora/fedora" \
            --build-arg=BASE_VERSION=41 \
            -f .devcontainer/fedora/Containerfile .

      - name: Run podman save - fedora
        run: |
          podman save ghcr.io/gbraad-dotfiles/fedora:amd64 \
            --format=oci-dir -o oci-amd64

      - uses: actions/upload-artifact@v4
        with:
          name: oci-amd64
          path: oci-amd64/


  push-manifest:
    name: build-container-fedora
    needs: 
      - build-container-fedora-arm64
      - build-container-fedora-amd64
    runs-on: ubuntu-24.04

    steps:
      - name: Download arm64
        uses: actions/download-artifact@v4
        with:
          name: oci-arm64
          path: oci-arm64
      - name: Download amd64
        uses: actions/download-artifact@v4
        with:
          name: oci-amd64
          path: oci-amd64
                
      - name: Set release tag
        id: get-tag
        run: |
          echo "TAG=$(date +'%y%m%d')" >> $GITHUB_OUTPUT

      - name: Create manifest
        run: |
          podman manifest create fedora-manifest

      - name: Add arm64 to manifest
        run: |
          podman 
          podman manifest add fedora-manifest oci:$(pwd)/oci-arm64
      - name: Add amd64 to manifest
        run: |
          podman manifest add fedora-manifest oci:$(pwd)/oci-amd64

      - name: Login to registry
        run: |
          podman login ghcr.io -u ${{ github.actor }} \
            -p ${{ secrets.GITHUB_TOKEN }}

      - name: Push container to registry
        run: |
          podman manifest push fedora-manifest docker://ghcr.io/gbraad-dotfiles/fedora:latest
          podman manifest push fedora-manifest docker://ghcr.io/gbraad-dotfiles/fedora:41
          podman manifest push fedora-manifest docker://ghcr.io/gbraad-dotfiles/fedora:${{steps.get-tag.outputs.TAG}}

Export to rootfs

podman create --name fedora-amd64 fedora-amd64
podman export fedora-amd64 -o fedora-amd64.tar
gzip fedora-amd64.tar
podman create --name fedora-arm64 fedora-arm64
podman export fedora-arm64 -o fedora-arm64.tar
gzip fedora-arm64.tar

Limit retention of the upload

   retention-days:7
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment