| |

Deploying ASP .NET app to FTP with Azure DevOps CI/CD pipeline

What you will learn

In this post, I will show how to configure the Azure DevOps pipeline – to easily publish an ASP .NET app to FTP server.

How to configure the pipeline (5 easy steps)

FtpUpload task is essential, please check the last step. To deploy all your files to the desired FTP location, the pipeline should:

  • Trigger after committing to the branch (ex. master).
  • Use the latest windows machine to build a solution in Release mode.
  • Restore the missing NuGet packages.
  • Publish web app to file system folder.
  • Upload the files to the FTP server using the FtpUpload task (Read more about the FTPUpload task on Microsoft’s docs page).

Azure pipelines YAML with FtpUpload task

The complete azure-pipelines.yml file looks as follows:

# ASP.NET
# Build and test ASP.NET projects.
# Add steps that publish symbols, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/apps/aspnet/build-aspnet-4

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:SkipInvalidConfigurations=true /p:publishUrl=$(build.artifactstagingdirectory)website'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: VSTest@2
  inputs:
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: FtpUpload@2
  inputs:
    credentialsOption: 'inputs'
    serverUrl: 'ftp://127.0.0.1'
    username: 'ftp-user-name'
    password: 'P@ssword'
    rootDirectory: '$(build.artifactStagingDirectory)/website'
    filePatterns: '**'
    remoteDirectory: '/wwwroot' # '/wwwroot/$(Build.BuildId)/'
    clean: false
    cleanContents: false
    preservePaths: true
    trustSSL: false

Download the code

To download the source code for this post, please visit GitHub

Similar Posts