first commit

This commit is contained in:
Radosław Kukuczka
2025-03-30 12:56:29 +02:00
commit c815e7686d
2 changed files with 110 additions and 0 deletions

0
README.md Normal file
View File

110
action.yml Normal file
View File

@@ -0,0 +1,110 @@
name: 'Deploy to Docker (Swarm or Compose)'
description: |
Robustly deploys a processed Docker Compose file either to Docker Swarm or regular Docker Compose via SSH.
Includes detailed debug output, error handling, and cleanup.
inputs:
stack_name:
description: 'Docker stack or compose project name'
required: true
ssh_host:
description: 'SSH host'
required: true
ssh_user:
description: 'SSH username'
required: true
ssh_key:
description: 'SSH private key'
required: true
deploy_file:
description: 'Path to the processed deployment file'
required: true
deploy_mode:
description: 'Deployment mode: swarm or compose'
required: false
default: 'swarm'
remote_temp_dir:
description: 'Remote temporary directory for deployment files'
required: false
default: '/tmp'
runs:
using: 'composite'
steps:
- id: deploy
shell: bash
run: |
set -euo pipefail
STACK_NAME="${{ inputs.stack_name }}"
SSH_HOST="${{ inputs.ssh_host }}"
SSH_USER="${{ inputs.ssh_user }}"
DEPLOY_FILE="${{ inputs.deploy_file }}"
DEPLOY_MODE="${{ inputs.deploy_mode }}"
REMOTE_TEMP_DIR="${{ inputs.remote_temp_dir }}/$STACK_NAME"
echo "🚀 Starting deployment of '$STACK_NAME' to host '$SSH_HOST' using mode '$DEPLOY_MODE'"
# Validate deploy_mode input
if [[ "$DEPLOY_MODE" != "swarm" && "$DEPLOY_MODE" != "compose" ]]; then
echo "❌ ERROR: Invalid deploy_mode '$DEPLOY_MODE'. Must be 'swarm' or 'compose'."
exit 1
fi
# Check if deployment file exists locally
if [ ! -f "$DEPLOY_FILE" ]; then
echo "❌ ERROR: Deployment file '$DEPLOY_FILE' does not exist."
exit 1
fi
# Create temporary SSH key file
SSH_KEY_FILE=$(mktemp)
echo "${{ inputs.ssh_key }}" > "$SSH_KEY_FILE"
chmod 600 "$SSH_KEY_FILE"
echo "🔑 DEBUG: Temporary SSH key created at '$SSH_KEY_FILE'"
# Ensure remote directory exists
echo "📁 DEBUG: Creating remote directory '$REMOTE_TEMP_DIR'"
ssh -o StrictHostKeyChecking=no -i "$SSH_KEY_FILE" \
"$SSH_USER@$SSH_HOST" \
"mkdir -p '$REMOTE_TEMP_DIR' && chmod 700 '$REMOTE_TEMP_DIR'"
# Copy deployment file to remote host
echo "📤 DEBUG: Copying deployment file '$DEPLOY_FILE' to remote host at '$REMOTE_TEMP_DIR/docker-compose.yml'"
scp -o StrictHostKeyChecking=no -i "$SSH_KEY_FILE" \
"$DEPLOY_FILE" \
"$SSH_USER@$SSH_HOST:$REMOTE_TEMP_DIR/docker-compose.yml"
# Validate docker-compose file remotely before deploying
echo "🔍 DEBUG: Validating Docker Compose file remotely"
ssh -o StrictHostKeyChecking=no -i "$SSH_KEY_FILE" \
"$SSH_USER@$SSH_HOST" \
"docker compose -f '$REMOTE_TEMP_DIR/docker-compose.yml' config --quiet"
echo "✅ DEBUG: Docker Compose file validation succeeded"
# Deploy based on mode
if [ "$DEPLOY_MODE" == "swarm" ]; then
echo "🚢 DEBUG: Deploying stack '$STACK_NAME' to Docker Swarm"
ssh -o StrictHostKeyChecking=no -i "$SSH_KEY_FILE" \
"$SSH_USER@$SSH_HOST" \
"docker stack deploy -c '$REMOTE_TEMP_DIR/docker-compose.yml' '$STACK_NAME' --with-registry-auth"
echo "✅ DEBUG: Stack '$STACK_NAME' deployed successfully to Docker Swarm"
else
echo "🐳 DEBUG: Deploying project '$STACK_NAME' using Docker Compose"
ssh -o StrictHostKeyChecking=no -i "$SSH_KEY_FILE" \
"$SSH_USER@$SSH_HOST" \
"cd '$REMOTE_TEMP_DIR' && docker compose -p '$STACK_NAME' up -d --remove-orphans"
echo "✅ DEBUG: Project '$STACK_NAME' deployed successfully using Docker Compose"
fi
# Cleanup remote temporary files
echo "🧹 DEBUG: Cleaning up remote temporary directory '$REMOTE_TEMP_DIR'"
ssh -o StrictHostKeyChecking=no -i "$SSH_KEY_FILE" \
"$SSH_USER@$SSH_HOST" \
"rm -rf '$REMOTE_TEMP_DIR'"
# Cleanup local temporary SSH key file
rm -f "$SSH_KEY_FILE"
echo "🔑 DEBUG: Temporary SSH key file '$SSH_KEY_FILE' removed"
echo "🎉 Deployment of '$STACK_NAME' completed successfully!"