When we can quickly rebuild our applications and environments on demand, we can also quickly rebuild them instead of repairing them when things go wrong. We should adopt this practice even if we have a single server in production.
For consistency, all changes to production have to be replicated everywhere. We can use automated configuration systems like Ansible or create completely new virtual machines or containers, taking old ones out of rotation. The latter pattern is knows as immutable infrastructure.
Manual changes to servers are not allowed. Every environment should be recreated from scratch. Remote logins to servers might be disabled for most and used only for special cases like debugging. This motivates everyone to use version control for any changes.
All test environments must also be synchronized with current environment state in VCS.
The longer interval between development and deployment the worse the outcomes. Our goal is to ensure that developers routinely integrate the code with production like environments.
"Done" is only when the functionality is demonstrated to work in production environment.
In DevOps integration testing refers to testing the application in a production like environment.
Ideally we use the same tools for monitoring, logging and deployment in our test environment as in production.
All artifacts in version control are a single source of truth.