get docker working

This commit is contained in:
2025-07-28 19:03:56 -05:00
parent 1ee24a8b6a
commit 5f797dad30
9 changed files with 152 additions and 46 deletions

20
Jenkinsfile vendored
View File

@@ -1,10 +1,22 @@
pipeline { pipeline {
agent any // Specifies that the pipeline can run on any available agent agent none
stages { stages {
stage('Hello') { // Defines a stage named 'Hello' stage('Build Matrix') {
matrix {
agent { label "linux" }
axes {
axis {
name 'DISTRO'
values 'debian', 'ubuntu', 'archlinux', 'fedora'
}
}
stages {
stage('Build') {
steps { steps {
echo 'Hello World!' // Prints "Hello World!" to the console echo "Do Build for ${DISTRO}"
}
}
}
} }
} }
} }

View File

@@ -1,6 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set_compile_opts() { set_compile_opts() {
test "$FB_COMPILE_OPTS_SET" == 0 && return 0
unset LDFLAGS C_FLAGS CXX_FLAGS CPP_FLAGS \ unset LDFLAGS C_FLAGS CXX_FLAGS CPP_FLAGS \
CONFIGURE_FLAGS MESON_FLAGS \ CONFIGURE_FLAGS MESON_FLAGS \
RUSTFLAGS CMAKE_FLAGS \ RUSTFLAGS CMAKE_FLAGS \
@@ -137,6 +139,8 @@ set_compile_opts() {
export SUDO_CARGO="${SUDO} --preserve-env=PATH,RUSTUP_HOME,CARGO_HOME" export SUDO_CARGO="${SUDO} --preserve-env=PATH,RUSTUP_HOME,CARGO_HOME"
fi fi
echo echo
FB_COMPILE_OPTS_SET=1
} }
get_build_conf() { get_build_conf() {
@@ -255,6 +259,7 @@ do_build() {
local build="${1:-''}" local build="${1:-''}"
download_release "${build}" || return 1 download_release "${build}" || return 1
get_build_conf "${build}" || return 1 get_build_conf "${build}" || return 1
set_compile_opts || return 1
for dep in "${deps[@]}"; do for dep in "${deps[@]}"; do
do_build "${dep}" || return 1 do_build "${dep}" || return 1
done done

View File

@@ -123,7 +123,3 @@ bash_basename() {
printf '%s\n' "${tmp:-/}" printf '%s\n' "${tmp:-/}"
} }
fb_running_as_script() {
return "$FB_RUNNING_AS_SCRIPT"
}

86
lib/docker.sh Executable file → Normal file
View File

@@ -1,26 +1,90 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# shellcheck disable=SC2154
FB_FUNC_NAMES+=('docker_build_images') FB_FUNC_NAMES+=('docker_build_images')
# FB_FUNC_DESCS used externally # FB_FUNC_DESCS used externally
# shellcheck disable=SC2034 # shellcheck disable=SC2034
FB_FUNC_DESCS['docker_build_images']='build docker images with required dependencies pre-installed' FB_FUNC_DESCS['docker_build_images']='build docker images with required dependencies pre-installed'
docker_build_images() { docker_build_images() {
DISTROS=(debian ubuntu archlinux fedora) DISTROS=('debian:bookworm' 'ubuntu:24.04' 'archlinux:latest' 'fedora:42')
# DISTROS=('debian:bookworm')
DOCKERFILE_DIR="${IGN_DIR}/Dockerfiles" DOCKERFILE_DIR="${IGN_DIR}/Dockerfiles"
test -d "${DOCKERFILE_DIR}" || mkdir -p "${DOCKERFILE_DIR}" test -d "${DOCKERFILE_DIR}" && rm -rf "${DOCKERFILE_DIR}"
mkdir -p "${DOCKERFILE_DIR}"
for distro in "${DISTROS[@]}"; do for distro in "${DISTROS[@]}"; do
echo "\
FROM ${distro}
COPY scripts/ /ffmpeg-builder/scripts/
COPY main.sh /ffmpeg-builder/
RUN bash -c 'source /ffmpeg-builder/main.sh ; install_deps' || exit 1" \
>"${DOCKERFILE_DIR}/Dockerfile_${distro}"
image_tag="ffmpeg_builder_${distro}" image_tag="ffmpeg_builder_${distro}"
dockerfile="Dockerfile_${distro}" echo_info "source package manager for ${image_tag}"
# distro without problematic characters
distroFmt="${distro//:/-}"
# specific file for evaluated package manager info
distroFmtPkgMgr="${DOCKERFILE_DIR}/${distroFmt}-pkg_mgr"
# get package manager info
docker run --rm -it \
-v "${REPO_DIR}":/workdir \
-w /workdir \
"${distro}" \
bash -c "./scripts/print_pkg_mgr.sh" | tr -d '\r' >"${distroFmtPkgMgr}"
# shellcheck disable=SC1090
source "${distroFmtPkgMgr}"
dockerfile="${DOCKERFILE_DIR}/Dockerfile_${distroFmt}"
{
echo "FROM ${distro}"
echo 'SHELL ["/bin/bash", "-c"]'
echo "RUN ${pkg_mgr_update} && ${pkg_mgr_upgrade}"
echo "RUN ${pkg_install} ${req_pkgs}"
} >"${dockerfile}"
echo_info "building ${image_tag}" echo_info "building ${image_tag}"
docker build \ docker build \
-t "${image_tag}" \ -t "${image_tag}" \
-f "${DOCKERFILE_DIR}/${dockerfile}" \ -f "${dockerfile}" \
"${REPO_DIR}/" .
done
}
# shellcheck disable=SC2154
FB_FUNC_NAMES+=('docker_run_image')
# FB_FUNC_DESCS used externally
# shellcheck disable=SC2034
FB_FUNC_DESCS['docker_run_image']='run docker images to build ffmpeg'
docker_run_image() {
DISTROS=('debian:bookworm' 'ubuntu:24.04' 'archlinux:latest' 'fedora:42')
# DISTROS=('debian:bookworm')
DOCKERFILE_DIR="${IGN_DIR}/Dockerfiles"
test -d "${DOCKERFILE_DIR}" && rm -rf "${DOCKERFILE_DIR}"
mkdir -p "${DOCKERFILE_DIR}"
for distro in "${DISTROS[@]}"; do
image_tag="ffmpeg_builder_${distro}"
echo_info "source package manager for ${image_tag}"
# distro without problematic characters
distroFmt="${distro//:/-}"
# specific file for evaluated package manager info
distroFmtPkgMgr="${DOCKERFILE_DIR}/${distroFmt}-pkg_mgr"
# get package manager info
docker run --rm -it \
-v "${REPO_DIR}":/workdir \
-w /workdir \
"${distro}" \
bash -c "./scripts/print_pkg_mgr.sh" | tr -d '\r' >"${distroFmtPkgMgr}"
# shellcheck disable=SC1090
source "${distroFmtPkgMgr}"
cat "${distroFmtPkgMgr}"
dockerfile="${DOCKERFILE_DIR}/Dockerfile_${distroFmt}"
{
echo "FROM ${distro}"
echo 'SHELL ["/bin/bash", "-c"]'
echo "RUN ${pkg_mgr_update} && ${pkg_mgr_upgrade}"
echo "RUN ${pkg_install} ${req_pkgs}"
} >"${dockerfile}"
echo_info "building ${image_tag}"
docker build \
-t "${image_tag}" \
-f "${dockerfile}" \
.
done done
} }

View File

@@ -1,23 +1,24 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# shellcheck disable=SC2120
determine_pkg_mgr() { determine_pkg_mgr() {
# sudo used externally # sudo used externally
# shellcheck disable=SC2034 # shellcheck disable=SC2034
test "$(id -u)" -eq 0 && SUDO='' || SUDO=sudo test "$(id -u)" -eq 0 && SUDO='' || SUDO='sudo '
# pkg-mgr update-cmd install-cmd check-cmd # pkg-mgr update-cmd upgrade-cmd install-cmd check-cmd
# shellcheck disable=SC2016 # shellcheck disable=SC2016
local PKG_MGR_MAP=' local PKG_MGR_MAP='
brew:brew update:brew install:brew list --formula ${pkg} brew:brew update:brew upgrade:brew install:brew list --formula ${pkg}
apt-get:${SUDO} apt-get update: ${SUDO} apt-get install -y:dpkg -l ${pkg} apt-get:${SUDO}apt-get update:${SUDO}apt-get upgrade -y:${SUDO}apt-get install -y:dpkg -l ${pkg}
pacman:${SUDO} pacman -Syy:${SUDO} pacman -S --noconfirm --needed:pacman -Qi ${pkg} pacman:${SUDO}pacman -Syy:${SUDO}pacman -Syu --noconfirm:${SUDO}pacman -S --noconfirm --needed:pacman -Qi ${pkg}
dnf:${SUDO} dnf check-update:${SUDO} dnf install -y:dnf list -q --installed ${pkg} dnf:${SUDO}dnf check-update || true:${SUDO}dnf upgrade --refresh -y:${SUDO}dnf install -y:dnf list -q --installed ${pkg}
' '
local supported_pkg_mgr=() local supported_pkg_mgr=()
unset pkg_mgr pkg_mgr_update pkg_install pkg_check unset pkg_mgr pkg_mgr_update pkg_mgr_upgrade pkg_install pkg_check
while read -r line; do while read -r line; do
test "${line}" == '' && continue test "${line}" == '' && continue
IFS=':' read -r pkg_mgr pkg_mgr_update pkg_install pkg_check <<<"${line}" IFS=':' read -r pkg_mgr pkg_mgr_update pkg_mgr_upgrade pkg_install pkg_check <<<"${line}"
supported_pkg_mgr+=("${pkg_mgr}") supported_pkg_mgr+=("${pkg_mgr}")
if ! has_cmd "${pkg_mgr}"; then if ! has_cmd "${pkg_mgr}"; then
pkg_mgr='' pkg_mgr=''
@@ -25,6 +26,7 @@ dnf:${SUDO} dnf check-update:${SUDO} dnf install -y:dnf list -q --installed ${pk
fi fi
# update/install may use SUDO # update/install may use SUDO
eval "pkg_mgr_update=\"${pkg_mgr_update}\"" eval "pkg_mgr_update=\"${pkg_mgr_update}\""
eval "pkg_mgr_upgrade=\"${pkg_mgr_upgrade}\""
eval "pkg_install=\"${pkg_install}\"" eval "pkg_install=\"${pkg_install}\""
break break
done <<<"${PKG_MGR_MAP}" done <<<"${PKG_MGR_MAP}"
@@ -37,8 +39,7 @@ dnf:${SUDO} dnf check-update:${SUDO} dnf install -y:dnf list -q --installed ${pk
return 0 return 0
} }
check_for_req_pkgs() { print_req_pkgs() {
echo_info "checking for required packages"
local common_pkgs=( local common_pkgs=(
autoconf automake cmake libtool autoconf automake cmake libtool
texinfo nasm yasm python3 texinfo nasm yasm python3
@@ -77,8 +78,27 @@ check_for_req_pkgs() {
local req_pkgs_env_name="${pkg_mgr/-/_}_pkgs" local req_pkgs_env_name="${pkg_mgr/-/_}_pkgs"
declare -n req_pkgs="${req_pkgs_env_name}" declare -n req_pkgs="${req_pkgs_env_name}"
echo "${req_pkgs[@]}"
}
FB_FUNC_NAMES+=('print_pkg_mgr')
# FB_FUNC_DESCS used externally
# shellcheck disable=SC2034
FB_FUNC_DESCS['print_pkg_mgr']='print out evaluated package manager commands and required packages'
print_pkg_mgr() {
determine_pkg_mgr || return 1
echo "export pkg_mgr=\"${pkg_mgr}\""
echo "export pkg_mgr_update=\"${pkg_mgr_update}\""
echo "export pkg_mgr_upgrade=\"${pkg_mgr_upgrade}\""
echo "export pkg_install=\"${pkg_install}\""
echo "export pkg_check=\"${pkg_check}\""
echo "export req_pkgs=\"$(print_req_pkgs)\""
}
check_for_req_pkgs() {
echo_info "checking for required packages"
local missing_pkgs=() local missing_pkgs=()
for pkg in "${req_pkgs[@]}"; do for pkg in $(print_req_pkgs); do
# pkg_check has ${pkg} unexpanded # pkg_check has ${pkg} unexpanded
eval "pkg_check=\"${pkg_check}\"" eval "pkg_check=\"${pkg_check}\""
${pkg_check} "${pkg}" >/dev/null 2>&1 || missing_pkgs+=("${pkg}") ${pkg_check} "${pkg}" >/dev/null 2>&1 || missing_pkgs+=("${pkg}")

34
main.sh
View File

@@ -1,6 +1,13 @@
#!/usr/bin/env bash #!/usr/bin/env bash
REPO_DIR="$(cd "${BASH_SOURCE[0]//'main.sh'/}" && echo "$PWD")" # set top dir
relativeRepoRoot="${BASH_SOURCE[0]//'main.sh'/}"
if [[ -d ${relativeRepoRoot} ]]; then
preloadCmd="cd ${relativeRepoRoot} &&"
fi
REPO_DIR="$(${preloadCmd} echo "$PWD")"
unset relativeRepoRoot preloadCmd
IGN_DIR="${REPO_DIR}/gitignore" IGN_DIR="${REPO_DIR}/gitignore"
TMP_DIR="${IGN_DIR}/tmp" TMP_DIR="${IGN_DIR}/tmp"
DL_DIR="${IGN_DIR}/downloads" DL_DIR="${IGN_DIR}/downloads"
@@ -9,28 +16,28 @@ CCACHE_DIR="${IGN_DIR}/ccache"
export REPO_DIR IGN_DIR TMP_DIR DL_DIR BUILD_DIR CCACHE_DIR export REPO_DIR IGN_DIR TMP_DIR DL_DIR BUILD_DIR CCACHE_DIR
# function names, descriptions, completions # function names, descriptions, completions
unset FB_FUNC_NAMES FB_FUNC_DESCS FB_FUNC_COMPLETION
FB_FUNC_NAMES=() FB_FUNC_NAMES=()
declare -A FB_FUNC_DESCS declare -A FB_FUNC_DESCS FB_FUNC_COMPLETION
declare -A FB_FUNC_COMPLETION
# can't have recursive generation # can't have recursive generation
FB_RUNNING_AS_SCRIPT=${FB_RUNNING_AS_SCRIPT:-0} FB_RUNNING_AS_SCRIPT=${FB_RUNNING_AS_SCRIPT:-0}
# no undefined variables # shellcheck disable=SC2034
set -u FB_COMPILE_OPTS_SET=0
SCRIPT_DIR="${REPO_DIR}/scripts" SCRIPT_DIR="${REPO_DIR}/scripts"
ENTRY_SCRIPT="${SCRIPT_DIR}/entry.sh" ENTRY_SCRIPT="${SCRIPT_DIR}/entry.sh"
src_scripts() { src_scripts() {
local SCRIPT_DIR="${REPO_DIR}/scripts" local SCRIPT_DIR="${REPO_DIR}/scripts"
rm "${SCRIPT_DIR}"*.sh
if [[ $FB_RUNNING_AS_SCRIPT -eq 0 ]]; then if [[ $FB_RUNNING_AS_SCRIPT -eq 0 ]]; then
rm "${SCRIPT_DIR}"/*.sh
# shellcheck disable=SC2016 # shellcheck disable=SC2016
echo '#!/usr/bin/env bash echo '#!/usr/bin/env bash
cd "$(dirname "$(readlink -f $0)")/.." cd "$(dirname "$(readlink -f $0)")/.."
export FB_RUNNING_AS_SCRIPT=1
. main.sh . main.sh
FB_RUNNING_AS_SCRIPT=1
scr_name="$(bash_basename $0)" scr_name="$(bash_basename $0)"
cmd="${scr_name//.sh}" cmd="${scr_name//.sh}"
$cmd $@' >"${ENTRY_SCRIPT}" $cmd $@' >"${ENTRY_SCRIPT}"
@@ -49,21 +56,21 @@ print_cmds() {
echo -e "\n~~~ Usable Commands ~~~" echo -e "\n~~~ Usable Commands ~~~"
for funcname in "${FB_FUNC_NAMES[@]}"; do for funcname in "${FB_FUNC_NAMES[@]}"; do
echo -e "${CYAN}${funcname}${NC}:\n\t" "${FB_FUNC_DESCS[${funcname}]}" echo -e "${CYAN}${funcname}${NC}:\n\t" "${FB_FUNC_DESCS[${funcname}]}"
fb_running_as_script || (cd "$SCRIPT_DIR" && ln -sf entry.sh "${funcname}.sh") if [[ $FB_RUNNING_AS_SCRIPT -eq 0 ]]; then
(cd "$SCRIPT_DIR" && ln -sf entry.sh "${funcname}.sh")
fi
done done
echo -e "~~~~~~~~~~~~~~~~~~~~~~~\n" echo -e "~~~~~~~~~~~~~~~~~~~~~~~\n"
} }
set_completions() { set_completions() {
set +u
for funcname in "${FB_FUNC_NAMES[@]}"; do for funcname in "${FB_FUNC_NAMES[@]}"; do
complete -W "${FB_FUNC_COMPLETION[${funcname}]}" "${funcname}" complete -W "${FB_FUNC_COMPLETION[${funcname}]}" "${funcname}"
done done
set -u
} }
# shellcheck disable=SC1091 # shellcheck disable=SC1091
source "${HOME}/.bashrc" test -f "${HOME}/.bashrc" && source "${HOME}/.bashrc"
src_scripts || return 1 src_scripts || return 1
determine_pkg_mgr || return 1 determine_pkg_mgr || return 1
@@ -71,6 +78,7 @@ determine_pkg_mgr || return 1
# shellcheck disable=SC2154 # shellcheck disable=SC2154
test "${PREFIX}" == '' && PREFIX="${IGN_DIR}/${pkg_mgr}_sysroot" test "${PREFIX}" == '' && PREFIX="${IGN_DIR}/${pkg_mgr}_sysroot"
set_compile_opts || return 1 if [[ $FB_RUNNING_AS_SCRIPT -eq 0 ]]; then
fb_running_as_script || print_cmds || return 1 print_cmds || return 1
fi
set_completions || return 1 set_completions || return 1

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
cd "$(dirname "$(readlink -f $0)")/.." cd "$(dirname "$(readlink -f $0)")/.."
export FB_RUNNING_AS_SCRIPT=1
. main.sh . main.sh
FB_RUNNING_AS_SCRIPT=1
scr_name="$(bash_basename $0)" scr_name="$(bash_basename $0)"
cmd="${scr_name//.sh/}" cmd="${scr_name//.sh/}"
$cmd $@ $cmd $@

1
scripts/print_pkg_mgr.sh Symbolic link
View File

@@ -0,0 +1 @@
entry.sh