Compare commits

...

10 Commits

Author SHA1 Message Date
Ehsan.Asadi
f19f60015b feat: improve Makefile help with base image commands
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/manual/woodpecker Pipeline failed
Added:
 Better formatting with emojis
 Base image commands section
 Quick start guide
 Grouped commands logically

Run 'make help' to see all commands!
2025-12-30 22:46:01 +03:30
Ehsan.Asadi
3e3d396409 fix: update Makefile to use correct base image tag
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Base image now uses same repo with 'base' tag:
• hub.peikarband.ir/peikarband/landing:base
• hub.peikarband.ir/peikarband/landing:base-python3.11-node20

App image:
• hub.peikarband.ir/peikarband/landing:latest
• hub.peikarband.ir/peikarband/landing:{version}

All in same repository!
2025-12-30 22:44:49 +03:30
Ehsan.Asadi
cf6fcd4dfe fix: use same repo for base image with different tag
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Solution to 413 Payload Too Large:
 Same repository: peikarband/landing
 Different tags: base, latest, {commit}

Images:
• hub.peikarband.ir/peikarband/landing:base              (base image)
• hub.peikarband.ir/peikarband/landing:latest            (app)
• hub.peikarband.ir/peikarband/landing:{commit}          (app)

No new repo creation, no permission issues!
2025-12-30 22:42:34 +03:30
Ehsan.Asadi
15e664461d fix: build base image in same repo with different tag
Before: hub.peikarband.ir/peikarband/base:latest
After:  hub.peikarband.ir/peikarband/landing:base

This solves the 413 error because:
 Same repository (no new repo creation)
 Just different tags
 No permission/quota issues

Images:
• hub.peikarband.ir/peikarband/landing:base
• hub.peikarband.ir/peikarband/landing:latest
• hub.peikarband.ir/peikarband/landing:{commit}
2025-12-30 22:41:14 +03:30
Ehsan.Asadi
8253fa73de feat: add base image build/push commands to Makefile
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
New commands:
• make docker-build-base  - Build base image locally
• make docker-push-base   - Push base to Harbor
• make docker-build       - Build app (updated to use base)
• make docker-push        - Push app to Harbor

Usage:
  1. make docker-login
  2. make docker-build-base
  3. make docker-push-base
  4. make docker-build
  5. make docker-push
2025-12-30 22:39:04 +03:30
Ehsan.Asadi
fdfca1c4f1 fix: disable provenance and sbom for Harbor compatibility
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Problem:
• 413 Payload Too Large error
• Harbor doesn't handle provenance/sbom metadata well

Solution:
 provenance: false (already was)
 sbom: false (new - disables SBOM generation)
 No cache settings (simpler, more compatible)

This makes images compatible with Harbor registry!
2025-12-30 22:29:14 +03:30
Ehsan.Asadi
a608726db9 fixe ci
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-12-30 22:26:23 +03:30
Ehsan.Asadi
6fe58c3815 feat: add smart base image management to pipeline
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Pipeline now handles base image automatically:

 ensure-base-image:
   • Checks if Dockerfile.base changed
   • Only rebuilds if needed
   • Saves ~10 minutes when unchanged

 build-and-push-app:
   • Uses base image
   • Fast build (~3 minutes)

 verify-images:
   • Confirms both images exist
   • Shows available tags

Behavior:
─────────
1️⃣  Dockerfile.base changed:
    → Build base (~10 min)
    → Build app (~3 min)
    → Total: ~13 min

2️⃣  Only code changed:
    → Skip base (path filter)
    → Build app (~3 min)
    → Total: ~3 min 

This is the smart solution we wanted!
2025-12-30 22:21:17 +03:30
Ehsan.Asadi
826447e9a2 feat: add tini to base image
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/manual/woodpecker Pipeline was successful
Now base image includes:
 Python 3.11
 Node.js 20
 bun, npm
 Build tools (gcc, g++, make)
 Runtime essentials (curl, ca-certificates, git)
 tini (init system)

