Updating an Application

I have deployed several instances of a Rails application. I am now
considering how I might apply application updates to each of the
various instances. I would like the updates to be contained in some
sort of an archive like a tar archive. There are two types of files
to be included in the archive:

1) Files which should only be written if there is no corresponding
file in the installation. These would typically be new files that are
being added from the archive.
2) Files which should overwrite corresponding installed files only if
the archive file is newer than the installed file.

The problem is that the tar archive does not allow me to specify the
overwriting rule to be applied on a file by file basis. Thus unless
there is some way to do this that I don't know about, I would really
need 2 tar archives for each update. I see this as being unacceptably
cumbersome. I reason that there must be a better way. Does anyone
know what that better way is (possibly a different archiving tool)?
Thanks for any input.

           ... doug

I have deployed several instances of a Rails application. I am now
considering how I might apply application updates to each of the
various instances. I would like the updates to be contained in some
sort of an archive like a tar archive. There are two types of files
to be included in the archive:

1) Files which should only be written if there is no corresponding
file in the installation. These would typically be new files that are
being added from the archive.
2) Files which should overwrite corresponding installed files only if
the archive file is newer than the installed file.

The problem is that the tar archive does not allow me to specify the
overwriting rule to be applied on a file by file basis. Thus unless
there is some way to do this that I don't know about, I would really
need 2 tar archives for each update. I see this as being unacceptably
cumbersome. I reason that there must be a better way. Does anyone
know what that better way is (possibly a different archiving tool)?
Thanks for any input.

Why do you need this system rather than just pulling down the latest
version from source control ?

Fred

3) What about files that need to be removed? :slight_smile:

As Fred said, you're almost certainly better off to just deploy from
your source repository (using e.g. Capistrano).

But if you *must* do something like the above, it's called `rsync` and
it handles case #3 as well.

HTH,

Why do you need this system rather than just pulling down the latest
version from source control ?

Because there are some files that may have been modified with customer-
specific code. We never want to overwrite these files. However, if a
file in this group doesn't exist on the system being updated (as in
the case where the update adds the file) we want to write the file.

Thanks for the input.

          ... doug

But if you *must* do something like the above, it's called `rsync` and
it handles case #3 as well.

I'm going to look into this. Thanks for the suggestion.

        ... doug

So you *don't* have a SCR-managed version of your different client
sites differences?

Well... that's not the most unusual situation, but it's not exactly
great practice.

I'd suggest a review of your internal processes with all the
developers, PMs and other stakeholders to discuss how to manage code
deployment. As a suggestion, I'd recommend a branch of your code for
each of your deployed client sites. Using Git/Mercurial it's not a
huge nightmare to manage merging core changes while keeping
client-specific code in the respective branches (although I'd
recommend that was a task delegated to one "change manager" who can
keep on top of it, and be responsible for all changes - and banging
the heads of anyone who "breaks the build" :slight_smile:

Approaching the problem this way, you can deal with any updates in
source control long before deployment, ensuring the client is going to
get the right stuff (and with a staging server, that everything is
going to continue working). Approaching it from the angle you're
musing about, you'll be constantly walking a tightrope that you
accidentally apply the wrong tar file to the wrong site - and that's
on the live site too.

HTH

or depending on how different the various versions are (and in
addition to what Michael has said) you could make the code support
what all of your customers want and make the choice between the
variants a configuration option. If you absolutely do have to make
code changes to different deployments you could deploy those changes
as plugins which re-open / monkey patch application classes (or
toggles configuration options). You can set rails to load plugins from
a directory other than vendor/plugins. Like that the app deploy would
be the same across all deployments and it would load plugins in (for
example) ~/site_customizations/ that would patch in per deployment
stuff

Fred

Doug Jolley wrote:

Why do you need this system rather than just pulling down the latest
version from source control ?

Because there are some files that may have been modified with customer-
specific code. We never want to overwrite these files. However, if a
file in this group doesn't exist on the system being updated (as in
the case where the update adds the file) we want to write the file.

You can make your Cap deploy scripts do this.

Thanks for the input.

          ... doug

Best,