kind: pipeline type: docker name: auto-deploy trigger: branch: - dev event: - push steps: # ============================================================ # DOCKER BUILD & PUSH # # Angular build (npm ci + ng build) Dockerfile ke andar # multi-stage me hota hai, isliye alag build step nahi chahiye. # ============================================================ - name: docker-build-push image: docker volumes: - name: dockersock path: /var/run/docker.sock commands: - | set -e # -------------------------------------------------------- # Repository name comes from Drone # -------------------------------------------------------- REPO="$${DRONE_REPO_NAME}" REPO="$$(echo "$$REPO" | tr '[:upper:]' '[:lower:]')" IMAGE="harbor.lincpay:8082/lincpay/$$REPO:$${DRONE_BUILD_NUMBER}" echo "==========================================" echo "DOCKER BUILD & PUSH" echo "==========================================" echo "Repository : $$REPO" echo "Build : $${DRONE_BUILD_NUMBER}" echo "Image : $$IMAGE" echo "==========================================" # -------------------------------------------------------- # Harbor login # -------------------------------------------------------- echo 'QVgW5QbqlKKtBU2dYApTY28Dd6J36GK3' | \ docker login harbor.lincpay:8082 \ -u 'robot$lincpay+drone' \ --password-stdin # -------------------------------------------------------- # Build # -------------------------------------------------------- echo "Building Docker image..." docker build \ -t "$$IMAGE" \ . # -------------------------------------------------------- # Push # -------------------------------------------------------- echo "Pushing Docker image..." docker push "$$IMAGE" echo "Docker image pushed successfully." # ============================================================ # DEPLOY # ============================================================ - name: deploy image: docker volumes: - name: dockersock path: /var/run/docker.sock - name: envfiles path: /platform-env commands: - | set -e # ======================================================== # REPOSITORY / SERVICE / IMAGE # ======================================================== REPO="$${DRONE_REPO_NAME}" REPO="$$(echo "$$REPO" | tr '[:upper:]' '[:lower:]')" SERVICE_NAME="$${REPO}_app" IMAGE="harbor.lincpay:8082/lincpay/$$REPO:$${DRONE_BUILD_NUMBER}" echo "==========================================" echo "DEPLOYMENT" echo "==========================================" echo "Repository : $$REPO" echo "Service : $$SERVICE_NAME" echo "Image : $$IMAGE" echo "Placement : node.labels.environment == dev2" echo "==========================================" # ======================================================== # VALIDATION # ======================================================== if [ -z "$$REPO" ]; then echo "ERROR: DRONE_REPO_NAME is empty." exit 1 fi if [ -z "$$SERVICE_NAME" ]; then echo "ERROR: Service name is empty." exit 1 fi if [ -z "$$IMAGE" ]; then echo "ERROR: Docker image is empty." exit 1 fi echo "Repository verified : $$REPO" echo "Service verified : $$SERVICE_NAME" echo "Image verified : $$IMAGE" # ======================================================== # HARBOR LOGIN # # Zaroori hai taaki --with-registry-auth worker node (dev2) ko # valid Harbor credentials propagate kare — warna cross-node pull # "No such image" / "no basic auth credentials" se fail hota hai. # ======================================================== echo 'QVgW5QbqlKKtBU2dYApTY28Dd6J36GK3' | \ docker login harbor.lincpay:8082 \ -u 'robot$lincpay+drone' \ --password-stdin # ======================================================== # EXISTING SERVICE # ======================================================== if docker service ls --format '{{.Name}}' | grep -Fxq "$$SERVICE_NAME"; then echo "" echo "==========================================" echo "EXISTING SERVICE" echo "==========================================" echo "Service: $$SERVICE_NAME" # ------------------------------------------------------ # Check whether dev constraint already exists # ------------------------------------------------------ CONSTRAINT_EXISTS=$$(docker service inspect "$$SERVICE_NAME" \ --format '{{range .Spec.TaskTemplate.Placement.Constraints}}{{println .}}{{end}}' \ | grep -Fx 'node.labels.environment == dev2' || true) # ------------------------------------------------------ # Add constraint if missing # ------------------------------------------------------ if [ -z "$$CONSTRAINT_EXISTS" ]; then echo "Constraint missing." echo "Adding: node.labels.environment == dev2" docker service update \ --constraint-add 'node.labels.environment == dev2' \ "$$SERVICE_NAME" else echo "Constraint already exists." fi # ------------------------------------------------------ # Update image # ------------------------------------------------------ echo "Updating service image..." docker service update \ --image "$$IMAGE" \ --replicas 1 \ --with-registry-auth \ "$$SERVICE_NAME" # ======================================================== # NEW SERVICE # ======================================================== else echo "" echo "==========================================" echo "NEW SERVICE" echo "==========================================" echo "Creating: $$SERVICE_NAME" # ------------------------------------------------------ # Traefik rule # # Construct it without allowing Drone to consume # the shell backticks. # ------------------------------------------------------ TRAEFIK_RULE='Host(`'$$REPO'.lincpay`)' echo "Traefik rule: $$TRAEFIK_RULE" # ------------------------------------------------------ # Create service # ------------------------------------------------------ docker service create \ --name "$$SERVICE_NAME" \ --network edge-network \ --replicas 1 \ --constraint 'node.labels.environment == dev2' \ --with-registry-auth \ --env-file /platform-env/global.env \ --env-file /platform-env/dev.env \ --label traefik.enable=true \ --label "traefik.docker.network=edge-network" \ --label "traefik.http.routers.$$REPO.rule=$$TRAEFIK_RULE" \ --label "traefik.http.services.$$REPO.loadbalancer.server.port=80" \ "$$IMAGE" fi # ======================================================== # FINAL STATUS # ======================================================== echo "" echo "==========================================" echo "FINAL SERVICE STATUS" echo "==========================================" docker service ls \ --filter "name=$$SERVICE_NAME" echo "" echo "==========================================" echo "PLACEMENT CONSTRAINT" echo "==========================================" docker service inspect "$$SERVICE_NAME" \ --format '{{json .Spec.TaskTemplate.Placement}}' echo "" echo "==========================================" echo "SERVICE TASKS" echo "==========================================" docker service ps "$$SERVICE_NAME" --no-trunc echo "" echo "==========================================" echo "DEPLOYMENT COMPLETE" echo "==========================================" volumes: # ============================================================ # DOCKER SOCKET # ============================================================ - name: dockersock host: path: /var/run/docker.sock # ============================================================ # ENVIRONMENT FILES # ============================================================ - name: envfiles host: path: /opt/platform/env