260 likes | 435 Views
The Deploy Tool. Definition (Wikipedia). What is deployment ? “Software deployment is all of the activities that make a software system available for use .” 1. Install Software 2. Customize local configuration file(s) passwords, remote endpoints, …. executable(s) + libraries.
E N D
Definition (Wikipedia) • What is deployment ? • “Software deployment is all of the activities that make a software system available for use.” 1. Install Software 2. Customize local configuration file(s) • passwords, remote endpoints, … executable(s) + libraries
Situation 2010 • Java • Restart installs software • Log file stored locally • Passwords had to be hardcoded or stored separately in funny locations • C/C++ • Restarted installs software • Copy to disk • Auxiliary files accessed via network No Standard Location ! No Standard Location !
Analysis Deployment Standardization Document • Deploymentinformation is de facto not standardized • Default installation directory • Directory structure • Process name • … • No flexible way to install a product • No influence on file/directory structure • No post-install changes (e.g. tailoring of config files) • No configurable backup policy
Suggestion • Define deployment configuration in file • CommonBuild’sproduct.xml is a good place • Developers already know this • Some deployment information is already there • No need for an additional system • Creation of an installation procedure • Uses product.xml to deploy application • Projects should have certain deployment flexibility
A Closer Look • What to we need ? • File and directory structure • Installation location • Backup policy • Process name • More ? • Nomenclature • Productis the name of the software as from repo • E.g. LSA server • Applicationis the concrete instance • LHC LSA Server
Deployment.xml (product.xml) ... <application name=“jmsagent”> <deployment installLocation="/opt/diamon/agent-jms/" > <directory name="conf" mask="550" > <file name="jmsconfig.xml" mask=“755" /> <file name="log/log4j.properties" /> <file name="log/log4j.properties“ source=“/nfs/fgr/”/> <file name="log/log4j.properties“ source=“svn://...”/> </directory> <directory name="log" mask="750" /> <backupPolicykeepBackups="2"/> <replaceString> <file name="bin/start.sh" var="VAR_1" value="my value" /> </replaceString> </deployment> </application> ...
The Deploy Tool • What is it for ? • Simplifying deployment process & reduce your workload • Allows developers to take influence on the installation • Takes information from deployment config • Enforces deployment standards • Reduces upgrade time by automation deploy MAVEN CmbBuild
The Deploy Tool and Maven • Maven assembly creates a tarball • Assembly.xml required • Deploy • Copies tarball to local disk • Creates backup • Extracts tarball to target install dir • Copies aux files • Preserves directories/files from previous installation • Sends deployment notification (mail + STOMP)
Default installation Java (Maven) deploy query product info TAR.GZ Deployment Config NEXUS/Artifactory /opt/…
Default installation C++ deploy Executable + Aux Deployment Config Repository /opt/…
Features Deploy Tool Notification Create Directories Startscript Creation Simulation Mode Preserve Files Add additional Files Automatic Backups Set Access Rights Create Install Log Checkout from SVN Safety checks
Summary • Unified way to install software • Allows to simply customize installation • Main tool in CO for Java & (many) C++ services • Simplifies integration test • Reduces workload for developers • Standardises deployment • Easy to extend • Supports Maven (Artifactory & Nexus) • Supports CommonBuild
copera@cs-ccr-dev4:/)deploy -p diamon-notifier -a diamon-notifier -t /tmp/del [ INFO ] cmnbuild Found only one Application : diamon-notifier [ INFO ] cmnbuild Creating dependency file list.. [ INFO ] install ------------------------------------------------------- [ INFO ] install [ INFO ] install Installation of application 'diamon-notifier' for product 'diamon-notifier' [ INFO ] install [ INFO ] install Application : diamon-notifier [ INFO ] install Product : diamon-notifier [ INFO ] install Version : 1.9.4-002 (PRO) [ INFO ] install Release Date : Thursday, March 5, 2009 09:26:44 [ INFO ] install Source : /user/pcrops/dist/accsoft/diamon/diamon-notifier/PRO [ INFO ] install Started on : Fri, 26 Apr 2013 10:48:30 [ INFO ] install Target directory is : /tmp/del [ INFO ] install Triggered by : ('felixehm', 'copera') [ INFO ] install Host : cs-ccr-dev4.cern.ch [ INFO ] install Force installaton is : False [ INFO ] install Automatic rollback : False [ INFO ] install Keeping backups : 1 [ INFO ] install SimulationMode : False [ INFO ] install [ INFO ] install Starting PreInstallation for diamon-notifier in /tmp/del [ INFO ] install Creating backup for /tmp/del (max 1 are kept) [ INFO ] install Creating /tmp/del [ INFO ] install Preinstallation finished [ INFO ] install Postinstallation starts [ INFO ] install Postinstallation finished [ INFO ] install Sending notifications to []
product.xml <products> <product name="diamon-agent-jms" version="1.0.2" directory=“/nfsrepo/ccsoft/diamon/diamon-agent/jms"> <desc>Diamon central JMS agent</desc> <application name="jmsagent"> ... </application> </product> </product>
product.xml <products> <product name="diamon-agent-jms" version="1.0.2" directory=“/nsfrepo/ccsoft/diamon/diamon-agent/jms"> <desc>Diamon central JMS agent</desc> <application name="jmsagent"> ... </application> </product> </product> Location of source file Location of source can be .tar.gz or directory
Introducing Deployment Info <products> <product name="diamon-agent-jms" version="1.0.2” directory="accsoft/diamon/diamon-agent/jms"> <application name=“jmsagent”> <deployment installLocation="/opt/diamon/agent-jms/" > <directory name="conf" mask="550" > <file name="jmsconfig.xml" mask=“755" /> <file name="log/log4j.properties" /> <file name="log/log4j.properties“ source=“/user/nfs/fgr/” /> <file name="log/log4j.properties“ source=“svn://...”/> </directory> <directory name="log" mask="750" /> </deployment> </application> </product> </product> File are copied from source directory
Introducing Deployment Info <products> <product name="diamon-agent-jms" version="1.0.2” directory="accsoft/diamon/diamon-agent/jms"> <desc>Diamon central JMS agent</desc> <application name=“jmsagent”> <deployment installLocation="/opt/diamon/agent-jms/" > <directory name="conf" mask="550" > <file name="jmsconfig.xml" mask=“755" /> <file name="log/log4j.properties" /> <file name="log/log4j.properties“ source=“/user/nfs/fgr/” /> <file name="log/log4j.properties“ source=“svn://...”/> </directory> <directory name="log" mask="750" /> </deployment> </application> </product> </product> File are copied from arbitrary directory
Introducing Deployment Info <products> <product name="diamon-agent-jms" version="1.0.2” directory="accsoft/diamon/diamon-agent/jms"> <desc>Diamon central JMS agent</desc> <application name=“jmsagent”> <deployment installLocation="/opt/diamon/agent-jms/" > <directory name="conf" mask="550" > <file name="jmsconfig.xml" mask=“755" /> <file name="log/log4j.properties" /> <file name="log/log4j.properties“ source=“/user/nfs/fgr/” /> <file name="log/log4j.properties“ source=“svn://...”/> </directory> <directory name="log" mask="750" /> </deployment> </application> </product> </product> File from SVN
Backup Policy <products> <product name="diamon-agent-jms" version="1.0.2” directory="accsoft/diamon/diamon-agent/jms"> <desc>Diamon central JMS agent</desc> <application name=“jmsagent”> <deployment installLocation="/opt/diamon/agent-jms/" > <directory name="conf" mask="550" > <file name="jmsconfig.xml" mask=“755" /> <file name="log/log4j.properties" /> <file name="log/log4j.properties“ source=“/user/nfs/fgr/” /> <file name="log/log4j.properties“ source=“svn://...”/> </directory> <directory name="log" mask="750" /> <backupPolicykeepBackups="2"/> </deployment> </product> </product> ...agent-jms/agent-jms.1/agent-jms.2/
Replace Strings in Files <products> <product name="diamon-agent-jms" version="1.0.2” directory="accsoft/diamon/diamon-agent/jms"> <desc>Diamon central JMS agent</desc> <application name=“jmsagent”> <deployment installLocation="/opt/diamon/agent-jms/" > <directory name="conf" mask="550" > <file name="jmsconfig.xml" mask=“755" /> <file name="log/log4j.properties" /> <file name="log/log4j.properties“ source=“/user/nfs/fgr/” /> <file name="log/log4j.properties“ source=“svn://...”/> </directory> <directory name="log" mask="750" /> <backupPolicykeepBackups="2"/> <replaceString> <file name="bin/start.sh" var="VAR_1" value="my value" /> </replaceString> </deployment> </product> </product>
Tailoring Installation <products> <product name="diamon-agent-jms“ ... > ... <deployment installLocation="/opt/diamon/agent-jms/" > <directory name="conf" mask="550" > <file name="jmsconfig.xml" mask="400" /> <file name="log/log4j.properties" mask="400" /> </directory> <directory name="log" mask="750" /> <backupPolicykeepBackups="2"/> <replaceString> <file name="bin/start.sh" var="VAR_1" value="my value" /> </replaceString> </deployment> <application name="jmsagent"> ... </application> </product> </product>
Application Inheritance <products> <product name="diamon-agent-jms">... <application name=“general”> <deployment installLocation="/opt/diamon/agent-jms/" > ... </deployment> <application> <application name="jmsagent" ><!–global deployment info applies here --> </application> <application name="jmsagent-dev" > <deployment installLocation="/opt/diamon/agent-jms-dev/" > <!– additional to global deployment info --> <directory name="conf"> <file name="log/log4j-dev.properties" /> </directory> </deployment> </application> </product> </product>
Generation of a Startscript <products> <product name="diamon-agent-jms"> ... <deployment installLocation="/opt/diamon/agent-jms/" > ... </deployment> <application name="jmsagent" processName="jmsagent-prod"> <main-class name="cern.diamon.agent.jms.JmsCentralAgent"/> <property name="cmw.mom.brokerlist” value="diamjms1:2506"/> <property name="log4j.configuration" value="$INSTALL_DIR/etc/log4j.properties"/> <property name="agent.jms.configFile" value="$INSTALL_DIR/etc/jmsconfig.xml" /> </application> </product> </product>