diff --git a/Jenkinsfile b/Jenkinsfile index 9518e0c..d247fbc 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -17,7 +17,21 @@ pipeline { } } stages { - stage('Build/Run') { + stage('Build Multiarch Image') { + agent { label "linux && amd64" } + steps { + withCredentials([string( + credentialsId: 'DOCKER_REGISTRY', + variable: 'DOCKER_REGISTRY'), + usernamePassword(credentialsId: 'DOCKER_REGISTRY_CRED', + passwordVariable: 'DOCKER_REGISTRY_PASS', + usernameVariable: 'DOCKER_REGISTRY_USER' + )]) { + sh "./scripts/docker_build_multiarch_image.sh ${DISTRO}" + } + } + } + stage('Run Multiarch Image') { agent { label "linux && ${ARCH}" } steps { withCredentials([string( @@ -27,7 +41,6 @@ pipeline { passwordVariable: 'DOCKER_REGISTRY_PASS', usernameVariable: 'DOCKER_REGISTRY_USER' )]) { - sh "./scripts/docker_build_image.sh ${DISTRO}" sh "./scripts/docker_run_image.sh ${DISTRO}" } } diff --git a/lib/docker.sh b/lib/docker.sh index b861e63..bc49b1e 100644 --- a/lib/docker.sh +++ b/lib/docker.sh @@ -30,7 +30,7 @@ echo_platform() { local platKernel platCpu platKernel="$(uname)" platKernel="${platKernel,,}" - if [[ "${HOSTTYPE}" == 'x86_64' ]]; then + if [[ ${HOSTTYPE} == 'x86_64' ]]; then platCpu='amd64' else platCpu='arm64' @@ -60,6 +60,8 @@ docker_build_image() { validate_selected_image "$@" || return 1 check_docker || return 1 test -d "${DOCKER_DIR}" || mkdir -p "${DOCKER_DIR}" + PLATFORM="${PLATFORM:-$(echo_platform)}" + for distro in "${DISTROS[@]}"; do image_tag="$(set_distro_image_tag "${distro}")" echo_info "sourcing package manager for ${image_tag}" @@ -97,25 +99,27 @@ docker_build_image() { } >"${dockerfile}" - echo_info "building ${image_tag}" - docker build \ - --platform "$(echo_platform)" \ + docker buildx build \ + --platform "${PLATFORM}" \ -t "${image_tag}" \ -f "${dockerfile}" \ . || return 1 # if a docker registry is defined, push to it - if [[ "${DOCKER_REGISTRY}" != '' ]]; then - docker tag "${image_tag}" "${DOCKER_REGISTRY}/${image_tag}" + if [[ ${DOCKER_REGISTRY} != '' ]]; then docker login \ -u "${DOCKER_REGISTRY_USER}" \ -p "${DOCKER_REGISTRY_PASS}" \ "${DOCKER_REGISTRY}" - docker push \ - --platform "$(echo_platform)" \ - "${DOCKER_REGISTRY}/${image_tag}" + + docker buildx build \ + --push \ + --platform "${PLATFORM}" \ + -t "${DOCKER_REGISTRY}/${image_tag}" \ + -f "${dockerfile}" \ + . || return 1 fi - + docker system prune -f done } @@ -161,23 +165,21 @@ docker_run_image() { for distro in "${DISTROS[@]}"; do image_tag="$(set_distro_image_tag "${distro}")" - + # if a docker registry is defined, pull from it - if [[ "${DOCKER_REGISTRY}" != '' ]]; then + if [[ ${DOCKER_REGISTRY} != '' ]]; then docker login \ -u "${DOCKER_REGISTRY_USER}" \ -p "${DOCKER_REGISTRY_PASS}" \ "${DOCKER_REGISTRY}" docker pull \ - --platform "$(echo_platform)" \ "${DOCKER_REGISTRY}/${image_tag}" docker tag "${DOCKER_REGISTRY}/${image_tag}" "${image_tag}" fi echo_info "running ffmpeg build for ${image_tag}" docker run --rm \ - --platform "$(echo_platform)" \ -v "${REPO_DIR}":/workdir \ -w /workdir \ -e DEBUG="${DEBUG}" \ @@ -185,3 +187,18 @@ docker_run_image() { ./scripts/build.sh || return 1 done } + +FB_FUNC_NAMES+=('docker_build_multiarch_image') +FB_FUNC_DESCS['docker_build_multiarch_image']='build multiarch docker image' +FB_FUNC_COMPLETION['docker_build_multiarch_image']="${VALID_DOCKER_IMAGES[*]}" +docker_build_multiarch_image() { + validate_selected_image "$@" || return 1 + check_docker || return 1 + PLATFORM='linux/amd64,linux/arm64' + docker buildx create \ + --use \ + --platform="${PLATFORM}" \ + --name my-multiplatform-builder \ + --driver=docker-container + docker_build_image "$@" +} diff --git a/main.sh b/main.sh index b270efe..03d2d9e 100755 --- a/main.sh +++ b/main.sh @@ -40,8 +40,8 @@ cd "$(dirname "$(readlink -f $0)")/.." export FB_RUNNING_AS_SCRIPT=1 . main.sh scr_name="$(bash_basename $0)" -cmd="${scr_name//.sh}" -if [[ $DEBUG == 1 ]]; then set -x ; fi +cmd="${scr_name//.sh/}" +if [[ $DEBUG == 1 ]]; then set -x; fi $cmd $@' >"${ENTRY_SCRIPT}" chmod +x "${ENTRY_SCRIPT}" fi diff --git a/scripts/docker_build_multiarch_image.sh b/scripts/docker_build_multiarch_image.sh new file mode 120000 index 0000000..44b7711 --- /dev/null +++ b/scripts/docker_build_multiarch_image.sh @@ -0,0 +1 @@ +entry.sh \ No newline at end of file diff --git a/scripts/entry.sh b/scripts/entry.sh index c21aad5..99e5072 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}" -if [[ $DEBUG == 1 ]]; then set -x ; fi +cmd="${scr_name//.sh/}" +if [[ $DEBUG == 1 ]]; then set -x; fi $cmd $@