Ctrl K
ComunidadGuías…

docker/build.sh

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/usr/bin/env bash
set -euo pipefail

usage() {
    cat <<'EOF'
Usage: `./docker/build.sh <distro>`

This script tests BleachBit and builds packages insider a container.

Run this script from the host, not inside a container.

Supported distributions:
  appimage  - build an AppImage package on Debian
  debian    - run `make tests` and build .deb packages on Debian
  fedora    - run `make tests` and build RPM/SRPM packages on Fedora
  opensuse  - run `make tests` and build RPM/SRPM packages on openSUSE
  py315-pytest - run selected tests with Python 3.15 + pytest

Optional environment overrides:
  FEDORA_VERSION   Set Fedora macro used by the spec file
  SUSE_VERSION     Set openSUSE suse_version macro
  REVISION         Short git revision when the tree has no .git

Artifacts are written to `./docker-artifacts/<distro>` on the host.
EOF
}

if [[ $# -ne 1 ]]; then
    usage >&2
    exit 1
fi

if ! command -v docker >/dev/null 2>&1; then
    echo "ERROR: Docker CLI is required" >&2
    exit 1
fi

DISTRO=$1
ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
DOCKER_DIR="$ROOT_DIR/docker"
ARTIFACT_ROOT="$ROOT_DIR/docker-artifacts" # cleaned by `make clean`
mkdir -p "$ARTIFACT_ROOT"

# Set HOME for BleachBit, dnf, etc.
# Setting HOME to /tmp/home is unrealistic and breaks some
# tests in BleachBit. Instead, we need to make the directory
# and set the permissions.
HOME_IN_CONTAINER=/home/user
RUN_ENV=(--env HOME="$HOME_IN_CONTAINER" --env DISTRO_NAME="$DISTRO")
if [[ -n "${SKIP_TESTS:-}" ]]; then
    RUN_ENV+=(--env SKIP_TESTS="$SKIP_TESTS")
fi
# `make stamp` falls back to this when the container lacks git or .git
# (e.g., the rpmbuild tree extracted from the sdist tarball).
REVISION=${REVISION:-$(cd "$ROOT_DIR" && git rev-parse --short=8 HEAD 2>/dev/null || true)}
RUN_ENV+=(--env REVISION="$REVISION")
USER_ID=$(id -u)
GROUP_ID=$(id -g)
IMAGE=""
DOCKERFILE=""
DOCKER_BUILD_CONTEXT="$DOCKER_DIR"

case "$DISTRO" in
    debian)
        IMAGE=bleachbit-build:debian
        DOCKERFILE="$DOCKER_DIR/Dockerfile.debian"
        ;;
    fedora)
        IMAGE=bleachbit-build:fedora
        DOCKERFILE="$DOCKER_DIR/Dockerfile.fedora"
        FEDORA_VERSION=${FEDORA_VERSION:-44}
        RUN_ENV+=(--env FEDORA_VERSION="$FEDORA_VERSION")
        ;;
    opensuse)
        IMAGE=bleachbit-build:opensuse
        DOCKERFILE="$DOCKER_DIR/Dockerfile.opensuse"
        SUSE_VERSION=${SUSE_VERSION:-1699}
        RUN_ENV+=(--env SUSE_VERSION="$SUSE_VERSION")
        ;;
    appimage)
        IMAGE=bleachbit-build:appimage
        DOCKERFILE="$DOCKER_DIR/Dockerfile.appimage"
        RUN_ENV+=(--env APPIMAGE_EXTRACT_AND_RUN=1)
        RUN_ENV+=(--env NO_STRIP=1)
        RUN_ENV+=(--env SKIP_APPIMAGE_TEST=1)
        ;;
    py315-pytest)
        IMAGE=bleachbit-test:py315-pytest
        DOCKERFILE="$DOCKER_DIR/Dockerfile.py315-pytest"
        DOCKER_BUILD_CONTEXT="$ROOT_DIR"
        ;;
    *)
        echo "ERROR: unsupported distro '$DISTRO'" >&2
        usage >&2
        exit 1
        ;;
esac

CONTAINER_CMD=$(cat <<'EOF'
set -euo pipefail
bash /work/docker/inside_container.sh
EOF
)

if [[ ! -f "$DOCKERFILE" ]]; then
    echo "ERROR: missing $DOCKERFILE" >&2
    exit 1
fi

ARTIFACT_DIR="$ARTIFACT_ROOT/$DISTRO"
mkdir -p "$ARTIFACT_DIR"

echo "[docker] Building image $IMAGE from $(basename "$DOCKERFILE")" >&2
docker build \
    --pull \
    --network=host \
    --build-arg HOME_IN_CONTAINER="$HOME_IN_CONTAINER" \
    --build-arg USER_ID="$USER_ID" \
    --build-arg GROUP_ID="$GROUP_ID" \
    --progress=plain \
    -f "$DOCKERFILE" \
    -t "$IMAGE" \
    "$DOCKER_BUILD_CONTEXT"

echo "[docker] Running build and tests inside $IMAGE" >&2
docker run --rm \
    --network=host \
    --user "$USER_ID:$GROUP_ID" \
    -v "$ROOT_DIR":/work:ro \
    -v "$ARTIFACT_DIR":/artifacts \
    "${RUN_ENV[@]}" \
    "$IMAGE" bash -lc "$CONTAINER_CMD"

echo "Artifacts saved to $ARTIFACT_DIR" >&2