From 07207f6e8283a138567801723d869c13bbe4020f Mon Sep 17 00:00:00 2001 From: Levon Gevorgyan Date: Sun, 3 Aug 2025 10:30:15 -0500 Subject: [PATCH] build on amd64 --- Jenkinsfile | 29 +++++++++++-- lib/docker.sh | 82 ++++++++++++++++++++++++++---------- main.sh | 3 +- scripts/docker_load_image.sh | 1 + scripts/docker_save_image.sh | 1 + scripts/entry.sh | 2 +- 6 files changed, 90 insertions(+), 28 deletions(-) create mode 120000 scripts/docker_load_image.sh create mode 120000 scripts/docker_save_image.sh diff --git a/Jenkinsfile b/Jenkinsfile index 59a00bd..543d6f5 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,9 +1,9 @@ pipeline { agent none stages { - stage('Build Matrix') { + stage('Build Docker Image Matrix') { matrix { - agent { label "linux" } + agent { label "linux && amd64" } axes { axis { name 'DISTRO' @@ -12,8 +12,31 @@ pipeline { } } stages { - stage('Build') { + stage('Build Docker Image') { steps { + sh "./scripts/docker_build_image.sh ${DISTRO}" + sh "./scripts/docker_save_image.sh ${DISTRO}" + stash includes: "gitignore/docker/${DISTRO}.tar.zst", name: "${DISTRO}-stash" + } + } + } + } + } + stage('Run Docker Image Matrix') { + matrix { + agent { label "linux && arm64" } + axes { + axis { + name 'DISTRO' + values 'debian:bookworm', 'ubuntu:24.04', 'ubuntu:22.04', + 'archlinux:latest', 'fedora:42' + } + } + stages { + stage('Run Docker Image') { + steps { + unstash "${DISTRO}-stash" + sh "./scripts/docker_load_image.sh ${DISTRO}" sh "./scripts/docker_run_amd64_image_on_arm64.sh ${DISTRO}" } } diff --git a/lib/docker.sh b/lib/docker.sh index 81d9e73..ef3a113 100644 --- a/lib/docker.sh +++ b/lib/docker.sh @@ -1,5 +1,12 @@ #!/usr/bin/env bash +VALID_DOCKER_IMAGES=( + 'ubuntu:22.04' 'ubuntu:24.04' + 'fedora:41' 'fedora:42' + 'archlinux:latest' + 'debian:bookworm' +) + check_docker() { if missing_cmd docker; then echo_info "install docker" @@ -7,37 +14,38 @@ check_docker() { fi } +safe_docker_image_name() { + local image_tag="${1}" + # echo "${image_tag//:/-}" + echo "${image_tag}" +} + +docker_image_archive_name() { + local image_tag="${1}" + echo "$(safe_docker_image_name "${image_tag}").tar.zst" +} + validate_selected_image() { local selectedImage="${1:-}" - local validImages=( - 'ubuntu:22.04' 'ubuntu:24.04' - 'fedora:41' 'fedora:42' - 'archlinux:latest' - 'debian:bookworm' - ) - for distro in "${validImages[@]}"; do + for distro in "${VALID_DOCKER_IMAGES[@]}"; do if [[ ${selectedImage} == "${distro}" ]]; then DISTROS+=("${distro}") fi done if [[ ${DISTROS[*]} == '' ]]; then echo_fail "${selectedImage} is not valid" - echo_info "valid images:" "${validImages[@]}" + echo_info "valid images:" "${VALID_DOCKER_IMAGES[@]}" return 1 fi } -# shellcheck disable=SC2154 FB_FUNC_NAMES+=('docker_build_image') -# FB_FUNC_DESCS used externally -# shellcheck disable=SC2034 FB_FUNC_DESCS['docker_build_image']='build docker image with required dependencies pre-installed' +FB_FUNC_COMPLETION['docker_build_image']="${VALID_DOCKER_IMAGES[*]}" 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}" || return 1 + test -d "${DOCKER_DIR}" || mkdir -p "${DOCKER_DIR}" local platform="${PLATFORM:-linux/amd64}" for distro in "${DISTROS[@]}"; do image_tag="ffmpeg_builder_${distro}" @@ -46,7 +54,7 @@ docker_build_image() { # distro without problematic characters distroFmt="${distro//:/-}" # specific file for evaluated package manager info - distroFmtPkgMgr="${DOCKERFILE_DIR}/${distroFmt}-pkg_mgr" + distroFmtPkgMgr="${DOCKER_DIR}/${distroFmt}-pkg_mgr" # get package manager info docker run --rm \ --platform "${platform}" \ @@ -58,7 +66,7 @@ docker_build_image() { cat "${distroFmtPkgMgr}" source "${distroFmtPkgMgr}" - dockerfile="${DOCKERFILE_DIR}/Dockerfile_${distroFmt}" + dockerfile="${DOCKER_DIR}/Dockerfile_${distroFmt}" { echo "FROM ${distro}" echo 'SHELL ["/bin/bash", "-c"]' @@ -84,13 +92,43 @@ docker_build_image() { done } -# shellcheck disable=SC2154 +FB_FUNC_NAMES+=('docker_save_image') +FB_FUNC_DESCS['docker_save_image']='save docker image into tar.zst' +FB_FUNC_COMPLETION['docker_save_image']="${VALID_DOCKER_IMAGES[*]}" +docker_save_image() { + validate_selected_image "$@" || return 1 + check_docker || return 1 + local platform="${PLATFORM:-linux/amd64}" + for distro in "${DISTROS[@]}"; do + image_tag="ffmpeg_builder_${distro}" + echo_info "saving docker image for ${image_tag}" + docker save --platform "${platform}" "${image_tag}" | + zstd -T0 >"${DOCKER_DIR}/$(docker_image_archive_name "${image_tag}")" || + return 1 + done +} + +FB_FUNC_NAMES+=('docker_load_image') +FB_FUNC_DESCS['docker_load_image']='load docker image from tar.zst' +FB_FUNC_COMPLETION['docker_load_image']="${VALID_DOCKER_IMAGES[*]}" +docker_load_image() { + validate_selected_image "$@" || return 1 + check_docker || return 1 + local platform="${PLATFORM:-linux/amd64}" + for distro in "${DISTROS[@]}"; do + image_tag="ffmpeg_builder_${distro}" + echo_info "loading docker image for ${image_tag}" + local archive="${DOCKER_DIR}/$(docker_image_archive_name "${image_tag}")" + test -f "$archive" || return 1 + zstdcat -T0 "$archive" | + docker load || return 1 + done +} + FB_FUNC_NAMES+=('docker_run_image') -# FB_FUNC_DESCS used externally -# shellcheck disable=SC2034 FB_FUNC_DESCS['docker_run_image']='run docker image to build ffmpeg' +FB_FUNC_COMPLETION['docker_run_image']="${VALID_DOCKER_IMAGES[*]}" docker_run_image() { - docker_build_image "$@" || return 1 check_docker || return 1 local platform="${PLATFORM:-linux/amd64}" for distro in "${DISTROS[@]}"; do @@ -105,11 +143,9 @@ docker_run_image() { 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' +FB_FUNC_COMPLETION['docker_run_amd64_image_on_arm64']="${VALID_DOCKER_IMAGES[*]}" docker_run_amd64_image_on_arm64() { if missing_cmd qemu-x86_64-static; then determine_pkg_mgr || return 1 diff --git a/main.sh b/main.sh index 05b0b76..d9059b9 100755 --- a/main.sh +++ b/main.sh @@ -13,7 +13,8 @@ TMP_DIR="${IGN_DIR}/tmp" DL_DIR="${IGN_DIR}/downloads" BUILD_DIR="${IGN_DIR}/builds" CCACHE_DIR="${IGN_DIR}/ccache" -export REPO_DIR IGN_DIR TMP_DIR DL_DIR BUILD_DIR CCACHE_DIR +DOCKER_DIR="${IGN_DIR}/docker" +export REPO_DIR IGN_DIR TMP_DIR DL_DIR BUILD_DIR CCACHE_DIR DOCKER_DIR # function names, descriptions, completions unset FB_FUNC_NAMES FB_FUNC_DESCS FB_FUNC_COMPLETION diff --git a/scripts/docker_load_image.sh b/scripts/docker_load_image.sh new file mode 120000 index 0000000..44b7711 --- /dev/null +++ b/scripts/docker_load_image.sh @@ -0,0 +1 @@ +entry.sh \ No newline at end of file diff --git a/scripts/docker_save_image.sh b/scripts/docker_save_image.sh new file mode 120000 index 0000000..44b7711 --- /dev/null +++ b/scripts/docker_save_image.sh @@ -0,0 +1 @@ +entry.sh \ No newline at end of file diff --git a/scripts/entry.sh b/scripts/entry.sh index 1b85ca4..a6342f4 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 $@