From d6837c0329f911b06be6e36308301c1210894003 Mon Sep 17 00:00:00 2001 From: Ameer Hamza Khan Date: Sun, 17 Aug 2025 09:57:53 +0000 Subject: [PATCH] Deleted the drone based CI/CD pipeline and wrote a simple buildx script to build the images manually. --- .drone.yml | 67 ----------------- Dockerfile | 2 +- build.sh | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 206 insertions(+), 68 deletions(-) delete mode 100644 .drone.yml create mode 100755 build.sh diff --git a/.drone.yml b/.drone.yml deleted file mode 100644 index 2ec66f8..0000000 --- a/.drone.yml +++ /dev/null @@ -1,67 +0,0 @@ -kind: pipeline -type: docker -name: ubuntu - -steps: - - name: create_tags - image: ubuntu:latest - commands: - - echo "$(date "+%Y-%m-%d"), latest" > .tags - - - name: ubuntu-24 - image: &image thegeeklab/drone-docker-buildx:24 - depends_on: &depends - - create_tags - environment: - UBUNTU_VER: 24.04 - settings: &settings - registry: - from_secret: package-repo - username: - from_secret: gitea-username - password: - from_secret: gitea-password - repo: ${DRONE_REPO_LINK:8}/ubuntu-24.04 - extra_tags: - - ${DRONE_REPO_LINK:8}:24.04 - - ${DRONE_REPO_LINK:8}:latest - build_args_from_env: - UBUNTU_VER - platforms: - - linux/amd64 - - linux/arm64 - provenance: false - cache_from: - - type=local\\,src=/cache/${DRONE_REPO}/ubuntu-24.04 - cache_to: - - type=local,dest=/cache/${DRONE_REPO}/ubuntu-24.04,mode=max - - - name: ubuntu-22 - image: *image - depends_on: *depends - environment: - UBUNTU_VER: 22.04 - settings: - <<: *settings - repo: ${DRONE_REPO_LINK:8}/ubuntu-22.04 - extra_tags: - - ${DRONE_REPO_LINK:8}:22.04 - cache_from: - - type=local\\,src=/cache/${DRONE_REPO}/ubuntu-22.04 - cache_to: - - type=local,dest=/cache/${DRONE_REPO}/ubuntu-22.04,mode=max - - - name: ubuntu-20 - image: *image - depends_on: *depends - environment: - UBUNTU_VER: 20.04 - settings: - <<: *settings - repo: ${DRONE_REPO_LINK:8}/ubuntu-20.04 - extra_tags: - - ${DRONE_REPO_LINK:8}:20.04 - cache_from: - - type=local\\,src=/cache/${DRONE_REPO}/ubuntu-20.04 - cache_to: - - type=local,dest=/cache/${DRONE_REPO}/ubuntu-20.04,mode=max diff --git a/Dockerfile b/Dockerfile index ba94944..00ebc17 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG UBUNTU_VER +ARG UBUNTU_VER=24.04 FROM ubuntu:${UBUNTU_VER} diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..0f4c4e4 --- /dev/null +++ b/build.sh @@ -0,0 +1,205 @@ +#!/bin/bash + +set -e + +# Configuration +REGISTRY="${REGISTRY:-gitea.ahkhan.me}" +REGISTRY_PATH="${REGISTRY_PATH:-docker}" +REPO_PREFIX="${REPO_PREFIX:-ubuntu}" +PLATFORMS="${PLATFORMS:-linux/amd64,linux/arm64}" +DATE_TAG=$(date +%Y-%m-%d) + +# Ubuntu versions to build (in order, latest first) +UBUNTU_VERSIONS=("24.04" "22.04" "20.04") +LATEST_VERSION="24.04" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +log() { + echo -e "${BLUE}[$(date '+%H:%M:%S')]${NC} $1" +} + +success() { + echo -e "${GREEN}[$(date '+%H:%M:%S')]${NC} $1" +} + +warn() { + echo -e "${YELLOW}[$(date '+%H:%M:%S')]${NC} $1" +} + +error() { + echo -e "${RED}[$(date '+%H:%M:%S')]${NC} $1" +} + +# Function to build single Ubuntu version +build_ubuntu_version() { + local version=$1 + local repo_name="${REPO_PREFIX}-${version}" + + log "Building Ubuntu ${version}..." + + # Build tags for this version + local tags=( + "${REGISTRY}/${REGISTRY_PATH}/${repo_name}:latest" + "${REGISTRY}/${REGISTRY_PATH}/${repo_name}:${DATE_TAG}" + ) + + # Add ubuntu:latest tag only for the latest version + if [[ "$version" == "$LATEST_VERSION" ]]; then + tags+=("${REGISTRY}/${REGISTRY_PATH}/${REPO_PREFIX}:latest") + fi + + # Build tag arguments + local tag_args="" + for tag in "${tags[@]}"; do + tag_args="$tag_args --tag $tag" + done + + # Cache configuration + local cache_from="${REGISTRY}/${REGISTRY_PATH}/${repo_name}:buildcache" + local cache_to="${REGISTRY}/${REGISTRY_PATH}/${repo_name}:buildcache" + + log "Tags: ${tags[*]}" + log "Cache from/to: $cache_from" + + # Build command + docker buildx build \ + --platform "$PLATFORMS" \ + --build-arg UBUNTU_VER="$version" \ + $tag_args \ + --cache-from "type=registry,ref=$cache_from" \ + --cache-to "type=registry,ref=$cache_to,mode=max" \ + --push \ + . + + success "Ubuntu ${version} build completed successfully" + + # Clear local builder cache to save disk space (registry cache is preserved) + log "Clearing local builder cache for Ubuntu ${version}..." + docker buildx prune --filter type=exec.cachemount --filter type=regular --force >/dev/null 2>&1 || true +} + +# Function to validate Docker buildx setup +validate_setup() { + log "Validating Docker buildx setup..." + + if ! command -v docker &> /dev/null; then + error "Docker is not installed or not in PATH" + exit 1 + fi + + if ! docker buildx version &> /dev/null; then + error "Docker buildx is not available" + exit 1 + fi + + # Always use multiarch builder for consistency and reliability + # Reasons: better registry caching, isolated BuildKit, predictable multi-arch behavior + log "Setting up multiarch builder for optimal registry caching and multi-platform support..." + + # Install binfmt for cross-platform emulation + log "Setting up cross-platform emulation..." + docker run --privileged --rm tonistiigi/binfmt --install all + + # Create or reuse multiarch builder + if docker buildx ls | grep -q "^multiarch"; then + log "Using existing multiarch builder" + docker buildx use multiarch + else + log "Creating new multiarch builder" + docker buildx create --name multiarch --driver docker-container --use + fi + + # Bootstrap the builder + docker buildx inspect --bootstrap + + success "Multiarch builder setup completed" +} + +# Function to show build summary +show_summary() { + log "Build Summary:" + echo "Registry: $REGISTRY" + echo "Date tag: $DATE_TAG" + echo "Platforms: $PLATFORMS" + echo "Ubuntu versions: ${UBUNTU_VERSIONS[*]}" + echo "" + + echo "Images that will be built:" + for version in "${UBUNTU_VERSIONS[@]}"; do + echo " ${REGISTRY}/${REGISTRY_PATH}/${REPO_PREFIX}-${version}:latest" + echo " ${REGISTRY}/${REGISTRY_PATH}/${REPO_PREFIX}-${version}:${DATE_TAG}" + echo " ${REGISTRY}/${REGISTRY_PATH}/${REPO_PREFIX}-${version}:buildcache (cache)" + if [[ "$version" == "$LATEST_VERSION" ]]; then + echo " ${REGISTRY}/${REGISTRY_PATH}/${REPO_PREFIX}:latest" + fi + echo "" + done +} + +# Main execution +main() { + log "Starting Ubuntu Docker images build process" + + # Validate environment + validate_setup + + # Show what will be built + show_summary + + # Confirm before proceeding + read -p "Proceed with build? (y/N): " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + warn "Build cancelled by user" + exit 0 + fi + + # Build each version + for version in "${UBUNTU_VERSIONS[@]}"; do + build_ubuntu_version "$version" + done + + success "All Ubuntu images built successfully!" + + log "Available images:" + for version in "${UBUNTU_VERSIONS[@]}"; do + echo " ${REGISTRY}/${REGISTRY_PATH}/${REPO_PREFIX}-${version}:latest" + echo " ${REGISTRY}/${REGISTRY_PATH}/${REPO_PREFIX}-${version}:${DATE_TAG}" + done + echo " ${REGISTRY}/${REGISTRY_PATH}/${REPO_PREFIX}:latest (→ Ubuntu ${LATEST_VERSION})" +} + +# Help function +show_help() { + echo "Ubuntu Docker Build Script" + echo "" + echo "Usage: $0 [OPTIONS]" + echo "" + echo "Environment Variables:" + echo " REGISTRY Docker registry (default: gitea.ahkhan.me)" + echo " REGISTRY_PATH Registry path (default: docker)" + echo " REPO_PREFIX Repository prefix (default: ubuntu)" + echo " PLATFORMS Target platforms (default: linux/amd64,linux/arm64)" + echo "" + echo "Examples:" + echo " REGISTRY=myregistry.com ./build.sh" + echo " PLATFORMS=linux/amd64 ./build.sh" + echo "" +} + +# Handle arguments +case "${1:-}" in + -h|--help) + show_help + exit 0 + ;; + *) + main "$@" + ;; +esac \ No newline at end of file