Skip to content

Add support for ARM64 runner #161

@anr2me

Description

@anr2me

With ARM64 runners available for free, we should support running native ARM with emulated x86/AMD64/etc.

Currently when using ARM64 runner (ie. ubuntu-24.04-arm) it fallback to download amd64 QEMU image, thus detecting the wrong requested image's platform:

The Logs
Run uraimo/run-on-arch-action@v2
  with:
    arch: none
    distro: none
    base_image: --platform=linux/ppc64le ppc64le/debian:buster
    githubToken: ***
    setup: mkdir -p "${PWD}/artifacts"
  
    dockerRunArgs: --volume "${PWD}/artifacts:/artifacts"
  
    env: artifact_name: git-release-ppc64le
  
    shell: /bin/bash
    install: apt-get update -y -qq
  apt-get install -q -y git file build-essential
  
  # Prerequisites to build CMake
  apt install -q -y libtool autoconf unzip wget libssl-dev libcurl4-openssl-dev libxml2-dev
  
  # Check if CMake is installed
  required_cmake_version="3.16"
  installed_cmake_version="0.00"
  if command -v cmake &> /dev/null; then
      # Get the installed version of CMake
      installed_cmake_version=$(cmake --version | grep -oP '\d+\.\d+\.\d+')
  fi
  
  # Compare versions
  if [ "$(printf '%s\n' "$required_cmake_version" "$installed_cmake_version" | sort -V | head -n1)" != "$required_cmake_version" ]; then
      echo "CMake version is lower than $required_cmake_version, or not installed. Installing a newer version..."
      # Remove old CMake
      apt purge cmake -y
      # Install a newer version of CMake (need v3.16+)
      cmake_version=3.31.6 # 3.26.6
      wget https://github.com/Kitware/CMake/releases/download/v$cmake_version/cmake-$cmake_version.tar.gz
      tar -xzf cmake-$cmake_version.tar.gz
      cd cmake-$cmake_version/
      ./bootstrap #./configure
      make -j$(nproc)
      make install
      cd -
  else
      echo "CMake version is $installed_cmake_version, which is sufficient."
  fi
  
    run: echo "Running inside container!"
  uname -m
  gcc -v 2>&1 | grep -o -e '[^ ]*pie' # Checking default pie flags
  gcc --version
  g++ --version
  ld -v
  cmake --version
  
  env:
    PLATFORM_ARCH: ppc64le ppc64le/debian:buster
