Wednesday, September 21, 2005

Deployment Script with Watir (Take THAT, Websphere!)

So, after some struggling with Websphere on deploying an EAR file (Don't ask me question about why we still bother, please... ) and not able to get a hand on a simple deployment script (I think there should be one but I just didn't have the time to look further), I have decided to automate the web process that I have been doing, using WATIR.

Call me innocent, but I really thought that depolying an EAR file on an application server would be easy, given the 'comprehensive' file structure and all the deployment descriptors.

But no..., you have to click through this long 'wizard' (ooohhh...) process every single time. Not only you have to do it manually, it also takes quite a lot of time. And I happen to be one of the impatient guys who thinks that it is a machine's job, then a human should not suffer.

In case you haven't heard of it, Watir ( is a ruby library used for web testing. I am still not sure how exactly it works, but the result is that you can control an internet explorer instance using Ruby script. So basically almost anything you do with IE, you can write a script and automate it.

So long story short, I was finally able to write a script that uploads the file to the server, click through the steps, and save the configurations. Needless to say, I am very impressed the progess that Watir has made, functionality as well as the documentations.

The script is actually not that long. Here it is (with comments):

require 'watir'

class IeLauncher
result = ie = Watir::IE.start(*args)
if block_given?
result = yield ie
return result

# Ignore the above, they are just basic set up.

# Launch IE, go to the specified URL'http://localhost:9060/ibm/console/') do |ie|
# Log in, my local server doesn't have a password
ie.text_field(:name, 'username').set('admin')
ie.button(:value, 'Log in').click

# Only one login is allowed so you will have to log out last one
if ie.contains_text('Login Conflict'), 'action', 'force').set
ie.button(:value, 'OK').click

# Apprantly when you deploy an application, you need to 'save' it.
# This recovers it
if ie.contains_text('Recover prior changes'), 'action', 'recover').set
ie.button(:value, /OK/).click

# This get the frame that has the navigation tree and look for the right node
navigation = ie.frame('navigation_tree'), 'Applications').click, 'Enterprise Applications').click
detail_frame = ie.frame('detail')

# Uninstall the existing deployment
if detail_frame.contains_text('DukesBank')
dukesbank_checkbox = detail_frame.checkbox(:value, /DukesBank/)
detail_frame.button(:value, 'Uninstall').click
detail_frame.button(:value, 'OK').click

# Install
detail_frame.button(:value, 'Install').click, 'radioButton', 'local').click

# Upload the file (Note, file path cannot have space)
detail_frame.file_field(:name, 'localFilepath').set('c:\Work\Dukes\DukesBankEAR\build\artifacts\DukesBankEAR.ear')

# Clicking through the wizards
button = detail_frame.button(:value, 'Next')
while button.exists?
button = detail_frame.button(:value, 'Next')
detail_frame.button(:value, 'Finish').click, 'Save to Master Configuration').click
detail_frame.button(:value, 'Save').click, 'Enterprise Applications').click


Anonymous said...

Why not just use a 3 line JACL script and Ant?

Anonymous said...

show me a 3 line script to deploy a ear file. The one from IBM over 150 lines.

Anonymous said...

i am going to take this script and modify as per my need.
Thanks for posting this. if it is going to work you made my life easy.