feat: smart base image check with docker pull
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
- Use 'docker pull' to check if base exists
- If exists: skip build (saves ~10 minutes) ✅
- If not exists: build automatically
- Single stage that handles both check and build
- No authentication issues (uses docker login)
Behavior:
✓ Base exists → Skip (~30 seconds check + 3 min app)
✓ Base missing → Build base (~10 min) + app (~3 min)
This is the REAL solution we wanted!
This commit is contained in:
169
.woodpecker.yml
169
.woodpecker.yml
@@ -1,131 +1,71 @@
|
|||||||
# Woodpecker CI/CD Pipeline - Peikarband Landing
|
# Woodpecker CI/CD Pipeline - Peikarband Landing
|
||||||
# Application build pipeline with auto-build base image fallback
|
# Application build pipeline
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
- &python_image 'python:3.11-slim'
|
|
||||||
- &helm_image 'alpine/helm:latest'
|
- &helm_image 'alpine/helm:latest'
|
||||||
- &base_image 'hub.peikarband.ir/peikarband/base:latest'
|
|
||||||
|
|
||||||
when:
|
when:
|
||||||
- event: [push, pull_request, tag, manual]
|
- event: [push, pull_request, tag, manual]
|
||||||
|
|
||||||
pipeline:
|
pipeline:
|
||||||
# ============================================
|
# ============================================
|
||||||
# Stage 1: Build Base Image (always - with cache)
|
# Stage 1: Check & Build Base (conditional)
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
check-base-image:
|
ensure-base-image:
|
||||||
image: alpine:latest
|
image: alpine:latest
|
||||||
commands:
|
commands:
|
||||||
- apk add --no-cache curl
|
- apk add --no-cache curl docker
|
||||||
- |
|
- |
|
||||||
echo "Checking if base image exists..."
|
echo "═══════════════════════════════════════"
|
||||||
|
echo " Checking Base Image"
|
||||||
|
echo "═══════════════════════════════════════"
|
||||||
|
|
||||||
REGISTRY="hub.peikarband.ir"
|
REGISTRY="hub.peikarband.ir"
|
||||||
REPO="peikarband/base"
|
BASE_REPO="peikarband/base"
|
||||||
TAG="latest"
|
BASE_TAG="latest"
|
||||||
|
|
||||||
if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \
|
# Login to registry
|
||||||
"https://$REGISTRY/v2/$REPO/manifests/$TAG" > /dev/null 2>&1; then
|
echo "$HARBOR_PASSWORD" | docker login "$REGISTRY" -u "$HARBOR_USERNAME" --password-stdin
|
||||||
echo "✓ Base image found: $REGISTRY/$REPO:$TAG"
|
|
||||||
echo "SKIP_BASE_BUILD=true" > /tmp/base_status
|
# Try to pull base image
|
||||||
else
|
if docker pull "$REGISTRY/$BASE_REPO:$BASE_TAG" 2>/dev/null; then
|
||||||
echo "⚠️ Base image not found - will build it"
|
echo "✅ Base image found in registry"
|
||||||
echo "SKIP_BASE_BUILD=false" > /tmp/base_status
|
echo " Skipping base build (saves ~10 minutes)"
|
||||||
|
exit 0
|
||||||
fi
|
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]
|
secrets: [HARBOR_USERNAME, HARBOR_PASSWORD]
|
||||||
when:
|
|
||||||
event: [push, tag]
|
|
||||||
|
|
||||||
build-base-image:
|
|
||||||
image: woodpeckerci/plugin-docker-buildx
|
|
||||||
settings:
|
|
||||||
registry: hub.peikarband.ir
|
|
||||||
repo: hub.peikarband.ir/peikarband/base
|
|
||||||
username:
|
|
||||||
from_secret: HARBOR_USERNAME
|
|
||||||
password:
|
|
||||||
from_secret: HARBOR_PASSWORD
|
|
||||||
|
|
||||||
dockerfile: docker/Dockerfile.base
|
|
||||||
context: .
|
|
||||||
platforms: linux/amd64
|
|
||||||
|
|
||||||
tags:
|
|
||||||
- latest
|
|
||||||
- python3.11-node20
|
|
||||||
|
|
||||||
build_args:
|
|
||||||
- PYTHON_VERSION=3.11
|
|
||||||
- NODE_VERSION=20
|
|
||||||
|
|
||||||
labels:
|
|
||||||
- org.opencontainers.image.created=${CI_PIPELINE_CREATED}
|
|
||||||
- org.opencontainers.image.source=${CI_REPO_LINK}
|
|
||||||
- org.opencontainers.image.title=Peikarband Base
|
|
||||||
|
|
||||||
pull: true
|
|
||||||
provenance: false
|
|
||||||
push: true
|
|
||||||
|
|
||||||
when:
|
|
||||||
event: [push, tag, manual]
|
|
||||||
# فقط در یکی از این موارد build میشود:
|
|
||||||
# 1. وقتی Dockerfile.base تغییر کند
|
|
||||||
# 2. وقتی در commit message بنویسید: [build-base]
|
|
||||||
# 3. وقتی manual trigger کنید
|
|
||||||
path:
|
|
||||||
include:
|
|
||||||
- docker/Dockerfile.base
|
|
||||||
- .woodpecker.yml
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# Stage 2: Build Application Image
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
build-image:
|
|
||||||
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:
|
|
||||||
- ${CI_COMMIT_SHA:0:8}
|
|
||||||
|
|
||||||
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: false
|
|
||||||
|
|
||||||
when:
|
when:
|
||||||
event: [push, tag]
|
event: [push, tag]
|
||||||
branch: [main, develop, feature/restructure-project]
|
branch: [main, develop, feature/restructure-project]
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# Stage 3: Push Application Image
|
# Stage 2: Build Application Image
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
push-image:
|
build-and-push-app:
|
||||||
image: woodpeckerci/plugin-docker-buildx
|
image: woodpeckerci/plugin-docker-buildx
|
||||||
settings:
|
settings:
|
||||||
registry: hub.peikarband.ir
|
registry: hub.peikarband.ir
|
||||||
@@ -167,7 +107,7 @@ pipeline:
|
|||||||
branch: [main, develop, feature/restructure-project]
|
branch: [main, develop, feature/restructure-project]
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# Stage 4: Verify Push
|
# Stage 3: Verify Push
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
verify-push:
|
verify-push:
|
||||||
@@ -184,7 +124,12 @@ pipeline:
|
|||||||
|
|
||||||
if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \
|
if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \
|
||||||
"https://$REGISTRY/v2/$REPO/manifests/$TAG" > /dev/null 2>&1; then
|
"https://$REGISTRY/v2/$REPO/manifests/$TAG" > /dev/null 2>&1; then
|
||||||
echo "✓ Image verified: $REGISTRY/$REPO:$TAG"
|
echo "✅ Image verified: $REGISTRY/$REPO:$TAG"
|
||||||
|
echo ""
|
||||||
|
echo "Available tags:"
|
||||||
|
echo " - latest"
|
||||||
|
echo " - ${CI_COMMIT_SHA:0:8}"
|
||||||
|
echo " - ${CI_COMMIT_BRANCH}"
|
||||||
else
|
else
|
||||||
echo "❌ Failed to verify image push"
|
echo "❌ Failed to verify image push"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -201,10 +146,15 @@ pipeline:
|
|||||||
notify-success:
|
notify-success:
|
||||||
image: alpine:latest
|
image: alpine:latest
|
||||||
commands:
|
commands:
|
||||||
- echo "🎉 Pipeline completed successfully!"
|
- echo "════════════════════════════════════════"
|
||||||
|
- echo " 🎉 Pipeline Completed Successfully!"
|
||||||
|
- echo "════════════════════════════════════════"
|
||||||
|
- echo ""
|
||||||
- echo "Branch:" "${CI_COMMIT_BRANCH}"
|
- echo "Branch:" "${CI_COMMIT_BRANCH}"
|
||||||
- echo "Commit:" "${CI_COMMIT_SHA:0:8}"
|
- echo "Commit:" "${CI_COMMIT_SHA:0:8}"
|
||||||
- echo "Image:" "hub.peikarband.ir/peikarband/landing:${CI_COMMIT_SHA:0:8}"
|
- echo "Image:" "hub.peikarband.ir/peikarband/landing:${CI_COMMIT_SHA:0:8}"
|
||||||
|
- echo ""
|
||||||
|
- echo "════════════════════════════════════════"
|
||||||
when:
|
when:
|
||||||
event: [push, tag]
|
event: [push, tag]
|
||||||
status: success
|
status: success
|
||||||
@@ -212,10 +162,15 @@ pipeline:
|
|||||||
notify-failure:
|
notify-failure:
|
||||||
image: alpine:latest
|
image: alpine:latest
|
||||||
commands:
|
commands:
|
||||||
- echo "❌ Pipeline failed!"
|
- echo "════════════════════════════════════════"
|
||||||
|
- echo " ❌ Pipeline Failed!"
|
||||||
|
- echo "════════════════════════════════════════"
|
||||||
|
- echo ""
|
||||||
- echo "Branch:" "${CI_COMMIT_BRANCH}"
|
- echo "Branch:" "${CI_COMMIT_BRANCH}"
|
||||||
- echo "Commit:" "${CI_COMMIT_SHA:0:8}"
|
- echo "Commit:" "${CI_COMMIT_SHA:0:8}"
|
||||||
- echo "Please check the logs above"
|
- echo ""
|
||||||
|
- echo "Please check the logs above for details"
|
||||||
|
- echo "════════════════════════════════════════"
|
||||||
when:
|
when:
|
||||||
event: [push, tag]
|
event: [push, tag]
|
||||||
status: failure
|
status: failure
|
||||||
|
|||||||
Reference in New Issue
Block a user