From 7ca8bec7cf0626e1873e719ac3b05d9c65c8e6bc Mon Sep 17 00:00:00 2001 From: Joseph Hale Date: Tue, 17 Feb 2026 15:27:42 -0700 Subject: [PATCH] Refactor publish.sh with functions and selective publishing Restructure script to use a publish_to_registry function that accepts registry, repo, and tag as parameters. Add command-line options to publish selectively: Usage: bin/publish.sh # Publish to both registries (default) bin/publish.sh --docker # Publish only to Docker Hub bin/publish.sh --github # Publish only to GitHub Container Registry bin/publish.sh v1.0.0 # Publish specific tag to both This allows local testing against a single registry without needing credentials for both. CI workflow continues to publish to both. --- bin/publish.sh | 118 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 87 insertions(+), 31 deletions(-) diff --git a/bin/publish.sh b/bin/publish.sh index d3a5f22..bd887b4 100755 --- a/bin/publish.sh +++ b/bin/publish.sh @@ -2,8 +2,13 @@ set -e # Docker Publishing Script -# Pushes images to both Docker Hub and GitHub Container Registry -# Usage: bin/publish.sh [tag] +# Pushes images to Docker Hub and/or GitHub Container Registry +# Usage: bin/publish.sh [options] [tag] +# Options: +# --docker Publish only to Docker Hub +# --github Publish only to GitHub Container Registry +# (no option) Publish to both registries +# # If no tag provided, uses the current git tag SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" @@ -16,14 +21,53 @@ DOCKER_HUB_REPO="${DOCKER_HUB_REPO:-thehale/speedtest}" GITHUB_REPO="${GITHUB_REPO:-thehale/speedtest}" GITHUB_REGISTRY="ghcr.io" +# Parse arguments +PUBLISH_DOCKER=false +PUBLISH_GITHUB=false +TAG="" + +while [[ $# -gt 0 ]]; do + case $1 in + --docker) + PUBLISH_DOCKER=true + shift + ;; + --github) + PUBLISH_GITHUB=true + shift + ;; + --help|-h) + echo "Usage: bin/publish.sh [options] [tag]" + echo "" + echo "Options:" + echo " --docker Publish only to Docker Hub" + echo " --github Publish only to GitHub Container Registry" + echo " (no option) Publish to both registries" + echo "" + echo "If no tag is provided, uses the current git tag" + exit 0 + ;; + *) + # Assume this is the tag + TAG="$1" + shift + ;; + esac +done + +# If no specific registry selected, publish to both +if [ "$PUBLISH_DOCKER" = false ] && [ "$PUBLISH_GITHUB" = false ]; then + PUBLISH_DOCKER=true + PUBLISH_GITHUB=true +fi + # Get the tag to publish -TAG="${1:-}" if [ -z "$TAG" ]; then # Try to get tag from git TAG=$(git describe --tags --exact-match 2>/dev/null || echo "") if [ -z "$TAG" ]; then echo "Error: No tag provided and not currently on a git tag" - echo "Usage: bin/publish.sh " + echo "Usage: bin/publish.sh [options] " exit 1 fi fi @@ -31,15 +75,13 @@ fi echo "=== Publishing Docker Image ===" echo "Image: $IMAGE_NAME" echo "Tag: $TAG" -echo "Docker Hub: $DOCKER_HUB_REPO" -echo "GitHub Registry: $GITHUB_REGISTRY/$GITHUB_REPO" echo "" # Verify we're logged in (skip check in CI environments) if [ -z "$CI" ]; then - echo "Checking Docker Hub login..." + echo "Checking Docker login status..." if ! docker info 2>/dev/null | grep -q "Username"; then - echo "Error: Not logged in to Docker Hub" + echo "Error: Not logged in to Docker" echo "Please run: docker login" exit 1 fi @@ -50,32 +92,46 @@ echo "Building Docker image..." docker build -t "$IMAGE_NAME:$TAG" . docker tag "$IMAGE_NAME:$TAG" "$IMAGE_NAME:latest" -# Tag for Docker Hub -echo "Tagging for Docker Hub..." -docker tag "$IMAGE_NAME:$TAG" "$DOCKER_HUB_REPO:$TAG" -docker tag "$IMAGE_NAME:latest" "$DOCKER_HUB_REPO:latest" - -# Tag for GitHub Container Registry -echo "Tagging for GitHub Container Registry..." -docker tag "$IMAGE_NAME:$TAG" "$GITHUB_REGISTRY/$GITHUB_REPO:$TAG" -docker tag "$IMAGE_NAME:latest" "$GITHUB_REGISTRY/$GITHUB_REPO:latest" +# Function to publish to a registry +# Usage: publish_to_registry +publish_to_registry() { + local registry="$1" + local repo="$2" + local tag="$3" + + echo "" + echo "Publishing to $registry..." + + # Tag the image + docker tag "$IMAGE_NAME:$tag" "$repo:$tag" + docker tag "$IMAGE_NAME:latest" "$repo:latest" + + # Push the images + docker push "$repo:$tag" + docker push "$repo:latest" + + echo "✓ Published to $registry" +} -# Push to Docker Hub -echo "" -echo "Pushing to Docker Hub..." -docker push "$DOCKER_HUB_REPO:$TAG" -docker push "$DOCKER_HUB_REPO:latest" +# Publish to selected registries +if [ "$PUBLISH_DOCKER" = true ]; then + publish_to_registry "Docker Hub" "$DOCKER_HUB_REPO" "$TAG" +fi -# Push to GitHub Container Registry -echo "" -echo "Pushing to GitHub Container Registry..." -docker push "$GITHUB_REGISTRY/$GITHUB_REPO:$TAG" -docker push "$GITHUB_REGISTRY/$GITHUB_REPO:latest" +if [ "$PUBLISH_GITHUB" = true ]; then + publish_to_registry "GitHub Container Registry" "$GITHUB_REGISTRY/$GITHUB_REPO" "$TAG" +fi echo "" echo "=== Publishing Complete ===" echo "Published tags:" -echo " - $DOCKER_HUB_REPO:$TAG" -echo " - $DOCKER_HUB_REPO:latest" -echo " - $GITHUB_REGISTRY/$GITHUB_REPO:$TAG" -echo " - $GITHUB_REGISTRY/$GITHUB_REPO:latest" +if [ "$PUBLISH_DOCKER" = true ]; then + echo " Docker Hub:" + echo " - $DOCKER_HUB_REPO:$TAG" + echo " - $DOCKER_HUB_REPO:latest" +fi +if [ "$PUBLISH_GITHUB" = true ]; then + echo " GitHub Container Registry:" + echo " - $GITHUB_REGISTRY/$GITHUB_REPO:$TAG" + echo " - $GITHUB_REGISTRY/$GITHUB_REPO:latest" +fi -- 2.51.2