From c815e7686de6da82f576903629c927a4449ead9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Kukuczka?= Date: Sun, 30 Mar 2025 12:56:29 +0200 Subject: [PATCH] first commit --- README.md | 0 action.yml | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 README.md create mode 100644 action.yml diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..2d3191e --- /dev/null +++ b/action.yml @@ -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!"