Runtime Dockerfile needs ZERO apt installs!
2025-12-30 22:17:13 +03:30
Ehsan.Asadi
7c1b8b90ba feat: move tini to base image
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
All dependencies now in base image:
 Python 3.11
 Node.js 20
 bun, npm
 Build tools (gcc, g++, make)
 Runtime essentials (curl, ca-certificates)
 tini (init system)

Result:
• Runtime stage needs ZERO installations
• Just copy files from builder
• Pure base image usage 🚀
2025-12-30 22:16:31 +03:30
4 changed files with 179 additions and 43 deletions

View File

@@ -1,22 +1,72 @@
# Woodpecker CI/CD Pipeline - Peikarband Landing # Woodpecker CI/CD Pipeline - Peikarband Landing
# Simple and efficient pipeline # Smart pipeline with base image management
variables: variables:
- &helm_image 'alpine/helm:latest' - &base_image 'hub.peikarband.ir/peikarband/landing:base'
- &app_image 'hub.peikarband.ir/peikarband/landing'
when: when:
- event: [push, pull_request, tag, manual] - event: [push, pull_request, tag, manual]
pipeline: pipeline:
# ============================================ # ============================================
# Build Application Image (with fallback to python base) # 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
dockerfile: docker/Dockerfile.base
context: .
platforms: linux/amd64
tags:
- base
- base-python3.11-node20
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
pull: true
provenance: false
sbom: false
push: true
when:
event: [push, tag, manual]
branch: [main, develop, feature/restructure-project]
# Only rebuild base if its definition changed
path:
include:
- docker/Dockerfile.base
- .woodpecker.yml
# ============================================
# Build Application Image
# ============================================ # ============================================
build-and-push-app: build-and-push-app:
image: woodpeckerci/plugin-docker-buildx image: woodpeckerci/plugin-docker-buildx
settings: settings:
registry: hub.peikarband.ir registry: hub.peikarband.ir
repo: hub.peikarband.ir/peikarband/landing repo: *app_image
username: username:
from_secret: HARBOR_USERNAME from_secret: HARBOR_USERNAME
password: password:
@@ -27,7 +77,7 @@ pipeline:
platforms: linux/amd64 platforms: linux/amd64
build_args: build_args:
- BASE_IMAGE=hub.peikarband.ir/peikarband/base:latest - BASE_IMAGE=*base_image
- VERSION=${CI_COMMIT_SHA:0:8} - VERSION=${CI_COMMIT_SHA:0:8}
- BUILD_DATE=${CI_PIPELINE_CREATED} - BUILD_DATE=${CI_PIPELINE_CREATED}
@@ -47,6 +97,7 @@ pipeline:
pull: true pull: true
provenance: false provenance: false
sbom: false
push: true push: true
when: when:
@@ -54,33 +105,48 @@ pipeline:
branch: [main, develop, feature/restructure-project] branch: [main, develop, feature/restructure-project]
# ============================================ # ============================================
# Verify Push # Verify Images
# ============================================ # ============================================
verify-push: verify-images:
image: alpine:latest image: alpine:latest
commands: commands:
- apk add --no-cache curl - apk add --no-cache curl
- | - |
echo "Verifying image was pushed successfully..." echo "════════════════════════════════════════"
sleep 3 echo " 🔍 Verifying Images in Registry"
echo "════════════════════════════════════════"
REGISTRY="hub.peikarband.ir" echo ""
REPO="peikarband/landing"
TAG="${CI_COMMIT_SHA:0:8}"
# Check base image
echo "Checking base image..."
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://hub.peikarband.ir/v2/peikarband/landing/manifests/base" > /dev/null 2>&1; then
echo "✅ Image verified: $REGISTRY/$REPO:$TAG" 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 ""
echo "Available tags:" echo "Available tags:"
echo " - latest" echo " latest"
echo " - ${CI_COMMIT_SHA:0:8}" echo " ${CI_COMMIT_SHA:0:8}"
echo " - ${CI_COMMIT_BRANCH}" echo " ${CI_COMMIT_BRANCH}"
echo ""
echo "════════════════════════════════════════"
else else
echo "❌ Failed to verify image push" echo "❌ Failed to verify app image"
exit 1 exit 1
fi fi
secrets: [HARBOR_USERNAME, HARBOR_PASSWORD] secrets: [HARBOR_USERNAME, HARBOR_PASSWORD]
when: when:
event: [push, tag] event: [push, tag]
@@ -99,7 +165,14 @@ pipeline:
- 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 ""
- 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 ""
- echo "════════════════════════════════════════" - echo "════════════════════════════════════════"
when: when:

