odex25_standard/.github/workflows/deploy-manager.yml

165 lines
5.7 KiB
YAML

name: Hydra Deployment Manager (Odoo 14)
on:
push:
branches:
- 'dev_**'
- 'preprod_**'
# - 'master_**' # ❌ Disabled auto-push to master (Production is Manual only as requested)
workflow_dispatch:
inputs:
target_env:
description: 'Target Environment'
required: true
type: choice
options:
- dev
- preprod
- prod
default: 'dev'
specific_host:
description: 'Specific Server IP (Optional)'
required: false
type: string
default: ''
force_restart:
description: 'Force Service Restart'
required: true
type: boolean
default: true
jobs:
deploy:
runs-on: ubuntu-latest
name: Deploy
steps:
- name: Extract Context
id: context
run: |
REF_NAME=${{ github.ref_name }}
EVENT_NAME=${{ github.event_name }}
INPUT_ENV=${{ inputs.target_env }}
echo "Processing Event: $EVENT_NAME on Ref: $REF_NAME"
# Default values
ENV=""
MODULE=""
PORT=""
# Logic:
# 1. PUSH EVENT (Auto)
if [ "$EVENT_NAME" == "push" ]; then
if [[ "$REF_NAME" == dev_* ]]; then
ENV="dev"
MODULE=${REF_NAME#dev_}
elif [[ "$REF_NAME" == preprod_* ]]; then
ENV="preprod"
MODULE=${REF_NAME#preprod_}
fi
# 2. DISPATCH EVENT (Manual)
elif [ "$EVENT_NAME" == "workflow_dispatch" ]; then
ENV="$INPUT_ENV"
# Extract module from branch name regardless of prefix
# e.g. master_odex25_hr -> odex25_hr
# e.g. dev_odex25_hr -> odex25_hr
if [[ "$REF_NAME" == dev_* ]]; then
MODULE=${REF_NAME#dev_}
elif [[ "$REF_NAME" == preprod_* ]]; then
MODULE=${REF_NAME#preprod_}
elif [[ "$REF_NAME" == master_* ]]; then
MODULE=${REF_NAME#master_}
else
# Fallback for non-standard branches? Maybe feature?
# For now assume the user runs this on a valid tier branch
echo "::error::Manual deployment must be run from a dev_, preprod_, or master_ branch to identify the module."
exit 1
fi
fi
# Set Port based on ENV
if [ "$ENV" == "dev" ]; then
PORT="14000"
elif [ "$ENV" == "preprod" ]; then
PORT="14010"
elif [ "$ENV" == "prod" ]; then
PORT="14069"
fi
echo "Resolved: ENV=$ENV, MODULE=$MODULE, PORT=$PORT"
echo "ENV=$ENV" >> $GITHUB_OUTPUT
echo "MODULE=$MODULE" >> $GITHUB_OUTPUT
echo "PORT=$PORT" >> $GITHUB_OUTPUT
- name: Deploy to Hydra Server (SSH)
if: steps.context.outputs.ENV != ''
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ inputs.specific_host != '' && inputs.specific_host || secrets.HYDRA_HOST }}
username: ${{ secrets.HYDRA_USER }}
key: ${{ secrets.HYDRA_SSH_KEY }}
port: 22
script: |
MODULE="${{ steps.context.outputs.MODULE }}"
ENV="${{ steps.context.outputs.ENV }}"
BRANCH="${{ github.ref_name }}"
FORCE_RESTART="${{ inputs.force_restart }}"
echo "🚀 Deploying $MODULE to $ENV Environment..."
# Directory Mapping
# Currently only DEV is mapped to /root/odoo-infra/odoo14/addons/custom_modules
# Future structure:
# /root/odoo-infra/dev/custom_modules
# /root/odoo-infra/preprod/custom_modules
# /root/odoo-infra/prod/custom_modules
if [ "$ENV" == "dev" ]; then
TARGET_ROOT="/root/odoo-infra/odoo14/addons/custom_modules"
SERVICE="odoo-14" # We renamed it to generic odoo-14 for now, but logical dev
else
echo "🚧 Environment '$ENV' folder structure is not yet created on the server. Deployment simulated."
exit 0
fi
TARGET_DIR="$TARGET_ROOT/$MODULE"
# Ensure directory exists
if [ ! -d "$TARGET_DIR" ]; then
echo "✨ Creating new module directory: $TARGET_DIR"
mkdir -p "$TARGET_DIR"
fi
cd "$TARGET_DIR"
# Robust Git Initialization
if [ ! -d ".git" ]; then
echo "Initializing new git repo..."
git init
git remote add origin git@github.com:hydracp9/odex25_standard.git
else
# Ensure remote is correct
current_url=$(git remote get-url origin || echo "")
if [ "$current_url" != "git@github.com:hydracp9/odex25_standard.git" ]; then
echo "Updating remote URL..."
git remote set-url origin git@github.com:hydracp9/odex25_standard.git
fi
fi
echo "⬇️ Pulling changes from $BRANCH..."
git fetch origin $BRANCH
git reset --hard FETCH_HEAD
if [ "$FORCE_RESTART" == "true" ] || [ "${{ github.event_name }}" == "push" ]; then
echo "🔄 Restarting Service..."
cd /root/odoo-infra
docker compose restart $SERVICE
fi
echo "✅ Deployment Successful."