Compare commits
10 Commits
82af967dfc
...
feature/re
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f19f60015b | ||
|
|
3e3d396409 | ||
|
|
cf6fcd4dfe | ||
|
|
15e664461d | ||
|
|
8253fa73de | ||
|
|
fdfca1c4f1 | ||
|
|
a608726db9 | ||
|
|
6fe58c3815 | ||
|
|
826447e9a2 | ||
|
|
7c1b8b90ba |
113
.woodpecker.yml
113
.woodpecker.yml
@@ -1,22 +1,72 @@
|
||||
# Woodpecker CI/CD Pipeline - Peikarband Landing
|
||||
# Simple and efficient pipeline
|
||||
# Smart pipeline with base image management
|
||||
|
||||
variables:
|
||||
- &helm_image 'alpine/helm:latest'
|
||||
- &base_image 'hub.peikarband.ir/peikarband/landing:base'
|
||||
- &app_image 'hub.peikarband.ir/peikarband/landing'
|
||||
|
||||
when:
|
||||
- event: [push, pull_request, tag, manual]
|
||||
|
||||
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:
|
||||
image: woodpeckerci/plugin-docker-buildx
|
||||
settings:
|
||||
registry: hub.peikarband.ir
|
||||
repo: hub.peikarband.ir/peikarband/landing
|
||||
repo: *app_image
|
||||
username:
|
||||
from_secret: HARBOR_USERNAME
|
||||
password:
|
||||
@@ -27,7 +77,7 @@ pipeline:
|
||||
platforms: linux/amd64
|
||||
|
||||
build_args:
|
||||
- BASE_IMAGE=hub.peikarband.ir/peikarband/base:latest
|
||||
- BASE_IMAGE=*base_image
|
||||
- VERSION=${CI_COMMIT_SHA:0:8}
|
||||
- BUILD_DATE=${CI_PIPELINE_CREATED}
|
||||
|
||||
@@ -47,6 +97,7 @@ pipeline:
|
||||
|
||||
pull: true
|
||||
provenance: false
|
||||
sbom: false
|
||||
push: true
|
||||
|
||||
when:
|
||||
@@ -54,33 +105,48 @@ pipeline:
|
||||
branch: [main, develop, feature/restructure-project]
|
||||
|
||||
# ============================================
|
||||
# Verify Push
|
||||
# Verify Images
|
||||
# ============================================
|
||||
|
||||
verify-push:
|
||||
verify-images:
|
||||
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}"
|
||||
echo "════════════════════════════════════════"
|
||||
echo " 🔍 Verifying Images in Registry"
|
||||
echo "════════════════════════════════════════"
|
||||
echo ""
|
||||
|
||||
# Check base image
|
||||
echo "Checking base image..."
|
||||
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"
|
||||
"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 " • latest"
|
||||
echo " • ${CI_COMMIT_SHA:0:8}"
|
||||
echo " • ${CI_COMMIT_BRANCH}"
|
||||
echo ""
|
||||
echo "════════════════════════════════════════"
|
||||
else
|
||||
echo "❌ Failed to verify image push"
|
||||
echo "❌ Failed to verify app image"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
secrets: [HARBOR_USERNAME, HARBOR_PASSWORD]
|
||||
when:
|
||||
event: [push, tag]
|
||||
@@ -99,7 +165,14 @@ pipeline:
|
||||
- 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 "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:
|
||||
|
||||
99
Makefile
99
Makefile
@@ -10,33 +10,58 @@ DOCKER_BUILDKIT ?= 1
|
||||
.PHONY: help install dev kill-dev test lint format clean docker-up docker-down migrate
|
||||
|
||||
help:
|
||||
@echo "Available commands:"
|
||||
@echo "════════════════════════════════════════"
|
||||
@echo " 📋 Peikarband Landing - Available Commands"
|
||||
@echo "════════════════════════════════════════"
|
||||
@echo ""
|
||||
@echo "Development:"
|
||||
@echo "🔧 Development:"
|
||||
@echo " make install - Install dependencies"
|
||||
@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 lint - Run linters"
|
||||
@echo " make format - Format code"
|
||||
@echo " make clean - Clean temporary files"
|
||||
@echo ""
|
||||
@echo "Docker:"
|
||||
@echo " make docker-build - Build Docker image"
|
||||
@echo " make docker-push - Push Docker image"
|
||||
@echo "🐳 Docker - Base Image:"
|
||||
@echo " make docker-build-base - Build base image (Python + Node.js + bun)"
|
||||
@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-down - Stop Docker Compose"
|
||||
@echo ""
|
||||
@echo "Kubernetes/Helm:"
|
||||
@echo "☸️ Kubernetes/Helm:"
|
||||
@echo " make helm-lint - Lint Helm chart"
|
||||
@echo " make helm-package - Package Helm chart"
|
||||
@echo " make helm-install - Install Helm chart"
|
||||
@echo " make helm-upgrade - Upgrade 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 "Database:"
|
||||
@echo "🗄️ Database:"
|
||||
@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:
|
||||
pip install -r requirements.txt
|
||||
@@ -76,24 +101,64 @@ clean:
|
||||
rm -rf dist/
|
||||
|
||||
# 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_BUILDKIT=$(DOCKER_BUILDKIT) docker build \
|
||||
@echo "════════════════════════════════════════"
|
||||
@echo " 🔨 Building Application Image"
|
||||
@echo "════════════════════════════════════════"
|
||||
DOCKER_BUILDKIT=$(DOCKER_BUILDKIT) docker buildx build \
|
||||
-f docker/Dockerfile \
|
||||
-t $(IMAGE_NAME):$(VERSION) \
|
||||
-t $(IMAGE_NAME):latest \
|
||||
-t hub.peikarband.ir/peikarband/landing:$(VERSION) \
|
||||
-t hub.peikarband.ir/peikarband/landing:latest \
|
||||
--build-arg BASE_IMAGE=hub.peikarband.ir/peikarband/landing:base \
|
||||
--build-arg VERSION=$(VERSION) \
|
||||
--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 tag $(IMAGE_NAME):$(VERSION) $(REGISTRY)/$(IMAGE_NAME):$(VERSION)
|
||||
docker tag $(IMAGE_NAME):$(VERSION) $(REGISTRY)/$(IMAGE_NAME):latest
|
||||
docker push $(REGISTRY)/$(IMAGE_NAME):$(VERSION)
|
||||
docker push $(REGISTRY)/$(IMAGE_NAME):latest
|
||||
@echo "════════════════════════════════════════"
|
||||
@echo " 📤 Pushing Application Image"
|
||||
@echo "════════════════════════════════════════"
|
||||
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:
|
||||
@echo "Logging in to Harbor registry..."
|
||||
@docker login $(REGISTRY)
|
||||
@docker login hub.peikarband.ir
|
||||
|
||||
docker-up:
|
||||
docker-compose -f docker/docker-compose.yml up -d
|
||||
|
||||
@@ -84,15 +84,12 @@ RUN groupadd -r peikarband && \
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Base image already has:
|
||||
# Base image already has everything we need:
|
||||
# - Python 3.11
|
||||
# - Node.js 20
|
||||
# - curl, ca-certificates
|
||||
# Just need to add tini for proper init
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
tini \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& apt-get clean
|
||||
# - tini (for proper init)
|
||||
# No additional packages needed!
|
||||
|
||||
# Copy Python dependencies from builder
|
||||
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
|
||||
|
||||
@@ -28,6 +28,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ca-certificates \
|
||||
unzip \
|
||||
git \
|
||||
tini \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install Node.js
|
||||
|
||||
Reference in New Issue
Block a user