Files
kulakpos_web/.gitea/workflows/pipeline.yml
eko c16631045f
Some checks failed
Build, Push and Deploy / build-and-push (push) Failing after 9s
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 8s
Build, Push and Deploy / deploy-staging (push) Has been skipped
Build, Push and Deploy / deploy-production (push) Has been skipped
Build, Push and Deploy / cleanup (push) Successful in 4s
add prod pipeline
2026-03-29 04:36:14 +07:00

221 lines
8.4 KiB
YAML

name: Build, Push and Deploy
on:
push:
branches: [ main, master ]
workflow_dispatch:
inputs:
deploy_to_production:
description: 'Deploy to Production?'
required: true
default: 'no'
type: choice
options:
- 'yes'
- 'no'
image_tag:
description: 'Image tag to deploy (optional, uses latest if empty)'
required: false
type: string
jobs:
build-and-push:
runs-on: ubuntu-latest
outputs:
image_tag: ${{ steps.vars.outputs.image_tag }}
image_sha: ${{ steps.vars.outputs.image_sha }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set variables
id: vars
run: |
echo "image_tag=$(echo ${{ gitea.sha }} | cut -c1-8)" >> $GITEa_OUTPUT
echo "image_sha=${{ gitea.sha }}" >> $GITEa_OUTPUT
echo "build_time=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> $GITEa_OUTPUT
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Gitea Registry
uses: docker/login-action@v3
with:
registry: kode.sadateknologi.site
username: ${{ gitea.repository_owner }}
password: ${{ secrets.REGISTRY_TOKEN }}
- name: Build and push image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
kode.sadateknologi.site/${{ gitea.repository_owner }}/kulakpos_web:latest
kode.sadateknologi.site/${{ gitea.repository_owner }}/kulakpos_web:${{ gitea.sha }}
kode.sadateknologi.site/${{ gitea.repository_owner }}/kulakpos_web:${{ steps.vars.outputs.image_tag }}
labels: |
org.opencontainers.image.created=${{ steps.vars.outputs.build_time }}
org.opencontainers.image.revision=${{ gitea.sha }}
org.opencontainers.image.version=${{ steps.vars.outputs.image_tag }}
deploy-staging:
runs-on: ubuntu-latest
needs: build-and-push
if: gitea.event_name == 'push' && (gitea.ref == 'refs/heads/main' || gitea.ref == 'refs/heads/master')
steps:
- name: Deploy to Staging (Local)
run: |
echo "🚀 Starting staging deployment on local server..."
# Pull the latest image
echo "Pulling image: kode.sadateknologi.site/${{ gitea.repository_owner }}/kulakpos_web:latest"
docker pull kode.sadateknologi.site/${{ gitea.repository_owner }}/kulakpos_web:latest
# Stop and remove existing container
echo "Stopping existing container..."
docker stop kulakpos_web_staging || true
docker rm kulakpos_web_staging || true
# Clean up old images (keep last 5)
docker image prune -f
# Run new container
echo "Starting new container..."
docker run -d \
--restart unless-stopped \
--health-cmd="curl -f http://localhost:8000 || exit 1" \
--health-interval=30s \
--health-timeout=10s \
--health-retries=3 \
--name kulakpos_web_staging \
--network="host" \
-v /opt/kulakpos/staging/.env:/var/www/html/.env \
-p 8000:8000 \
-e MODE=staging \
-e APP_ENV=staging \
kode.sadateknologi.site/${{ gitea.repository_owner }}/kulakpos_web:latest
# Check if container is running
sleep 5
if docker ps | grep -q kulakpos_web_staging; then
echo "✅ Staging deployment successful!"
docker logs --tail 20 kulakpos_web_staging
else
echo "❌ Staging deployment failed! Check logs:"
docker logs kulakpos_web_staging || echo "No logs available"
exit 1
fi
- name: Verify Staging Deployment
run: |
curl -f http://localhost:8000/health || curl -f http://localhost:8000 || echo 'Health check endpoint not found, but service may be running'
echo "✅ Staging deployment verified!"
deploy-production:
runs-on: ubuntu-latest
needs: build-and-push
if: gitea.event_name == 'workflow_dispatch' && gitea.event.inputs.deploy_to_production == 'yes'
environment: production
steps:
- name: Determine image tag for production
id: prod_image
run: |
if [ -n "${{ gitea.event.inputs.image_tag }}" ]; then
echo "image_tag=${{ gitea.event.inputs.image_tag }}" >> $GITEa_OUTPUT
else
echo "image_tag=latest" >> $GITEa_OUTPUT
fi
- name: Deploy to Production Server
run: |
ssh kulakpos_prod << 'EOF'
IMAGE_TAG="${{ steps.prod_image.outputs.image_tag }}"
echo "🚀 Starting production deployment with image tag: $IMAGE_TAG"
# Show current deployment
echo "Current production container:"
docker ps --filter name=kulakpos_web_prod
# Create backup of current deployment info
docker inspect kulakpos_web_prod > /tmp/kulakpos_backup_$(date +%Y%m%d_%H%M%S).json || true
# Pull the specified image
echo "Pulling image: kode.sadateknologi.site/${{ gitea.repository_owner }}/kulakpos_web:$IMAGE_TAG"
docker pull kode.sadateknologi.site/${{ gitea.repository_owner }}/kulakpos_web:$IMAGE_TAG
# Stop and remove existing container
echo "Stopping existing container..."
docker stop kulakpos_web_prod || true
docker rm kulakpos_web_prod || true
# Run new container
echo "Starting new container..."
docker run -d \
--restart unless-stopped \
--health-cmd="curl -f http://localhost:8000 || exit 1" \
--health-interval=30s \
--health-timeout=10s \
--health-retries=3 \
--name kulakpos_web_prod \
--network="host" \
-v /opt/kulakpos/.env:/var/www/html/.env \
-p 8000:8000 \
-e MODE=prod \
-e APP_ENV=production \
kode.sadateknologi.site/${{ gitea.repository_owner }}/kulakpos_web:$IMAGE_TAG
# Check if container is running
sleep 10
if docker ps | grep -q kulakpos_web_prod; then
echo "✅ Production deployment successful!"
echo "Container logs (last 20 lines):"
docker logs --tail 20 kulakpos_web_prod
else
echo "❌ Production deployment failed! Checking logs:"
docker logs kulakpos_web_prod || echo "No logs available"
# Attempt rollback to previous version if available
echo "Attempting rollback to previous version..."
PREVIOUS_IMAGE=$(docker inspect kulakpos_web_prod --format='{{.Config.Image}}' 2>/dev/null || echo "")
if [ -n "$PREVIOUS_IMAGE" ] && [ "$PREVIOUS_IMAGE" != "kode.sadateknologi.site/${{ gitea.repository_owner }}/kulakpos_web:$IMAGE_TAG" ]; then
docker run -d \
--restart unless-stopped \
--name kulakpos_web_prod \
--network="host" \
-v /opt/kulakpos/.env:/var/www/html/.env \
-p 8000:8000 \
-e MODE=prod \
-e APP_ENV=production \
$PREVIOUS_IMAGE
echo "Rollback attempted"
fi
exit 1
fi
EOF
- name: Verify Production Deployment
run: |
ssh kulakpos_prod "curl -f http://localhost:8000/health || curl -f http://localhost:8000 || echo 'Service is running but health check endpoint not configured'"
echo "✅ Production deployment verified!"
- name: Send Deployment Notification
if: always()
run: |
STATUS="${{ job.status }}"
if [ "$STATUS" = "success" ]; then
echo "✅ Production deployment completed successfully!"
else
echo "❌ Production deployment failed!"
exit 1
fi
cleanup:
runs-on: ubuntu-latest
needs: [deploy-staging, deploy-production]
if: always()
steps:
- name: Cleanup old Docker images on runners
run: |
docker system prune -f --filter "until=24h"