From c4204822e0f6c29940848db16bb7933f92a3b74e Mon Sep 17 00:00:00 2001 From: Levon Gevorgyan Date: Wed, 30 Jul 2025 19:36:36 -0500 Subject: [PATCH] build for amd64 on arm64 --- Jenkinsfile | 4 +-- lib/docker.sh | 32 ++++++++++++++++++++-- scripts/docker_run_amd64_image_on_arm64.sh | 1 + scripts/entry.sh | 2 +- 4 files changed, 34 insertions(+), 5 deletions(-) create mode 120000 scripts/docker_run_amd64_image_on_arm64.sh diff --git a/Jenkinsfile b/Jenkinsfile index f4835ad..59a00bd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -8,13 +8,13 @@ pipeline { axis { name 'DISTRO' values 'debian:bookworm', 'ubuntu:24.04', 'ubuntu:22.04', - 'ogarcia/archlinux:latest', 'fedora:42' + 'archlinux:latest', 'fedora:42' } } stages { stage('Build') { steps { - sh "./scripts/docker_run_image.sh ${DISTRO}" + sh "./scripts/docker_run_amd64_image_on_arm64.sh ${DISTRO}" } } } diff --git a/lib/docker.sh b/lib/docker.sh index 115e04c..81d9e73 100644 --- a/lib/docker.sh +++ b/lib/docker.sh @@ -1,12 +1,18 @@ #!/usr/bin/env bash +check_docker() { + if missing_cmd docker; then + echo_info "install docker" + curl https://get.docker.com -sSf | bash + fi +} + validate_selected_image() { local selectedImage="${1:-}" local validImages=( 'ubuntu:22.04' 'ubuntu:24.04' 'fedora:41' 'fedora:42' 'archlinux:latest' - 'ogarcia/archlinux:latest' 'debian:bookworm' ) for distro in "${validImages[@]}"; do @@ -28,9 +34,11 @@ FB_FUNC_NAMES+=('docker_build_image') FB_FUNC_DESCS['docker_build_image']='build docker image with required dependencies pre-installed' docker_build_image() { validate_selected_image "$@" || return 1 + check_docker || return 1 DOCKERFILE_DIR="${IGN_DIR}/Dockerfiles" test -d "${DOCKERFILE_DIR}" && rm -rf "${DOCKERFILE_DIR}" - mkdir -p "${DOCKERFILE_DIR}" + mkdir -p "${DOCKERFILE_DIR}" || return 1 + local platform="${PLATFORM:-linux/amd64}" for distro in "${DISTROS[@]}"; do image_tag="ffmpeg_builder_${distro}" echo_info "sourcing package manager for ${image_tag}" @@ -41,6 +49,7 @@ docker_build_image() { distroFmtPkgMgr="${DOCKERFILE_DIR}/${distroFmt}-pkg_mgr" # get package manager info docker run --rm \ + --platform "${platform}" \ -v "${REPO_DIR}":/workdir \ -w /workdir \ "${distro}" \ @@ -67,6 +76,7 @@ docker_build_image() { echo_info "building ${image_tag}" docker build \ + --platform "${platform}" \ -t "${image_tag}" \ -f "${dockerfile}" \ . || return 1 @@ -81,13 +91,31 @@ FB_FUNC_NAMES+=('docker_run_image') FB_FUNC_DESCS['docker_run_image']='run docker image to build ffmpeg' docker_run_image() { docker_build_image "$@" || return 1 + check_docker || return 1 + local platform="${PLATFORM:-linux/amd64}" for distro in "${DISTROS[@]}"; do image_tag="ffmpeg_builder_${distro}" echo_info "running ffmpeg build for ${image_tag}" docker run --rm \ + --platform ${platform} \ -v "${REPO_DIR}":/workdir \ -w /workdir \ "${image_tag}" \ ./scripts/build.sh || return 1 done } + +# shellcheck disable=SC2154 +FB_FUNC_NAMES+=('docker_run_amd64_image_on_arm64') +# FB_FUNC_DESCS used externally +# shellcheck disable=SC2034 +FB_FUNC_DESCS['docker_run_amd64_image_on_arm64']='run docker image to build ffmpeg for amd64 on arm64' +docker_run_amd64_image_on_arm64() { + if missing_cmd qemu-x86_64-static; then + determine_pkg_mgr || return 1 + ${pkg_install} qemu-user-static || return 1 + fi + check_docker || return 1 + docker run --privileged --rm tonistiigi/binfmt --install all || return 1 + docker_run_image "$@" +} diff --git a/scripts/docker_run_amd64_image_on_arm64.sh b/scripts/docker_run_amd64_image_on_arm64.sh new file mode 120000 index 0000000..44b7711 --- /dev/null +++ b/scripts/docker_run_amd64_image_on_arm64.sh @@ -0,0 +1 @@ +entry.sh \ No newline at end of file diff --git a/scripts/entry.sh b/scripts/entry.sh index a6342f4..1b85ca4 100755 --- a/scripts/entry.sh +++ b/scripts/entry.sh @@ -3,6 +3,6 @@ cd "$(dirname "$(readlink -f $0)")/.." export FB_RUNNING_AS_SCRIPT=1 . main.sh scr_name="$(bash_basename $0)" -cmd="${scr_name//.sh/}" +cmd="${scr_name//.sh}" set -x $cmd $@