View File

@@ -10,33 +10,58 @@ DOCKER_BUILDKIT ?= 1
.PHONY: help install dev kill-dev test lint format clean docker-up docker-down migrate .PHONY: help install dev kill-dev test lint format clean docker-up docker-down migrate
help: help:
@echo "Available commands:" @echo "════════════════════════════════════════"
@echo " 📋 Peikarband Landing - Available Commands"
@echo "════════════════════════════════════════"
@echo "" @echo ""
@echo "Development:" @echo "🔧 Development:"
@echo " make install - Install dependencies" @echo " make install - Install dependencies"
@echo " make dev - Run development server" @echo " make dev - Run development server"
@echo " make kill-dev - Kill development server processes (ports 3000 & 8000)" @echo " make kill-dev - Kill development server (ports 3000 & 8000)"
@echo " make test - Run tests" @echo " make test - Run tests"
@echo " make lint - Run linters" @echo " make lint - Run linters"
@echo " make format - Format code" @echo " make format - Format code"
@echo " make clean - Clean temporary files" @echo " make clean - Clean temporary files"
@echo "" @echo ""
@echo "Docker:" @echo "🐳 Docker - Base Image:"
@echo " make docker-build - Build Docker image" @echo " make docker-build-base - Build base image (Python + Node.js + bun)"
@echo " make docker-push - Push Docker image" @echo " make docker-push-base - Push base image to Harbor"
@echo ""
@echo "🐳 Docker - Application:"
@echo " make docker-build - Build application image"
@echo " make docker-push - Push application image to Harbor"
@echo " make docker-login - Login to Harbor registry"
@echo " make docker-up - Start Docker Compose" @echo " make docker-up - Start Docker Compose"
@echo " make docker-down - Stop Docker Compose" @echo " make docker-down - Stop Docker Compose"
@echo "" @echo ""
@echo "Kubernetes/Helm:" @echo "☸️ Kubernetes/Helm:"
@echo " make helm-lint - Lint Helm chart" @echo " make helm-lint - Lint Helm chart"
@echo " make helm-package - Package Helm chart" @echo " make helm-package - Package Helm chart"
@echo " make helm-install - Install Helm chart" @echo " make helm-install - Install Helm chart"
@echo " make helm-upgrade - Upgrade Helm chart" @echo " make helm-upgrade - Upgrade Helm chart"
@echo " make helm-uninstall - Uninstall Helm chart" @echo " make helm-uninstall - Uninstall Helm chart"
@echo " make k8s-deploy - Deploy to Kubernetes" @echo " make k8s-deploy - Full deployment pipeline"
@echo "" @echo ""
@echo "Database:" @echo "🗄️ Database:"
@echo " make migrate - Run database migrations" @echo " make migrate - Run database migrations"
@echo " make seed - Seed database with initial data"
@echo ""
@echo "════════════════════════════════════════"
@echo " Quick Start:"
@echo "════════════════════════════════════════"
@echo ""
@echo "1⃣ Build & Push Base (once):"
@echo " make docker-login"
@echo " make docker-build-base"
@echo " make docker-push-base"
@echo ""
@echo "2⃣ Build & Push App:"
@echo " make docker-build"
@echo " make docker-push"
@echo ""
@echo "3⃣ Deploy:"
@echo " make k8s-deploy"
@echo ""
install: install:
pip install -r requirements.txt pip install -r requirements.txt
@@ -76,24 +101,64 @@ clean:
rm -rf dist/ rm -rf dist/
# Docker commands # Docker commands
docker-build-base:
@echo "════════════════════════════════════════"
@echo " 🔨 Building Base Image"
@echo "════════════════════════════════════════"
DOCKER_BUILDKIT=$(DOCKER_BUILDKIT) docker buildx build \
-f docker/Dockerfile.base \
-t hub.peikarband.ir/peikarband/landing:base \
-t hub.peikarband.ir/peikarband/landing:base-python3.11-node20 \
--build-arg PYTHON_VERSION=3.11 \
--build-arg NODE_VERSION=20 \
--platform linux/amd64 \
--load \
.
@echo ""
@echo "✅ Base image built: hub.peikarband.ir/peikarband/landing:base"
@echo ""
docker-push-base:
@echo "════════════════════════════════════════"
@echo " 📤 Pushing Base Image"
@echo "════════════════════════════════════════"
docker push hub.peikarband.ir/peikarband/landing:base
docker push hub.peikarband.ir/peikarband/landing:base-python3.11-node20
@echo ""
@echo "✅ Base image pushed successfully!"
@echo ""
docker-build: docker-build:
DOCKER_BUILDKIT=$(DOCKER_BUILDKIT) docker build \ @echo "════════════════════════════════════════"
@echo " 🔨 Building Application Image"
@echo "════════════════════════════════════════"
DOCKER_BUILDKIT=$(DOCKER_BUILDKIT) docker buildx build \
-f docker/Dockerfile \ -f docker/Dockerfile \
-t $(IMAGE_NAME):$(VERSION) \ -t hub.peikarband.ir/peikarband/landing:$(VERSION) \
-t $(IMAGE_NAME):latest \ -t hub.peikarband.ir/peikarband/landing:latest \
--build-arg BASE_IMAGE=hub.peikarband.ir/peikarband/landing:base \
--build-arg VERSION=$(VERSION) \ --build-arg VERSION=$(VERSION) \
--build-arg BUILD_DATE=$(shell date -u +'%Y-%m-%dT%H:%M:%SZ') \ --build-arg BUILD_DATE=$(shell date -u +'%Y-%m-%dT%H:%M:%SZ') \
--platform linux/amd64 \
--load \
. .
@echo ""
@echo "✅ Application image built: hub.peikarband.ir/peikarband/landing:$(VERSION)"
@echo ""
docker-push: docker-push:
docker tag $(IMAGE_NAME):$(VERSION) $(REGISTRY)/$(IMAGE_NAME):$(VERSION) @echo "════════════════════════════════════════"
docker tag $(IMAGE_NAME):$(VERSION) $(REGISTRY)/$(IMAGE_NAME):latest @echo " 📤 Pushing Application Image"
docker push $(REGISTRY)/$(IMAGE_NAME):$(VERSION) @echo "════════════════════════════════════════"
docker push $(REGISTRY)/$(IMAGE_NAME):latest docker push hub.peikarband.ir/peikarband/landing:$(VERSION)
docker push hub.peikarband.ir/peikarband/landing:latest
@echo ""
@echo "✅ Application image pushed successfully!"
@echo ""
docker-login: docker-login:
@echo "Logging in to Harbor registry..." @echo "Logging in to Harbor registry..."
@docker login $(REGISTRY) @docker login hub.peikarband.ir
docker-up: docker-up:
docker-compose -f docker/docker-compose.yml up -d docker-compose -f docker/docker-compose.yml up -d

View File

@@ -84,15 +84,12 @@ RUN groupadd -r peikarband && \
WORKDIR /app WORKDIR /app
# Base image already has: # Base image already has everything we need:
# - Python 3.11 # - Python 3.11
# - Node.js 20 # - Node.js 20
# - curl, ca-certificates # - curl, ca-certificates
# Just need to add tini for proper init # - tini (for proper init)
RUN apt-get update && apt-get install -y --no-install-recommends \ # No additional packages needed!
tini \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
# Copy Python dependencies from builder # Copy Python dependencies from builder
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages

View File

@@ -28,6 +28,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \ ca-certificates \
unzip \ unzip \
git \ git \
tini \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# Install Node.js # Install Node.js