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
|
# 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:
|
||||||
|
|||||||
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
|
.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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user