Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

298 lines
7.1 KiB
Bash
Executable File

#!/bin/bash
# Temporal Workflows Deployment Script
# This script builds and deploys the temporal workflows service
set -euo pipefail
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
IMAGE_NAME="temporal-workflows"
REGISTRY="${DOCKER_REGISTRY:-your-registry}"
TAG="${BUILD_TAG:-latest}"
NAMESPACE="${KUBERNETES_NAMESPACE:-default}"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Logging functions
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Help function
show_help() {
cat << EOF
Temporal Workflows Deployment Script
Usage: $0 [OPTIONS] COMMAND
Commands:
build Build Docker image
push Push Docker image to registry
deploy Deploy to Kubernetes
deploy-local Deploy using local Docker image
rollback Rollback to previous deployment
status Check deployment status
logs Show worker logs
clean Clean up resources
Options:
-h, --help Show this help message
-t, --tag TAG Docker image tag (default: latest)
-r, --registry Docker registry (default: your-registry)
-n, --namespace Kubernetes namespace (default: default)
--dry-run Show what would be done without executing
Examples:
$0 build
$0 -t v1.2.3 deploy
$0 --registry myregistry.com deploy
$0 rollback
$0 logs
EOF
}
# Parse command line arguments
DRY_RUN=false
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
exit 0
;;
-t|--tag)
TAG="$2"
shift 2
;;
-r|--registry)
REGISTRY="$2"
shift 2
;;
-n|--namespace)
NAMESPACE="$2"
shift 2
;;
--dry-run)
DRY_RUN=true
shift
;;
-*)
log_error "Unknown option $1"
show_help
exit 1
;;
*)
COMMAND="$1"
shift
break
;;
esac
done
# Validate required tools
check_dependencies() {
local deps=("docker" "kubectl")
for dep in "${deps[@]}"; do
if ! command -v "$dep" &> /dev/null; then
log_error "$dep is required but not installed"
exit 1
fi
done
}
# Build Docker image
build_image() {
log_info "Building Docker image: ${REGISTRY}/${IMAGE_NAME}:${TAG}"
if [[ "$DRY_RUN" == "true" ]]; then
log_info "[DRY RUN] Would build: docker build -t ${REGISTRY}/${IMAGE_NAME}:${TAG} ."
return
fi
# Build from project root to include shared directory
cd "$PROJECT_DIR/../.."
docker build -t "${REGISTRY}/${IMAGE_NAME}:${TAG}" -f ee/temporal-workflows/Dockerfile .
log_info "Image built successfully"
}
# Push Docker image
push_image() {
log_info "Pushing Docker image: ${REGISTRY}/${IMAGE_NAME}:${TAG}"
if [[ "$DRY_RUN" == "true" ]]; then
log_info "[DRY RUN] Would push: docker push ${REGISTRY}/${IMAGE_NAME}:${TAG}"
return
fi
docker push "${REGISTRY}/${IMAGE_NAME}:${TAG}"
log_info "Image pushed successfully"
}
# Deploy to Kubernetes
deploy_k8s() {
log_info "Deploying to Kubernetes namespace: ${NAMESPACE}"
# Update image in deployment
local deployment_file="${PROJECT_DIR}/k8s/deployment.yaml"
local temp_file=$(mktemp)
# Replace image placeholder
sed "s|your-registry/temporal-workflows:latest|${REGISTRY}/${IMAGE_NAME}:${TAG}|g" \
"$deployment_file" > "$temp_file"
if [[ "$DRY_RUN" == "true" ]]; then
log_info "[DRY RUN] Would apply Kubernetes manifests"
log_info "[DRY RUN] Image: ${REGISTRY}/${IMAGE_NAME}:${TAG}"
rm "$temp_file"
return
fi
# Apply the manifests
kubectl apply -f "$temp_file" -n "$NAMESPACE"
# Clean up
rm "$temp_file"
log_info "Deployment applied successfully"
# Wait for rollout
log_info "Waiting for deployment to complete..."
kubectl rollout status deployment/temporal-workflows-worker -n "$NAMESPACE" --timeout=300s
log_info "Deployment completed successfully"
}
# Deploy using local image (for development)
deploy_local() {
log_info "Deploying using local Docker image"
# Build image locally
build_image
# Use local registry or kind cluster
if command -v kind &> /dev/null; then
log_info "Loading image into kind cluster"
if [[ "$DRY_RUN" != "true" ]]; then
kind load docker-image "${REGISTRY}/${IMAGE_NAME}:${TAG}"
fi
fi
# Deploy
deploy_k8s
}
# Rollback deployment
rollback_deployment() {
log_info "Rolling back deployment"
if [[ "$DRY_RUN" == "true" ]]; then
log_info "[DRY RUN] Would rollback: kubectl rollout undo deployment/temporal-workflows-worker"
return
fi
kubectl rollout undo deployment/temporal-workflows-worker -n "$NAMESPACE"
kubectl rollout status deployment/temporal-workflows-worker -n "$NAMESPACE" --timeout=300s
log_info "Rollback completed successfully"
}
# Check deployment status
check_status() {
log_info "Checking deployment status"
echo "Deployment status:"
kubectl get deployment temporal-workflows-worker -n "$NAMESPACE" -o wide
echo -e "\nPod status:"
kubectl get pods -l app=temporal-workflows-worker -n "$NAMESPACE" -o wide
echo -e "\nService status:"
kubectl get service temporal-workflows-worker -n "$NAMESPACE" -o wide
echo -e "\nHPA status:"
kubectl get hpa temporal-workflows-worker-hpa -n "$NAMESPACE" 2>/dev/null || echo "HPA not found"
}
# Show logs
show_logs() {
log_info "Showing worker logs"
kubectl logs -l app=temporal-workflows-worker -n "$NAMESPACE" --tail=100 -f
}
# Clean up resources
clean_up() {
log_info "Cleaning up resources"
if [[ "$DRY_RUN" == "true" ]]; then
log_info "[DRY RUN] Would delete Kubernetes resources"
return
fi
kubectl delete -f "${PROJECT_DIR}/k8s/deployment.yaml" -n "$NAMESPACE" || true
log_info "Cleanup completed"
}
# Main execution
main() {
if [[ -z "${COMMAND:-}" ]]; then
log_error "No command specified"
show_help
exit 1
fi
check_dependencies
case "$COMMAND" in
build)
build_image
;;
push)
push_image
;;
deploy)
build_image
push_image
deploy_k8s
;;
deploy-local)
deploy_local
;;
rollback)
rollback_deployment
;;
status)
check_status
;;
logs)
show_logs
;;
clean)
clean_up
;;
*)
log_error "Unknown command: $COMMAND"
show_help
exit 1
;;
esac
}
# Run main function
main "$@"