Federico Cargnelutti / Wiki

Using FileSyncTask to synchronize files and directories

From Federico Cargnelutti

Jump to: navigation, search

Contents

Overview

FileSyncTask can be used to synchronize Website trees from staging to production servers and to backup key areas of the filesystems.

There are 4 different ways of using FileSyncTask:

  • For copying local files.
  • For copying from the local machine to a remote machine using a remote shell program as the transport (ssh).
  • For copying from a remote machine to the local machine using a remote shell program.
  • For listing files on a remote machine.

Copying files to a remote machine

Directory structure

development.com
|-- build
|   |-- build.properties
|   |-- build.xml
|   |-- sync.exclude
|   `-- sync.properties
`-- public
    `-- index.php

Settings

The SSH client called by FileSyncTask uses settings from the sync.properties file:

sync.source.projectdir=/home/development.com/public
sync.destination.projectdir=/home/staging.com
sync.remote.host=server.com
sync.remote.user=user
sync.destination.backupdir=/home/staging.com/backup
sync.exclude.file=/home/development.com/build/sync.exclude

Excluding irrelevant files

To exclude files from synchronizations, open and edit the sync.exclude file under the build/ directory. Each line can contain a file, a directory, or a pattern:

*~
_*
.svn
.htaccess
*.development.php
public/images/uploads/*
build/*
log/*
tmp/*

XML build file

Phing uses XML build files that contain a description of the things to do. The build file is structured into targets that contain the actual commands to perform:

<?xml version="1.0" ?>
<project name="example" basedir="." default="build">
<property name="version" value="1.0" />
 
<!-- Public targets -->
<target name="sync:list" description="List files">
  <phingcall target="-sync-execute-task">
    <property name="listonly" value="true" />
  </phingcall>
</target>
 
<target name="sync" description="Copy files">
  <phingcall target="-sync-execute-task">
    <property name="listonly" value="false" />
  </phingcall>
</target>
 
<!-- Private targets -->
<target name="-init" description="Load main settings">
  <tstamp />
  <property file="build.properties" />
</target>
 
<target name="-sync-execute-task" depends="-init">
  <property file="sync.properties" />
  <if>
    <not>
      <isset property="sync.verbose" />
    </not>
    <then>
      <property name="sync.verbose" value="true" override="true" />
      <echo message="The value of sync.verbose has been set to true" />
    </then>
  </if>
  <property name="sync.remote.auth" value="${sync.remote.user}@${sync.remote.host}" />
  <taskdef name="sync" classname="phing.tasks.ext.FileSyncTask" />
  <sync
    sourcedir="${sync.source.projectdir}"
    destinationdir="${sync.remote.auth}:${sync.destination.projectdir}"
    backupdir="${sync.remote.auth}:${sync.destination.backupdir}"
    excludefile="${sync.exclude.file}"
    listonly="${listonly}"
    verbose="${sync.verbose}" />
</target>
</project>

Execute task:

$ phing sync:list

Output:

Buildfile: /home/development.com/build/build.xml
 
example > sync:list:
[phingcall] Calling Buildfile '/home/development.com/build/build.xml'
            with target '-sync-execute-task'
 
example > -init:
[property] Loading /home/development.com/build/build.properties
 
example > -sync-execute-task:
[property] Loading /home/development.com/build/sync.properties
[echo] The value of sync.verbose has been set to true
 
Execute Command
----------------------------------------
rsync -razv --list-only -b --backup-dir
 
Sync files to remote server
----------------------------------------
Source:        /home/development.com/public
Destination:   user@server.com:/home/staging.com
Backup:        user@server.com:/home/staging.com/backup
 
Exclude patterns
----------------------------------------
*~
_*
.svn
.htaccess
*.development.php
public/images/uploads/*
build/*
log/*
tmp/*
 
(list of files that have changed)
 
BUILD FINISHED
Total time: 1.9763 second

More information

Related Articles

Personal tools