2.1 Depends on your deployment tool but they all work similarly. Normally the build process packages everything up for deployment (packages to be pushed to a package management tool, apps and their data to be deployed to worker servers, published web app archives to be pushed to web servers, etc). The deployment tool then normally has a list of tasks to perform. The tasks indicate what to do, on what target machine, etc.
Example: Solution has a web UI front end and an API back end. These are likely deployed to different servers. The build would build and run the unit tests for both apps and then "publish" the apps to an archive file that can be later msdeploy/webdeploy to a target server. The deployment tool would then have tasks to deploy the web UI front end to the environment's front end web server and the API back end to the environment's back end web server. Whether you're using an actual deployment tool like Azure DevOps or a simple Powershell script doesn't matter.
NOTE: Some companies build and deploy as a single step into each environment. So if you have 3 environments you build/deploy 3 times. I don't agree with this approach as it is wasteful hence the build is environment-agnostic and runs once. The deployment tool is responsible for getting things into each environment correctly.
2.2 Doesn't matter what deployment tool you use. Powershell, Chef, Octopus, Azure DevOps - they all provide similar features. The purpose of a deployment tool is to configure a target machine and get the files onto it. This is the "deployment tasks" you need to do. For non-prod environments you could deploy integration tests if you wanted but in prod you'd skip that step. The deployment tool needs to know which environment it is going to so it can use that environment variable to determine what steps to skip. Again, each deployment tool works differently but they all provide this functionality.
2.3 Yes, again a deployment is just a series of tasks to perform. What those tasks are depends on your app and environment. In the case of a web app you likely have tasks to set up or change the app pool to run against, set up or change the web site configuration and then deploy the updated site to the web server. Each of these are tasks in the deployment tool you're using. If you need to run integration tests in non-prod then normally you'd deploy the app to the environment and then as a final task run the integration tests. You'd use whatever environment variable is used by your tool to determine whether it is a production release or not. In the case of Azure DevOps it supports stages with tasks in each stage. Many people use the stages as environments so each environment contains the custom tasks for it. In our case we'd have our Dev/QA stages include a task to run integration tests but our Prod stage would leave this task out. If you're doing this with something else like Powershell you'd need to use a PS variable to control.