I try to keep it as simple/basic as possible. Most of my deployments are Gulp tasks, usually in the form of: build & upload via SFTP.
Whenever there is a task that I have to manually do when building (eg. committing build hashes to a git repo, or manually replacing the version number in the UI), I create a gulp task to do that for me. Not only this saves time when deploying, but it also dramatically reduces the mistakes I can possibly make.
To further add to this, when working at a company we were using a more complex deploying system, but in the end it it was a lot slower and failed a lot more often than the simple tasks that just build and customize locally and upload to the servers.
Whenever there is a task that I have to manually do when building (eg. committing build hashes to a git repo, or manually replacing the version number in the UI), I create a gulp task to do that for me. Not only this saves time when deploying, but it also dramatically reduces the mistakes I can possibly make.