Use Case: Automation Scripts
Integrate fx-bin commands into automation scripts for deployment, CI/CD, and batch operations.
Overview
Automation scripts need reliable file operations for deployment, testing, and maintenance. This use case demonstrates how to integrate fx-bin commands into shell scripts and CI/CD pipelines.
Deployment Automation
1. Deployment Script
#!/bin/bash
# deploy.sh
set -e
echo "=== Deployment Script ==="
echo ""
# 1. Navigate to project root
echo "1. Navigating to project root..."
PROJECT_ROOT=$(fx root --cd)
if [ $? -ne 0 ]; then
echo "Error: Not in a Git repository"
exit 1
fi
cd "$PROJECT_ROOT"
echo " Project root: $PROJECT_ROOT"
echo ""
# 2. Backup current deployment
echo "2. Backing up current deployment..."
BACKUP_NAME=$(fx backup ~/deploy/current --compress | grep -o "backup_[^ ]*")
echo " Backup: $BACKUP_NAME"
echo ""
# 3. Build project
echo "3. Building project..."
make build
echo " Build complete"
echo ""
# 4. Deploy files
echo "4. Deploying files..."
cp -r dist/* ~/deploy/current/
echo " Deployment complete"
echo ""
# 5. Verify deployment
echo "5. Verifying deployment..."
if [ -f ~/deploy/current/version.txt ]; then
echo " Version: $(cat ~/deploy/current/version.txt)"
fi
echo ""
# 6. Summary
echo "=== Deployment Complete ==="
echo " Backup: $BACKUP_NAME"
echo " Deployed to: ~/deploy/current"
2. Rollback Script
#!/bin/bash
# rollback.sh
set -e
echo "=== Rollback Script ==="
echo ""
BACKUP_NAME=$1
if [ -z "$BACKUP_NAME" ]; then
echo "Usage: rollback.sh BACKUP_NAME"
echo "Example: rollback.sh backup_20260110_143022.tar.xz"
exit 1
fi
echo "Rollback: $BACKUP_NAME"
echo ""
# 1. Extract backup
echo "1. Extracting backup..."
tar -xf "$BACKUP_NAME"
BACKUP_DIR=$(echo "$BACKUP_NAME" | sed 's/\.tar\.xz//')
echo " Extracted: $BACKUP_DIR"
echo ""
# 2. Stop current deployment
echo "2. Stopping current deployment..."
sudo systemctl stop myapp
echo " Service stopped"
echo ""
# 3. Restore from backup
echo "3. Restoring from backup..."
rm -rf ~/deploy/current/*
cp -r "$BACKUP_DIR"/* ~/deploy/current/
echo " Restoration complete"
echo ""
# 4. Start service
echo "4. Starting service..."
sudo systemctl start myapp
echo " Service started"
echo ""
# 5. Cleanup
echo "5. Cleanup..."
rm -rf "$BACKUP_DIR"
echo " Cleanup complete"
echo ""
# 6. Summary
echo "=== Rollback Complete ==="
CI/CD Integration
GitHub Actions Example
name: Build and Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install fx-bin
run: pip install fx-bin
- name: Navigate to project root
run: |
PROJECT_ROOT=$(fx root --cd)
echo "PROJECT_ROOT=$PROJECT_ROOT" >> $GITHUB_ENV
- name: Create backup
run: |
BACKUP_NAME=$(fx backup . --compress)
echo "BACKUP_NAME=$BACKUP_NAME" >> $GITHUB_ENV
- name: Build project
run: |
cd $PROJECT_ROOT
make build
- name: Deploy
run: |
cd $PROJECT_ROOT
make deploy
GitLab CI Example
stages:
- deploy
deploy_production:
stage: deploy
script:
- pip install fx-bin
- PROJECT_ROOT=$(fx root --cd)
- cd $PROJECT_ROOT
- BACKUP_NAME=$(fx backup . --compress)
- make build
- make deploy
only:
- main
Batch Operations
1. File Processing Script
#!/bin/bash
# process_files.sh
set -e
PATTERN=$1
OPERATION=$2
if [ -z "$PATTERN" ] || [ -z "$OPERATION" ]; then
echo "Usage: process_files.sh PATTERN OPERATION"
echo "Example: process_files.sh '*.py' 'python -m py_compile'"
exit 1
fi
echo "=== Batch File Processing ==="
echo "Pattern: $PATTERN"
echo "Operation: $OPERATION"
echo ""
# 1. Find files
echo "1. Finding files..."
FILES=$(fx ff . --pattern "$PATTERN" --exclude node_modules --exclude .git --exclude __pycache__)
FILE_COUNT=$(echo "$FILES" | wc -l)
echo " Found $FILE_COUNT files"
echo ""
# 2. Process files
echo "2. Processing files..."
for file in $FILES; do
echo " Processing: $file"
$OPERATION "$file"
done
echo ""
# 3. Summary
echo "=== Processing Complete ==="
echo " Processed $FILE_COUNT files"
2. Log Analysis Script
#!/bin/bash
# analyze_logs.sh
set -e
echo "=== Log Analysis ==="
echo ""
# 1. Find log files
echo "1. Finding log files..."
LOG_FILES=$(fx ff .log --exclude archive)
LOG_COUNT=$(echo "$LOG_FILES" | wc -l)
echo " Found $LOG_COUNT log files"
echo ""
# 2. Analyze log sizes
echo "2. Analyzing log sizes..."
for log_file in $LOG_FILES; do
echo " $log_file: $(fx size "$log_file" | head -1)"
done
echo ""
# 3. Find large logs
echo "3. Finding large logs..."
LARGE_LOGS=$(fx ff .log --exclude archive | xargs fx size | sort -rn | head -10)
echo "$LARGE_LOGS"
echo ""
# 4. Summary
echo "=== Analysis Complete ==="
echo " Total logs: $LOG_COUNT"
Maintenance Automation
1. Daily Maintenance Script
#!/bin/bash
# daily_maintenance.sh
set -e
echo "=== Daily Maintenance ==="
echo ""
# 1. Navigate to project root
echo "1. Navigating to project root..."
PROJECT_ROOT=$(fx root --cd 2>/dev/null || echo ".")
cd "$PROJECT_ROOT"
echo " Project root: $PROJECT_ROOT"
echo ""
# 2. Find backup files
echo "2. Finding backup files..."
BACKUP_FILES=$(fx ff .bak --exclude node_modules --exclude .git --exclude __pycache__)
BACKUP_COUNT=$(echo "$BACKUP_FILES" | wc -l)
echo " Found $BACKUP_COUNT backup files"
echo ""
# 3. Find temporary files
echo "3. Finding temporary files..."
TEMP_FILES=$(fx ff .tmp --exclude node_modules --exclude .git)
TEMP_COUNT=$(echo "$TEMP_FILES" | wc -l)
echo " Found $TEMP_COUNT temporary files"
echo ""
# 4. Analyze large files
echo "4. Analyzing large files..."
LARGE_FILES=$(fx size . --recursive --limit 10)
echo "$LARGE_FILES"
echo ""
# 5. Summary
echo "=== Maintenance Complete ==="
echo " Backup files: $BACKUP_COUNT"
echo " Temporary files: $TEMP_COUNT"
2. Cleanup Script
#!/bin/bash
# cleanup.sh
set -e
echo "=== Cleanup Script ==="
echo ""
# 1. Create backup
echo "1. Creating backup..."
BACKUP_NAME=$(fx backup . --compress)
echo " Backup: $BACKUP_NAME"
echo ""
# 2. Find files to clean
echo "2. Finding files to clean..."
BACKUP_FILES=$(fx ff .bak --exclude node_modules --exclude .git --exclude __pycache__)
TEMP_FILES=$(fx ff .tmp --exclude node_modules --exclude .git)
BACKUP_COUNT=$(echo "$BACKUP_FILES" | wc -l)
TEMP_COUNT=$(echo "$TEMP_FILES" | wc -l)
echo " Backup files: $BACKUP_COUNT"
echo " Temporary files: $TEMP_COUNT"
echo ""
# 3. Clean files
echo "3. Cleaning files..."
if [ -n "$BACKUP_FILES" ]; then
echo "$BACKUP_FILES" | xargs rm -f
echo " Cleaned $BACKUP_COUNT backup files"
fi
if [ -n "$TEMP_FILES" ]; then
echo "$TEMP_FILES" | xargs rm -f
echo " Cleaned $TEMP_COUNT temporary files"
fi
echo ""
# 4. Summary
echo "=== Cleanup Complete ==="
echo " Backup: $BACKUP_NAME"