diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 0000000..1f07558 --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,60 @@ +name: Docker Image CI + +on: + push: + tags: + - '*' + +env: + DOCKER_REGISTRY: ${{ secrets.DOCKER_REGISTRY }} + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_ACCESS_TOKEN: ${{ secrets.DOCKER_ACCESS_TOKEN }} + GITHUB_CONTAINER_REGISTRY: ghcr.io + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Get the tag + id: get_tag + run: echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_ACCESS_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push Docker image + run: | + # Build image with version tag + docker build -t thehale/speedtest:${{ steps.get_tag.outputs.TAG }} . + + # Tag as latest + docker tag thehale/speedtest:${{ steps.get_tag.outputs.TAG }} thehale/speedtest:latest + + # Tag for GitHub Container Registry + docker tag thehale/speedtest:${{ steps.get_tag.outputs.TAG }} ghcr.io/thehale/speedtest:${{ steps.get_tag.outputs.TAG }} + docker tag thehale/speedtest:latest ghcr.io/thehale/speedtest:latest + + # Push to Docker Hub + docker push thehale/speedtest:${{ steps.get_tag.outputs.TAG }} + docker push thehale/speedtest:latest + + # Push to GitHub Container Registry + docker push ghcr.io/thehale/speedtest:${{ steps.get_tag.outputs.TAG }} + docker push ghcr.io/thehale/speedtest:latest diff --git a/bin/publish.sh b/bin/publish.sh new file mode 100755 index 0000000..58bb911 --- /dev/null +++ b/bin/publish.sh @@ -0,0 +1,79 @@ +#!/bin/bash +set -e + +# Docker Publishing Script +# Pushes images to both Docker Hub and GitHub Container Registry +# Usage: bin/publish.sh [tag] +# If no tag provided, uses the current git tag + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +cd "$PROJECT_ROOT" + +# Configuration +IMAGE_NAME="${IMAGE_NAME:-speedtest}" +DOCKER_HUB_REPO="${DOCKER_HUB_REPO:-thehale/speedtest}" +GITHUB_REPO="${GITHUB_REPO:-thehale/speedtest}" +GITHUB_REGISTRY="ghcr.io" + +# 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 " + exit 1 + fi +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 +echo "Checking Docker Hub login..." +if ! docker info | grep -q "Username"; then + echo "Error: Not logged in to Docker Hub" + echo "Please run: docker login" + exit 1 +fi + +# Build the image +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" + +# Push to Docker Hub +echo "" +echo "Pushing to Docker Hub..." +docker push "$DOCKER_HUB_REPO:$TAG" +docker push "$DOCKER_HUB_REPO:latest" + +# 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" + +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"