We use Visual Studio Team Services for source code on a LAMP stack Azure VM. When deploying via VS TS and copying the files over SSH through VS TS, I had a few challenges to automate the build/deployment process. Here is how I set things up.

- 
Check your files into source control (PHP files, web assets, etc.)- I manually configured the deployment of 4 environment VMs for Dev, INT, STG, PRD using 4 instances of Azure Ubuntu Linux VMs.
- I manually deployed machine specific content, such as config files to the server. I later filter these files out of the deployment if they are in the web root. For security, I keep these files outside of the web root.
 
- 
Create Build definition (one for each environment, DEV, INT, STG, PRD)- 
Use an Empty Process 
- Under Get Sources, say This Project and chose the repository.
- Add a task to Copy files securely over SSH
 
- On the SSH endpoint, click the gear to configure your endpoints:
- Add SSH endpoints with your key file and IP, etc.
 
- 
Select your endpoint and apply chose your web root from your project under Source Folder. Also, under Contents, apply any filters: (below, ** is everything, then we filter out files/folders using !**/)I use the following filter examples: 
 **
 !**/old_code/*
 !**/old/file.txt
 
 
- 
I added two SSH commands to set permissions before/after the copy
- You can choose a Shell Script and provide environment specific variables, such as a user.
 
- I have my resetperms.sh script in Source Control as well. This uses the same user as VS uses to overwrite files, then after the deployment, I use a second script to set my special permissions. The second script I will not post since it is specific to my application, and for security reasons. $1 is the argument I pass in for the user, who I set as owner recursively for all web files during deployment.
 #!/bin/bash 
 # Reset permissions before TFS deployment
 echo “Reset permissions before TFS deployment”
 if [ “$1” != “” ]; then
 echo “Ready, Positional parameter 1 contains user $1”
 echo “Resetting permissions to $1 for TFS deployment”
 sudo chown -R “$1″:”$1” /var/www/html
 else
 echo “Fail, Positional parameter 1 is empty. Please pass in the environments user”
 fi- One important note, on Windows when I created the script as resetperms.sh in NotePad++, you have to go to Edit -> EOL Conversion (thanks to this article http://stackoverflow.com/questions/8195839/choose-newline-character-in-notepad )
 
- 
Otherwise, you will get the following error:Build 
 ./resetperms.sh: line 2: $’\r’: command not found
 ./resetperms.sh: line 10: syntax error: unexpected end of file
 Command failed with errors on remote machine.
 
- 
That’s it, then save and queue a new build!
Much easier than copying files via FTP. Now I can click a button and update my application in each environment. Next steps are to automate the testing, release process.
More on SSH with Visual Studio Team Services https://www.visualstudio.com/en-us/docs/build/steps/deploy/ssh
Note: you can also have a build definition trigger the release definition to copy the files over SSH, etc. This is the way the Azure Portal sets up Continuous Delivery for Web Apps.