Writing custom Dockerfile to: /home/runner/work/_actions/uraimo/run-on-arch-action/v2/Dockerfiles/Dockerfile.none.none ...
Configuring Docker for multi-architecture support
/home/runner/work/_actions/uraimo/run-on-arch-action/v2/src/run-on-arch.sh /home/runner/work/_actions/uraimo/run-on-arch-action/v2/Dockerfiles/Dockerfile.none.none run-on-arch-anr2merefork-ppsspp-test-generate-linux-package-none-none --volume ${PWD}/artifacts:/artifacts -eartifact_name
Get:1 https://packages.microsoft.com/repos/azure-cli noble InRelease [3564 B]
Get:2 https://packages.microsoft.com/ubuntu/24.04/prod noble InRelease [3600 B]
Get:3 https://packages.microsoft.com/repos/azure-cli noble/main arm64 Packages [1065 B]
Hit:4 http://ports.ubuntu.com/ubuntu-ports noble InRelease
Get:5 https://packages.microsoft.com/ubuntu/24.04/prod noble/main amd64 Packages [21.7 kB]
Get:6 https://packages.microsoft.com/ubuntu/24.04/prod noble/main armhf Packages [6867 B]
Get:7 https://packages.microsoft.com/ubuntu/24.04/prod noble/main arm64 Packages [13.4 kB]
Get:8 http://ports.ubuntu.com/ubuntu-ports noble-updates InRelease [126 kB]
Get:9 http://ports.ubuntu.com/ubuntu-ports noble-backports InRelease [126 kB]
Get:10 http://ports.ubuntu.com/ubuntu-ports noble-security InRelease [126 kB]
Get:11 http://ports.ubuntu.com/ubuntu-ports noble-updates/main arm64 Packages [872 kB]
Get:12 http://ports.ubuntu.com/ubuntu-ports noble-updates/main Translation-en [199 kB]
Get:13 http://ports.ubuntu.com/ubuntu-ports noble-updates/main arm64 Components [148 kB]
Get:14 http://ports.ubuntu.com/ubuntu-ports noble-updates/universe arm64 Packages [996 kB]
Get:15 http://ports.ubuntu.com/ubuntu-ports noble-updates/universe Translation-en [256 kB]
Get:16 http://ports.ubuntu.com/ubuntu-ports noble-updates/universe arm64 Components [362 kB]
Get:17 http://ports.ubuntu.com/ubuntu-ports noble-updates/restricted arm64 Packages [770 kB]
Get:18 http://ports.ubuntu.com/ubuntu-ports noble-updates/restricted Translation-en [135 kB]
Get:19 http://ports.ubuntu.com/ubuntu-ports noble-updates/restricted arm64 Components [212 B]
Get:20 http://ports.ubuntu.com/ubuntu-ports noble-updates/multiverse arm64 Packages [18.4 kB]
Get:21 http://ports.ubuntu.com/ubuntu-ports noble-updates/multiverse Translation-en [5308 B]
Get:22 http://ports.ubuntu.com/ubuntu-ports noble-updates/multiverse arm64 Components [212 B]
Get:23 http://ports.ubuntu.com/ubuntu-ports noble-backports/main arm64 Components [208 B]
Get:24 http://ports.ubuntu.com/ubuntu-ports noble-backports/universe arm64 Packages [14.2 kB]
Get:25 http://ports.ubuntu.com/ubuntu-ports noble-backports/universe Translation-en [12.1 kB]
Get:26 http://ports.ubuntu.com/ubuntu-ports noble-backports/universe arm64 Components [19.9 kB]
Get:27 http://ports.ubuntu.com/ubuntu-ports noble-backports/restricted arm64 Components [216 B]
Get:28 http://ports.ubuntu.com/ubuntu-ports noble-backports/multiverse arm64 Components [212 B]
Get:29 http://ports.ubuntu.com/ubuntu-ports noble-security/main arm64 Packages [626 kB]
Get:30 http://ports.ubuntu.com/ubuntu-ports noble-security/main Translation-en [121 kB]
Get:31 http://ports.ubuntu.com/ubuntu-ports noble-security/main arm64 Components [5704 B]
Get:32 http://ports.ubuntu.com/ubuntu-ports noble-security/universe arm64 Packages [789 kB]
Get:33 http://ports.ubuntu.com/ubuntu-ports noble-security/universe Translation-en [174 kB]
Get:34 http://ports.ubuntu.com/ubuntu-ports noble-security/universe arm64 Components [52.0 kB]
Get:35 http://ports.ubuntu.com/ubuntu-ports noble-security/restricted arm64 Packages [725 kB]
Get:36 http://ports.ubuntu.com/ubuntu-ports noble-security/restricted Translation-en [128 kB]
Get:37 http://ports.ubuntu.com/ubuntu-ports noble-security/restricted arm64 Components [212 B]
Get:38 http://ports.ubuntu.com/ubuntu-ports noble-security/multiverse arm64 Packages [16.8 kB]
Get:39 http://ports.ubuntu.com/ubuntu-ports noble-security/multiverse Translation-en [4308 B]
Get:40 http://ports.ubuntu.com/ubuntu-ports noble-security/multiverse arm64 Components [212 B]
Fetched 6881 kB in 6s (1243 kB/s)
Reading package lists...
E: Package 'qemu' has no installation candidate
Unable to find image 'multiarch/qemu-user-static:latest' locally
latest: Pulling from multiarch/qemu-user-static
205dae5015e7: Pulling fs layer
816739e52091: Pulling fs layer
30abb83a18eb: Pulling fs layer
0657daef200b: Pulling fs layer
30c9c93f40b9: Pulling fs layer
0657daef200b: Waiting
30c9c93f40b9: Waiting
816739e52091: Verifying Checksum
816739e52091: Download complete
30abb83a18eb: Verifying Checksum
30abb83a18eb: Download complete
205dae5015e7: Download complete
0657daef200b: Download complete
205dae5015e7: Pull complete
816739e52091: Pull complete
30c9c93f40b9: Verifying Checksum
30c9c93f40b9: Download complete
30abb83a18eb: Pull complete
0657daef200b: Pull complete
30c9c93f40b9: Pull complete
Digest: sha256:fe60359c92e86a43cc87b3d906006245f77bfc0565676b80004cc666e4feb9f0
Status: Downloaded newer image for multiarch/qemu-user-static:latest
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
exec /register: exec format error
Error: The process '/home/runner/work/_actions/uraimo/run-on-arch-action/v2/src/run-on-arch.sh' failed with exit code 255

