# Woodpecker CI/CD Pipeline - Peikarband Landing # Application build pipeline variables: - &helm_image 'alpine/helm:latest' when: - event: [push, pull_request, tag, manual] pipeline: # ============================================ # Stage 1: Check & Build Base (conditional) # ============================================ ensure-base-image: image: alpine:latest commands: - apk add --no-cache curl docker - | echo "═══════════════════════════════════════" echo " Checking Base Image" echo "═══════════════════════════════════════" REGISTRY="hub.peikarband.ir" BASE_REPO="peikarband/base" BASE_TAG="latest" # Login to registry echo "$HARBOR_PASSWORD" | docker login "$REGISTRY" -u "$HARBOR_USERNAME" --password-stdin # Try to pull base image if docker pull "$REGISTRY/$BASE_REPO:$BASE_TAG" 2>/dev/null; then echo "✅ Base image found in registry" echo " Skipping base build (saves ~10 minutes)" exit 0 fi echo "⚠️ Base image not found - building it now..." echo "" echo "═══════════════════════════════════════" echo " Building Base Image" echo "═══════════════════════════════════════" # Build base image docker buildx create --use --name builder || docker buildx use builder docker buildx build \ -f docker/Dockerfile.base \ -t "$REGISTRY/$BASE_REPO:latest" \ -t "$REGISTRY/$BASE_REPO:python3.11-node20" \ --build-arg PYTHON_VERSION=3.11 \ --build-arg NODE_VERSION=20 \ --platform linux/amd64 \ --push \ . echo "✅ Base image built and pushed successfully" secrets: [HARBOR_USERNAME, HARBOR_PASSWORD] when: event: [push, tag] branch: [main, develop, feature/restructure-project] # ============================================ # Stage 2: Build Application Image # ============================================ build-and-push-app: image: woodpeckerci/plugin-docker-buildx settings: registry: hub.peikarband.ir repo: hub.peikarband.ir/peikarband/landing username: from_secret: HARBOR_USERNAME password: from_secret: HARBOR_PASSWORD dockerfile: docker/Dockerfile context: . platforms: linux/amd64 build_args: - BASE_IMAGE=hub.peikarband.ir/peikarband/base:latest - VERSION=${CI_COMMIT_SHA:0:8} - BUILD_DATE=${CI_PIPELINE_CREATED} tags: - latest - ${CI_COMMIT_SHA:0:8} - ${CI_COMMIT_BRANCH} labels: - org.opencontainers.image.created=${CI_PIPELINE_CREATED} - org.opencontainers.image.source=${CI_REPO_LINK} - org.opencontainers.image.url=${CI_REPO_LINK} - org.opencontainers.image.revision=${CI_COMMIT_SHA} - org.opencontainers.image.version=${CI_COMMIT_SHA:0:8} - org.opencontainers.image.title=Peikarband Landing - org.opencontainers.image.description=Peikarband hosting platform landing page pull: true provenance: false push: true when: event: [push, tag] branch: [main, develop, feature/restructure-project] # ============================================ # Stage 3: Verify Push # ============================================ verify-push: image: alpine:latest commands: - apk add --no-cache curl - | echo "Verifying image was pushed successfully..." sleep 3 REGISTRY="hub.peikarband.ir" REPO="peikarband/landing" TAG="${CI_COMMIT_SHA:0:8}" if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \ "https://$REGISTRY/v2/$REPO/manifests/$TAG" > /dev/null 2>&1; then echo "✅ Image verified: $REGISTRY/$REPO:$TAG" echo "" echo "Available tags:" echo " - latest" echo " - ${CI_COMMIT_SHA:0:8}" echo " - ${CI_COMMIT_BRANCH}" else echo "❌ Failed to verify image push" exit 1 fi secrets: [HARBOR_USERNAME, HARBOR_PASSWORD] when: event: [push, tag] branch: [main, develop, feature/restructure-project] # ============================================ # Notifications # ============================================ notify-success: image: alpine:latest commands: - echo "════════════════════════════════════════" - echo " 🎉 Pipeline Completed Successfully!" - echo "════════════════════════════════════════" - echo "" - echo "Branch:" "${CI_COMMIT_BRANCH}" - echo "Commit:" "${CI_COMMIT_SHA:0:8}" - echo "Image:" "hub.peikarband.ir/peikarband/landing:${CI_COMMIT_SHA:0:8}" - echo "" - echo "════════════════════════════════════════" when: event: [push, tag] status: success notify-failure: image: alpine:latest commands: - echo "════════════════════════════════════════" - echo " ❌ Pipeline Failed!" - echo "════════════════════════════════════════" - echo "" - echo "Branch:" "${CI_COMMIT_BRANCH}" - echo "Commit:" "${CI_COMMIT_SHA:0:8}" - echo "" - echo "Please check the logs above for details" - echo "════════════════════════════════════════" when: event: [push, tag] status: failure # ============================================ # Commented stages (enable when needed) # ============================================ # helm-lint: # image: *helm_image # commands: # - helm lint helm/peikarband # when: # event: [push, pull_request, tag] # deploy-staging: # image: *helm_image # commands: # - apk add --no-cache kubectl # - echo "$KUBECONFIG_STAGING" | base64 -d > /tmp/kubeconfig # - export KUBECONFIG=/tmp/kubeconfig # - helm upgrade --install peikarband-staging helm/peikarband \ # --namespace staging \ # --create-namespace \ # --set image.repository=hub.peikarband.ir/peikarband/landing \ # --set image.tag=${CI_COMMIT_SHA:0:8} \ # --wait --timeout 5m # secrets: [KUBECONFIG_STAGING] # when: # event: push # branch: [main, develop]