Simple Tasks
Simple tasks are the foundation of Xec automation. They encapsulate single commands or basic operations that can be executed repeatedly across different environments.
Command Tasks
The simplest form of task is a single command:
tasks:
# Inline command
hello: echo "Hello, World!"
# Command with description
backup:
command: tar -czf backup.tar.gz /data
description: Create backup archive
Task Properties
Basic Properties
tasks:
example:
# Required (one of these)
command: echo "Command to execute"
# OR
script: |
console.log("JavaScript code");
# Optional metadata
description: Task description
target: hosts.production
workdir: /app
timeout: 30000
Complete Example
tasks:
deploy-static:
command: rsync -av ./dist/ /var/www/html/
description: Deploy static files to web server
target: hosts.web-server
workdir: /home/deploy/project
timeout: 60000
Target Specification
Single Target
tasks:
check-disk:
command: df -h
target: hosts.backup-server
Multiple Targets
tasks:
check-all:
command: uptime
targets:
- hosts.web-1
- hosts.web-2
- hosts.db-server
Dynamic Targets
tasks:
update-all:
command: apt-get update
targets: "hosts.*" # All hosts
Environment Variables
Set environment for task execution:
tasks:
build:
command: npm run build
env:
NODE_ENV: production
API_URL: https://api.example.com
BUILD_NUMBER: ${env.CI_BUILD_NUMBER}
Working Directory
Control where commands execute:
tasks:
compile:
command: make all
workdir: /project/src
# Relative to target's workdir
relative:
command: ./scripts/deploy.sh
target: hosts.build-server
Timeout Configuration
Prevent hanging tasks:
tasks:
quick:
command: ping -c 1 google.com
timeout: 5000 # 5 seconds
long-running:
command: ./backup-database.sh
timeout: 3600000 # 1 hour
no-timeout:
command: tail -f /var/log/app.log
timeout: 0 # No timeout
Shell Configuration
Control shell behavior:
tasks:
# Default (use shell)
with-shell:
command: echo $HOME && ls -la
# No shell (direct execution)
no-shell:
command: ["/usr/bin/python3", "script.py"]
shell: false
# Custom shell
custom-shell:
command: echo $0
shell: /bin/zsh
Output Handling
Capture Output
tasks:
get-version:
command: cat /etc/version
register: version_info
use-output:
command: echo "Version is ${version_info.stdout}"
Silent Execution
tasks:
quiet:
command: ./noisy-script.sh
silent: true # Suppress output
Error Handling
Basic Error Control
tasks:
# Fail on error (default)
strict:
command: test -f /important/file
throwOnNonZeroExit: true
# Continue on error
lenient:
command: rm -f /tmp/maybe-exists
throwOnNonZeroExit: false
Exit Code Handling
tasks:
check-service:
command: systemctl is-active nginx
acceptExitCodes: [0, 3] # 0=active, 3=inactive
Common Patterns
System Information
tasks:
system-info:
command: |
echo "=== System Information ==="
uname -a
echo "=== CPU Info ==="
lscpu | head -10
echo "=== Memory Info ==="
free -h
echo "=== Disk Usage ==="
df -h
description: Gather system information
Service Management
tasks:
restart-nginx:
command: systemctl restart nginx
target: hosts.web-server
description: Restart Nginx web server
check-nginx:
command: systemctl status nginx
target: hosts.web-server
description: Check Nginx status
File Operations
tasks:
create-backup:
command: |
BACKUP_FILE="/backup/data-$(date +%Y%m%d).tar.gz"
tar -czf "$BACKUP_FILE" /var/data/
echo "Backup created: $BACKUP_FILE"
target: hosts.backup-server
cleanup-old:
command: find /backup -name "*.tar.gz" -mtime +30 -delete
description: Remove backups older than 30 days
Git Operations
tasks:
git-pull:
command: git pull origin main
workdir: /var/www/app
git-status:
command: git status --short
workdir: /var/www/app
git-reset:
command: git reset --hard origin/main
workdir: /var/www/app
description: Reset to remote main branch
Docker Operations
tasks:
docker-cleanup:
command: docker system prune -af
description: Clean up unused Docker resources
docker-logs:
command: docker logs --tail 100 -f app-container
target: containers.app
docker-restart:
command: docker restart app-container
target: hosts.docker-host
Database Operations
tasks:
db-backup:
command: |
mysqldump -u root -p${secrets.db_password} \
production > /backup/db-$(date +%Y%m%d).sql
target: hosts.db-server
timeout: 600000
db-optimize:
command: mysqlcheck -o --all-databases
target: hosts.db-server
db-connections:
command: |
mysql -e "SHOW PROCESSLIST" | wc -l
target: hosts.db-server
description: Count active database connections
Task Execution
Command Line
# Run task
xec run hello
# Run on specific target
xec run backup --target hosts.backup-server
# Override timeout
xec run long-task --timeout 120000
From Scripts
// In xec scripts
await xec.run('deploy-static');
// With options
await xec.run('backup', {
target: 'hosts.backup-server',
timeout: 60000
});
From Other Tasks
tasks:
prepare:
command: echo "Preparing..."
main:
steps:
- task: prepare
- command: echo "Main task"
Best Practices
1. Use Descriptive Names
# Good
tasks:
backup-database:
command: pg_dump production > backup.sql
# Bad
tasks:
bd: # Unclear abbreviation
command: pg_dump production > backup.sql
2. Add Descriptions
tasks:
migrate-data:
command: ./migrate.sh
description: |
Migrate user data from v1 to v2 schema.
WARNING: This modifies production data.
Duration: ~10 minutes
3. Set Appropriate Timeouts
tasks:
health-check:
command: curl http://localhost/health
timeout: 5000 # Quick check
data-processing:
command: ./process-large-dataset.sh
timeout: 3600000 # Long operation
4. Handle Errors Gracefully
tasks:
safe-cleanup:
command: rm -f /tmp/tempfile
throwOnNonZeroExit: false # OK if file doesn't exist
5. Use Environment Variables
tasks:
flexible:
command: deploy --env ${DEPLOY_ENV:-staging}
env:
DEPLOY_ENV: ${params.environment}
Debugging Tasks
Test Execution
# Dry run
xec run deploy --dry-run
# Verbose output
xec run deploy --verbose
# Debug mode
xec run deploy --debug
Task Information
# Show task details
xec task info deploy
# List all tasks
xec task list
# Search tasks
xec task search backup
Common Issues
Command Not Found
# Ensure command exists on target
tasks:
fixed:
command: /usr/local/bin/custom-tool # Use full path
# OR
command: custom-tool
env:
PATH: /usr/local/bin:$PATH
Permission Denied
# Use appropriate permissions
tasks:
privileged:
command: sudo systemctl restart nginx
target: hosts.server
Working Directory Issues
# Ensure directory exists
tasks:
safe:
command: |
mkdir -p /app/logs
cd /app/logs
touch app.log
Next Steps
- Multi-Step Tasks - Complex workflows
- Task Overview - Task management concepts
See Also
- Task Command - Running tasks
- Command Execution - Direct command execution
- Best Practices - Task design patterns