feat(cicd): switch CI/CD from GitHub Actions to Gitea Actions
Some checks failed
Build & Deploy to K8s / build-and-deploy (push) Failing after 15s
Some checks failed
Build & Deploy to K8s / build-and-deploy (push) Failing after 15s
- Add .gitea/workflows/deploy.yaml (detect changes → docker build → Harbor push → kubectl deploy) - Add gitea-sync-cronjob.yaml (GitHub → Gitea mirror sync every 5 min) - Add act-runner-rbac.yaml (RBAC for act_runner to deploy to staging namespace) - Add setup-secrets.sh (one-time cluster secret setup script) - Disable GitHub Actions deploy-staging.yml (CI/CD now via Gitea) Flow: GitHub push → Gitea sync (5min) → Gitea Actions → Docker build → Harbor → K8s Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
223
.gitea/workflows/deploy.yaml
Normal file
223
.gitea/workflows/deploy.yaml
Normal file
@@ -0,0 +1,223 @@
|
||||
# EN: Build & Deploy GoodGo Platform to K8s staging via Gitea Actions
|
||||
# VI: Build & Deploy GoodGo Platform len K8s staging qua Gitea Actions
|
||||
#
|
||||
# Flow: Push → detect changed services → docker build → push Harbor → kubectl deploy
|
||||
# Runner: act_runner (host mode, in-cluster kubectl)
|
||||
|
||||
name: Build & Deploy to K8s
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master, main]
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Clone source from GitHub
|
||||
run: |
|
||||
git clone --depth 2 --branch ${{ github.ref_name }} \
|
||||
https://admin:Velik%402026@gitea.techbi.org/admin/pos-system.git .
|
||||
|
||||
- name: Detect changed services
|
||||
run: |
|
||||
IMAGE_TAG=$(echo "${{ github.sha }}" | cut -c1-7)
|
||||
echo "IMAGE_TAG=${IMAGE_TAG}" >> $GITHUB_ENV
|
||||
|
||||
CHANGED=$(git diff --name-only HEAD~1 HEAD 2>/dev/null || echo "ALL")
|
||||
|
||||
SERVICES=""
|
||||
|
||||
check_change() {
|
||||
local path="$1"
|
||||
local name="$2"
|
||||
if echo "$CHANGED" | grep -q "^${path}/" || echo "$CHANGED" | grep -q "ALL"; then
|
||||
SERVICES="${SERVICES} ${name}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Core services
|
||||
check_change "services/iam-service-net" "iam-service"
|
||||
check_change "services/merchant-service-net" "merchant-service"
|
||||
check_change "services/order-service-net" "order-service"
|
||||
check_change "services/fnb-engine-net" "fnb-engine"
|
||||
check_change "services/catalog-service-net" "catalog-service"
|
||||
check_change "services/inventory-service-net" "inventory-service"
|
||||
check_change "services/wallet-service-net" "wallet-service"
|
||||
check_change "services/storage-service-net" "storage-service"
|
||||
check_change "services/booking-service-net" "booking-service"
|
||||
check_change "services/chat-service-net" "chat-service"
|
||||
check_change "services/social-service-net" "social-service"
|
||||
check_change "services/promotion-service-net" "promotion-service"
|
||||
check_change "services/membership-service-net" "membership-service"
|
||||
check_change "services/mining-service-net" "mining-service"
|
||||
check_change "services/mission-service-net" "mission-service"
|
||||
|
||||
# Ads services
|
||||
check_change "services/ads-manager-service-net" "ads-manager-service"
|
||||
check_change "services/ads-serving-service-net" "ads-serving-service"
|
||||
check_change "services/ads-billing-service-net" "ads-billing-service"
|
||||
check_change "services/ads-tracking-service-net" "ads-tracking-service"
|
||||
check_change "services/ads-analytics-service-net" "ads-analytics-service"
|
||||
|
||||
# Marketing services
|
||||
check_change "services/mkt-facebook-service-net" "mkt-facebook-service"
|
||||
check_change "services/mkt-whatsapp-service-net" "mkt-whatsapp-service"
|
||||
check_change "services/mkt-x-service-net" "mkt-x-service"
|
||||
check_change "services/mkt-zalo-service-net" "mkt-zalo-service"
|
||||
|
||||
# Frontend
|
||||
check_change "apps/web-client-tpos-net" "pos-web"
|
||||
|
||||
# If K8s configs changed, flag for config deploy
|
||||
if echo "$CHANGED" | grep -q "^deployments/staging/"; then
|
||||
SERVICES="${SERVICES} __k8s_config__"
|
||||
fi
|
||||
|
||||
echo "CHANGED_SERVICES=${SERVICES}" >> $GITHUB_ENV
|
||||
echo "Changed services: ${SERVICES:-none}"
|
||||
|
||||
- name: Build and push changed services
|
||||
run: |
|
||||
if [ -z "$CHANGED_SERVICES" ]; then
|
||||
echo "No services changed, skipping build"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
HARBOR="harbor.techbi.org"
|
||||
PROJECT="goodgo"
|
||||
|
||||
echo "${{ secrets.HARBOR_PASSWORD }}" | docker login "${HARBOR}" -u "${{ secrets.HARBOR_USERNAME }}" --password-stdin
|
||||
|
||||
build_service() {
|
||||
local name="$1"
|
||||
local context="$2"
|
||||
local image="${HARBOR}/${PROJECT}/${name}-net"
|
||||
|
||||
echo "=== Building ${name} ==="
|
||||
docker build -t "${image}:${IMAGE_TAG}" -t "${image}:latest" "${context}"
|
||||
docker push "${image}:${IMAGE_TAG}"
|
||||
docker push "${image}:latest"
|
||||
echo "=== ${name} pushed ==="
|
||||
}
|
||||
|
||||
for svc in $CHANGED_SERVICES; do
|
||||
case "$svc" in
|
||||
iam-service) build_service "iam-service" "./services/iam-service-net" ;;
|
||||
merchant-service) build_service "merchant-service" "./services/merchant-service-net" ;;
|
||||
order-service) build_service "order-service" "./services/order-service-net" ;;
|
||||
fnb-engine) build_service "fnb-engine" "./services/fnb-engine-net" ;;
|
||||
catalog-service) build_service "catalog-service" "./services/catalog-service-net" ;;
|
||||
inventory-service) build_service "inventory-service" "./services/inventory-service-net" ;;
|
||||
wallet-service) build_service "wallet-service" "./services/wallet-service-net" ;;
|
||||
storage-service) build_service "storage-service" "./services/storage-service-net" ;;
|
||||
booking-service) build_service "booking-service" "./services/booking-service-net" ;;
|
||||
chat-service) build_service "chat-service" "./services/chat-service-net" ;;
|
||||
social-service) build_service "social-service" "./services/social-service-net" ;;
|
||||
promotion-service) build_service "promotion-service" "./services/promotion-service-net" ;;
|
||||
membership-service) build_service "membership-service" "./services/membership-service-net" ;;
|
||||
mining-service) build_service "mining-service" "./services/mining-service-net" ;;
|
||||
mission-service) build_service "mission-service" "./services/mission-service-net" ;;
|
||||
ads-manager-service) build_service "ads-manager-service" "./services/ads-manager-service-net" ;;
|
||||
ads-serving-service) build_service "ads-serving-service" "./services/ads-serving-service-net" ;;
|
||||
ads-billing-service) build_service "ads-billing-service" "./services/ads-billing-service-net" ;;
|
||||
ads-tracking-service) build_service "ads-tracking-service" "./services/ads-tracking-service-net" ;;
|
||||
ads-analytics-service) build_service "ads-analytics-service" "./services/ads-analytics-service-net" ;;
|
||||
mkt-facebook-service) build_service "mkt-facebook-service" "./services/mkt-facebook-service-net" ;;
|
||||
mkt-whatsapp-service) build_service "mkt-whatsapp-service" "./services/mkt-whatsapp-service-net" ;;
|
||||
mkt-x-service) build_service "mkt-x-service" "./services/mkt-x-service-net" ;;
|
||||
mkt-zalo-service) build_service "mkt-zalo-service" "./services/mkt-zalo-service-net" ;;
|
||||
pos-web) build_service "web-client-tpos" "./apps/web-client-tpos-net" ;;
|
||||
__k8s_config__) echo "K8s config changed, will apply manifests" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
- name: Deploy to K8s
|
||||
run: |
|
||||
if [ -z "$CHANGED_SERVICES" ]; then
|
||||
echo "No services changed, skipping deploy"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
HARBOR="harbor.techbi.org"
|
||||
PROJECT="goodgo"
|
||||
NS="staging"
|
||||
|
||||
# Apply K8s configs if changed
|
||||
if echo "$CHANGED_SERVICES" | grep -q "__k8s_config__"; then
|
||||
echo "=== Applying K8s configs ==="
|
||||
kubectl apply -f deployments/staging/kubernetes/namespace.yaml
|
||||
kubectl apply -f deployments/staging/kubernetes/configmap.yaml
|
||||
kubectl apply -f deployments/staging/kubernetes/redis.yaml
|
||||
kubectl apply -f deployments/staging/kubernetes/rabbitmq.yaml
|
||||
kubectl apply -f deployments/staging/kubernetes/minio.yaml
|
||||
kubectl apply -f deployments/staging/kubernetes/ingress.yaml
|
||||
kubectl apply -f deployments/staging/kubernetes/network-policy.yaml
|
||||
fi
|
||||
|
||||
deploy_service() {
|
||||
local name="$1"
|
||||
local image_name="$2"
|
||||
local manifest="$3"
|
||||
local image="${HARBOR}/${PROJECT}/${image_name}:${IMAGE_TAG}"
|
||||
|
||||
echo "=== Deploying ${name} ==="
|
||||
kubectl apply -f "deployments/staging/kubernetes/${manifest}"
|
||||
kubectl set image "deployment/${name}" "${name}=${image}" -n "${NS}"
|
||||
kubectl patch deployment "${name}" -n "${NS}" \
|
||||
-p '{"spec":{"template":{"spec":{"imagePullSecrets":[{"name":"harbor-pull-secret"}],"containers":[{"name":"'"${name}"'","imagePullPolicy":"Always"}]}}}}'
|
||||
fi
|
||||
|
||||
for svc in $CHANGED_SERVICES; do
|
||||
case "$svc" in
|
||||
iam-service) deploy_service "iam-service" "iam-service-net" "iam-service.yaml" ;;
|
||||
merchant-service) deploy_service "merchant-service" "merchant-service-net" "merchant-service.yaml" ;;
|
||||
order-service) deploy_service "order-service" "order-service-net" "order-service.yaml" ;;
|
||||
fnb-engine) deploy_service "fnb-engine" "fnb-engine-net" "fnb-engine.yaml" ;;
|
||||
catalog-service) deploy_service "catalog-service" "catalog-service-net" "catalog-service.yaml" ;;
|
||||
inventory-service) deploy_service "inventory-service" "inventory-service-net" "inventory-service.yaml" ;;
|
||||
wallet-service) deploy_service "wallet-service" "wallet-service-net" "wallet-service.yaml" ;;
|
||||
storage-service) deploy_service "storage-service" "storage-service-net" "storage-service.yaml" ;;
|
||||
booking-service) deploy_service "booking-service" "booking-service-net" "booking-service.yaml" ;;
|
||||
chat-service) deploy_service "chat-service" "chat-service-net" "chat-service.yaml" ;;
|
||||
social-service) deploy_service "social-service" "social-service-net" "social-service.yaml" ;;
|
||||
promotion-service) deploy_service "promotion-service" "promotion-service-net" "promotion-service.yaml" ;;
|
||||
membership-service) deploy_service "membership-service" "membership-service-net" "membership-service.yaml" ;;
|
||||
mining-service) deploy_service "mining-service" "mining-service-net" "mining-service.yaml" ;;
|
||||
mission-service) deploy_service "mission-service" "mission-service-net" "mission-service.yaml" ;;
|
||||
ads-manager-service) deploy_service "ads-manager-service" "ads-manager-service-net" "ads-manager-service.yaml" ;;
|
||||
ads-serving-service) deploy_service "ads-serving-service" "ads-serving-service-net" "ads-serving-service.yaml" ;;
|
||||
ads-billing-service) deploy_service "ads-billing-service" "ads-billing-service-net" "ads-billing-service.yaml" ;;
|
||||
ads-tracking-service) deploy_service "ads-tracking-service" "ads-tracking-service-net" "ads-tracking-service.yaml" ;;
|
||||
ads-analytics-service) deploy_service "ads-analytics-service" "ads-analytics-service-net" "ads-analytics-service.yaml" ;;
|
||||
mkt-facebook-service) deploy_service "mkt-facebook-service" "mkt-facebook-service-net" "mkt-facebook-service.yaml" ;;
|
||||
mkt-whatsapp-service) deploy_service "mkt-whatsapp-service" "mkt-whatsapp-service-net" "mkt-whatsapp-service.yaml" ;;
|
||||
mkt-x-service) deploy_service "mkt-x-service" "mkt-x-service-net" "mkt-x-service.yaml" ;;
|
||||
mkt-zalo-service) deploy_service "mkt-zalo-service" "mkt-zalo-service-net" "mkt-zalo-service.yaml" ;;
|
||||
pos-web) deploy_service "pos-web" "web-client-tpos-net" "pos-web.yaml" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Wait for rollouts
|
||||
FAILED=0
|
||||
for svc in $CHANGED_SERVICES; do
|
||||
if [ "$svc" = "__k8s_config__" ]; then continue; fi
|
||||
SVC_NAME="$svc"
|
||||
if [ "$svc" = "pos-web" ]; then SVC_NAME="pos-web"; fi
|
||||
echo "Waiting for ${SVC_NAME}..."
|
||||
if ! kubectl rollout status "deployment/${SVC_NAME}" -n "${NS}" --timeout=180s 2>/dev/null; then
|
||||
echo "WARNING: ${SVC_NAME} rollout did not complete"
|
||||
FAILED=$((FAILED + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "=== Deployment Summary ==="
|
||||
kubectl get pods -n "${NS}" -o wide
|
||||
echo ""
|
||||
kubectl get svc -n "${NS}"
|
||||
|
||||
if [ $FAILED -gt 0 ]; then
|
||||
echo "WARNING: ${FAILED} service(s) did not complete rollout"
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user