# Azure Devops - workflow/strategy for uploading only changed files to shared hosting provider after a build of static website (Jekyll)

Scenario:

I'm using the Ruby/Jekyll build process to generate a static website from markdown etc files via a templating process -- the same flow as the one used by Github Pages but instead of hosting it on Github I want to be able to upload it to my (existing) shared hosting provider and serve the files from there. (I already have DNS and everything in place with the web host.)

The hosting provider offers FTP and SSH via cPanel but no direct hook in to Git.

The build process (which I am doing manually for now, but will eventually become an automated build process and no doubt generate more questions!) creates/updates the static files in a '_site' directory within my repo.

My local "CI" build (on my own pc) uses a development branch and then when happy with the changes I push them up into master.

Where I'm stuck:

I want to be able to use an Azure Devops release pipeline to get the files into my web host, triggered by a merge into master.

I have had this running successfully (triggered manually, but I don't think the trigger part is a problem) using an inbuilt FTP task to grab the contents of the '_site' directory as an artifact and FTP them up to the web host.

However the FTP task (and the artifact) isn't very 'smart', in that it will re-upload everything every time I want to deploy even if only a few files have changed. This obviously takes longer and eats into my (metered) bandwidth for uploading (and seems like it is not good DevOps!)

Most often, only a small subset of files are actually changed by the build. This is usually where a new page is created or a stylesheet changed for example. Occasionally, all files are actually changed, such as if an "included" component changes so that all the static pages have to be re-rendered.

What I'm looking for is an approach or workflow to just upload the changed (and new) files, rather than all the files. It sounds like it ought to be easy, so perhaps I am missing something.

The viable solutions both amount to 'save hashes of the files on the server, then compare before upload'. However if you can get your pipeline to install and use git-ftp then git-ftp will do all that for you.