hakuna
hakuna

Reputation: 6701

grunt-msdeploy for deploying AngularJS app to multiple servers

I am using grunt-msdeploy for deploying angularJs code to one of the server, this is working perfectly fine. I would like to deploy the same code to multiple servers. How do i achieve it ? Please help !

Gruntfile.js code for msdeploy:

    var path = require('path');
    //add the config file name
    var configFile = path.resolve('./deployconfig.json');
    var config = require(configFile);
msdeploy: {
            push: {
                options: {
                    verb: 'sync',
                    allowUntrusted: 'true',
                    source: {
                        'contentPath': path.resolve('./dist')
                    },
                    dest: {
                        contentPath: config.contentPath,
                        wmsvc: config.serverAddress,
                        userName: config.userName,
                        password: config.password
                    }
                }
            }
        }


grunt.loadNpmTasks('grunt-msdeploy');
 //add task for deployment - copying the dist from local server to remote server
 grunt.registerTask('deploy', ['msdeploy:push']);

deployconfig.json:

{
    "contentPath": "c:/inetpub/wwwroot/dist",
    "serverAddress": "ec2-xx-xx-xx-x.ap-northeast-1.compute.amazonaws.com",
    "userName": "xxxxxxxxx",
    "password": "xxxxxxxxx"
}

I have tried using multiple dest in the msdeploy with multiple servers information in the json file, but that didn't work. Is there a way to do this at all ?

Upvotes: 1

Views: 348

Answers (2)

hakuna
hakuna

Reputation: 6701

This is the working solution:

 msdeploy: {
            target1: {
                options: {
                    verb: 'sync',
                    allowUntrusted: 'true',
                    source: {
                        'contentPath': path.resolve('./dist')
                    },
                    dest: {
                        contentPath: "target1path",
                        wmsvc: "target1serverAddress",
                        userName:"target1userName",
                        password:"target1password"
                    }
                }
            },
            target2: {
                options: {
                    verb: 'sync',
                    allowUntrusted: 'true',
                    source: {
                        'contentPath': path.resolve('./dist')
                    },
                    dest: {
                        contentPath: "target2path",
                        wmsvc: "target2serverAddress",
                        userName:"target2userName",
                        password:"target2password"
                    }
                }
            }
        }

grunt.registerTask('deploy', ['msdeploy:target1', 'msdeploy:target2']);

In case if any one wants to do it with the config file , add multiple entries to the json config file like this:

[ 
  {
    "contentPath": "c:/inetpub/wwwroot/dist",
    "serverAddress": "ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com",
    "userName": "xxxxxxxxxx",
    "password": "xxxxxxxxx"
  },
  {
    "contentPath": "c:/inetpub/wwwroot/dist",
    "serverAddress": "ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com",
    "userName": "xxxxxxxxxx",
    "password": "xxxxxxxxx"
  }
]

and the values can be referred as :

var path = require('path');
var configFile = path.resolve('./deployconfig.json');
var config = require(configFile);

contentPath: config[0].contentPath,
wmsvc: config[0].serverAddress,
userName: config[0].userName,
password: config[0].password

Upvotes: 0

Farside
Farside

Reputation: 10343

I think you are configuring the task wrong, that's why it doesn't work in your case, it should be defined as taks for grunt, here's the pseudo-code:

grunt.initConfig({
  msdeploy: {
    options: {
      // Task-specific options go here.
    },
    your_target: {
      // Target-specific file lists and/or options go here.
    },
  },
});

More information and options in the official manual.

For multiple destinations just create several target descriptions,

grunt.initConfig({
  msdeploy: {
    options: {
      // Task-specific options go here.
    },
    your_target_1: {
      // Target-specific file lists and/or options go here.
    },
    your_target_2: {
      // Target-specific file lists and/or options go here.
    },
    ...
  },
});

You may create options, generic for all of those targets, as well as specific options per each target.

When you'll run the task, simply do not specify which target you need to run, and it will execute them one by one:

// will be executed for all the targets from task `msdeploy` definition
grunt.registerTask('deploy', ['msdeploy']);

// or alternatively you may explicitly define the order of tasks:
grunt.registerTask('deploy', ['msdeploy:your_target_1', 'msdeploy:your_target_2']);

Upvotes: 4

Related Questions