I'm pretty sure my process will be different from most here - I'm still a bit old school - so I'll explain.
AJS 1.x - 3 servers - development, production and services. Services is a server that handles everything else - processing stripe payments, storing some user info in a MySQL DB. It's a mix of PHP and NodeJS scripts as well as various cron jobs to take care of some house keeping both against the MySQL DB and Firebase. All 3 servers serve via Apache.
I do everything manually - from downloading AJS directives / services and manually including them, to minifying the CSS / JS myself.
When I think development is done, I run an SSH script that zips the current product site and keeps it for safe keeping (a backup) then sends the dev code to the production server.
I'm also a 1 man team for everything ( dev / sys admin / design / graphics, etc... ) so I test as I write it. For example, yesterday I was making changes to the site's shopping cart - I make a few changes, upload to dev, then go through the entire process, checking the console for errors or warnings, testing the feature every which way I can think of, etc... Rinse / repeat until I'm confident it works right. I probably test each feature a couple dozen times.
Theres code in the scripts the looks at the hostname and determines if it's on the development server or production and determines some logic based on that - ie: if I'm testing the articles system in dev, I don't want users to be notified theres a new article as their just test articles.
I'm currently moving to a more module style of writing code. This site has recently split into 2 that are identical other then minor pieces here and there. I'm writing a new build process (in PHP) where I can develop modules in the primary site; "deploy" the code to the development server of the secondary site - test there, then SSH script both of them to their respective production servers.
I've played with testing tools; gulp, etc... I see the value in them, just not for this website. To often I have to make a quick change to production or theres a major bug but I'm in the middle of a bigger change or etc... doing everything manually allows me to have finer control over what goes into production then to constantly tweak build processes or test processes.