The Test Workflow
name: Test Generate Linux Package
on:
  workflow_dispatch:
    inputs:
      refToBuild:
        description: 'Commit SHA1 to build (optional)'
        type: string
        default: ''
        
      buildVariant:
        type: choice
        description: 'Build Variant'
        required: true
        default: 'release'
        options: 
        - release
        - debug

      cpuArch:
        type: choice
        description: 'CPU Architecture'
        required: true
        default: 'amd64'
        options: 
        - amd64
        - i386
        - arm64v8
        - arm32v7
        - arm32v6
        - arm32v5
        - riscv64
        - mips64le
        - ppc64le
        - s390x

env:
  PLATFORM_ARCH: >-
    ${{ fromJSON('{
      "amd64" : "amd64 amd64/debian:buster",
      "i386" : "386 i386/debian:buster",
      "arm64v8" : "arm64 arm64v8/debian:latest",
      "arm32v7" : "arm/v7 arm32v7/debian:buster",
      "arm32v6" : "arm/v6 balenalib/rpi-raspbian:jessie",
      "arm32v5" : "arm/v5 arm32v5/debian:buster",
      "riscv64" : "riscv64 riscv64/ubuntu:focal",
      "mips64" : "mips64 mips64/debian:buster",
      "mips64le" : "mips64le mips64le/debian:buster",
      "ppc64le" : "ppc64le ppc64le/debian:buster",
      "s390x" : "s390x s390x/debian:buster"
    }')[inputs.cpuArch] }}

jobs:

  build:
    name: Generate ${{ inputs.buildVariant }} ${{ inputs.cpuArch }} build
    runs-on: ${{ (startsWith(inputs.cpuArch, 'amd64') || startsWith(inputs.cpuArch, 'i386')) && 'ubuntu-latest' || 'ubuntu-24.04-arm' }} # arm runner said to be faster, thus the default
      
    steps:
      - uses: actions/checkout@v1 # v2 or newer no longer support short SHA ref
        with:
          fetch-depth: 0
          submodules: recursive
          ref: ${{ inputs.refToBuild != '' && inputs.refToBuild || github.sha }}

      #- name: Set up QEMU # Just testing whether it can install QEMU successfully or not (Yes it can)
      #  uses: docker/setup-qemu-action@v3
      
      - name: Setup and Run Guest System for ${{ inputs.cpuArch }} (target arch)
        id: debian-target
        uses: uraimo/run-on-arch-action@v2
        with:
          arch: none
          distro: none
          base_image: --platform=linux/${{ env.PLATFORM_ARCH }}
          
          githubToken: ${{ github.token }}
          
          setup: |
            mkdir -p "${PWD}/artifacts"

          dockerRunArgs: |
            --volume "${PWD}/artifacts:/artifacts"

          env: |
            artifact_name: git-${{ inputs.buildVariant }}-${{ inputs.cpuArch }}

          shell: /bin/bash
          
          install: |
            apt-get update -y -qq
            apt-get install -q -y git file build-essential

            # Prerequisites to build CMake
            apt install -q -y libtool autoconf unzip wget libssl-dev libcurl4-openssl-dev libxml2-dev

            # Check if CMake is installed
            required_cmake_version="3.16"
            installed_cmake_version="0.00"
            if command -v cmake &> /dev/null; then
                # Get the installed version of CMake
                installed_cmake_version=$(cmake --version | grep -oP '\d+\.\d+\.\d+')
            fi

            # Compare versions
            if [ "$(printf '%s\n' "$required_cmake_version" "$installed_cmake_version" | sort -V | head -n1)" != "$required_cmake_version" ]; then
                echo "CMake version is lower than $required_cmake_version, or not installed. Installing a newer version..."
                # Remove old CMake
                apt purge cmake -y
                # Install a newer version of CMake (need v3.16+)
                cmake_version=3.31.6 # 3.26.6
                wget https://github.com/Kitware/CMake/releases/download/v$cmake_version/cmake-$cmake_version.tar.gz
                tar -xzf cmake-$cmake_version.tar.gz
                cd cmake-$cmake_version/
                ./bootstrap #./configure
                make -j$(nproc)
                make install
                cd -
            else
                echo "CMake version is $installed_cmake_version, which is sufficient."
            fi
            
          run: |
            echo "Running inside container!"
            uname -m
            gcc -v 2>&1 | grep -o -e '[^ ]*pie' # Checking default pie flags
            gcc --version
            g++ --version
            ld -v
            cmake --version
            # TODO: Build PPSSPP artifacts
   

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions