When my last contract came to an end I decided to take a look at upgrading my current site from Umbraco 7 to version 8. I admit that I've been putting this off as I have previous experience of upgrading from Umbraco 6 to version 7, and it wasn't a simple process.
Back then, my first attempt involved following the Umbraco migration path. The key to any migration is to develop a procedure that can be repeated many times. Content and data on your live website will change as this procedure is developed and tested, so the procedure must be re-run many times and only once the upgraded site has been accepted can the live site be migrated for a final time.
One major obstacle to using the official upgrade path is that your site may use non-standard property editors and functionality provided by installed packages. These may not exist in the new version and you are responsible for deciding how to replace them and converting any content/data stored for them. There are two main components to migrate: the code and the content/data.
As the code is usually reasonably stable, it should be relatively straight forward to apply the migration changes to the file structure and then update the custom site code to use the new libraries of the new Umbraco version. If you are replacing custom property editors/packages then you will need to update your code to deal with the alternatives.
In my experience the official tool migrated the standard property editors, but I needed to update the database directly for custom editors. For my first attempt I did this using SQL scripts that were run as part of my migration procedure. They were very involved and it wasn't pretty!
This process worked, but proved difficult. I was also uncomfortable with the fact that there may have been lots of old V6 components hanging around after the migration, it felt like a bit of a fudge. I'd much prefer a brand new installation of Umbraco and then move the code to it. I decided to take this approach and to migrate the data I would take a different approach: build an API on the old version to expose all of the content and then add a component in the new version to read from that API, convert it if necessary and then create the equivalent content in the new version. Luckily Umbraco provides the services API to make this possible.
The API provided the content (including media) as JSON structures, which could be easily converted to C# objects in the Converter in the newer version. Immediately this was an improvement as I had structured data (rather than strings in SQL) and it made the conversion much more rigorous.
I have still yet to migrate my site, but I am certainly going to take the second approach when converting to Umbraco 8. It struck me that I could make the API and Converter generic, so that they could be used by anybody. So I decided to create my first package. The idea is that you install the package on both the old and new versions, create any converters that you need as C# classes and then use a new section in the back office to transfer the content (including media, document types, data types, templates, etc.).