# Woodpecker CI/CD Pipeline - Peikarband Landing # Smart pipeline with base image management variables: - &base_image 'hub.peikarband.ir/peikarband/landing:base' - &app_image 'hub.peikarband.ir/peikarband/landing' when: - event: [push, pull_request, tag, manual] steps: # ============================================ # Ensure Base Image Exists # ============================================ ensure-base-image: image: woodpeckerci/plugin-docker-buildx settings: registry: hub.peikarband.ir repo: *app_image # username: # from_secret: HARBOR_USERNAME # password: # from_secret: HARBOR_PASSWORD username: admin password: 5459ed7590d37656410fae38bdf59eb7ee33b68cd4c dockerfile: docker/Dockerfile.base context: . platforms: linux/amd64 tags: - base build_args: - PYTHON_VERSION=3.11 - NODE_VERSION=20 - BUILD_DATE=${CI_PIPELINE_CREATED} - VERSION=${CI_COMMIT_SHA:0:8} labels: - org.opencontainers.image.created=${CI_PIPELINE_CREATED} - org.opencontainers.image.source=${CI_REPO_LINK} - org.opencontainers.image.title=Peikarband Base - org.opencontainers.image.description=Base image with Python, Node.js, bun, and build tools cache: inline provenance: true sbom: true push: true when: event: [push, tag, manual] branch: [main, develop] # Only rebuild base if its definition changed path: include: - docker/Dockerfile.base - .woodpecker.yml # ============================================ # Build Application Image # ============================================ build-and-push-app: image: woodpeckerci/plugin-docker-buildx settings: debug: true log-level: debug registry: hub.peikarband.ir repo: *app_image username: from_secret: HARBOR_USERNAME password: from_secret: HARBOR_PASSWORD dockerfile: docker/Dockerfile context: . platforms: linux/amd64 build_args: - BASE_IMAGE=*base_image - 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 # cache: inline # provenance: true # sbom: true push: true # Cache configuration - using inline cache instead of registry cache # cache_from: type=registry,ref=hub.peikarband.ir/peikarband/landing:cache # cache_to: type=registry,ref=hub.peikarband.ir/peikarband/landing:cache,mode=max when: event: [push, tag] branch: [main, develop,] # # ============================================ # # Verify Images # # ============================================ # verify-images: # image: alpine:latest # commands: # - apk add --no-cache curl # - | # echo "════════════════════════════════════════" # echo " 🔍 Verifying Images in Registry" # echo "════════════════════════════════════════" # echo "" # # Check base image # echo "Checking base image..." # if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \ # "https://hub.peikarband.ir/v2/peikarband/landing/manifests/base" > /dev/null 2>&1; then # echo "✅ Base image: hub.peikarband.ir/peikarband/landing:base" # else # echo "⚠️ Base image not found (this is OK if first build)" # fi # echo "" # # Check app image # echo "Checking app image..." # TAG="${CI_COMMIT_SHA:0:8}" # if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \ # "https://hub.peikarband.ir/v2/peikarband/landing/manifests/$TAG" > /dev/null 2>&1; then # echo "✅ App image: hub.peikarband.ir/peikarband/landing:$TAG" # echo "" # echo "Available tags:" # echo " • latest" # echo " • ${CI_COMMIT_SHA:0:8}" # echo " • ${CI_COMMIT_BRANCH}" # echo "" # echo "════════════════════════════════════════" # else # echo "❌ Failed to verify app image" # exit 1 # fi # environment: # HARBOR_USERNAME: # from_secret: HARBOR_USERNAME # HARBOR_PASSWORD: # from_secret: HARBOR_PASSWORD # when: # event: [push, tag] # branch: [main, develop] # ============================================ # 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 "" # - echo "Images:" # - echo " • Base:" "hub.peikarband.ir/peikarband/landing:base" # - echo " • App:" "hub.peikarband.ir/peikarband/landing:${CI_COMMIT_SHA:0:8}" # - echo "" # - echo "Deploy with:" # - echo " kubectl set image deployment/peikarband-landing \\" # - echo " peikarband-landing=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" # - echo "════════════════════════════════════════" # when: # event: [push, tag] # status: failure