Récupérer, Compiler, Exporter un projet Oracle Service Bus

Le nombre de déploiements peut devenir très important durant un projet de développement, et couplé au versionning, le déploiement peut devenir très complexe. Les techniques d’intégration continue sont maintenant largement répandues et employées par les entreprises pour maximiser l’efficacité du déploiement.
Oracle Service Bus est compatible et s’inscrit dans cet démarche. En effet, toutes les ressources sont gérées à l’aide de scripts ANT/WLST, de compilation, de packaging, de déploiement, de test …
Dans cet article nous allons construire la chaine d’orchestration permettant de créer l’intégration continue de vos projets OSB.
Les étapes clés de cette intégration sont :

  • la récupération du projet stocké sur le SVN
  • la configuration du fichier de personnalisation du projet
  • la configuration projet de configuration OSB
  • la création du JAR
  • l’export du JAR sur le serveur OSB

Fichier de propriétés
Commençons par créer notre fichier de propriétés, il contient les informations relatives à notre environnement, la liste des projets à déployer et les informations relatives à chaque projet :
[sourcecode language= »java »]
#############################################
######## OSB Deployment build.properties file
#############################################
# Environnement
osb.dev.fmw.home = /osb11g
osb.dev.fmw.osb.home = /osb11g/Oracle_OSB1
osb.dev.eclipse.home = /osb11g/oepe_11gR1PS2
osb.dev.wl.home = /osb11g/wlserver_10.3
osb.dev.wls.server.url.admin =  t3://localhost:7001
osb.dev.wls.username = weblogic
osb.dev.wls.password = weblogic1
osb.dev.wls.passphrase = osb
osb.dev.import.project = Default
osb.dev.wls.instance = AdminServer
osb.dev.wls.domain.name = osb_domain
# Repository SVN
svn.url = http://svnhost:port/repo
svn.username = login
svn.password = password
dev.svn.branch = /trunk
# Configuration project
config.project = OSB_CONFIGURATION
config.includeDependencies = true
#Liste des projet à déployer
osb.project.to.deploy = project1,project2
# Project 1
project1.project.svn.dir = /OSB/PROJECT_1
project1.project.name = PROJECT_1
project1.cfg.file = PROJECT_1.xml
# Project 2
project1.project.svn.dir = /OSB/PROJECT_1
project1.project.name = PROJECT_1
project1.cfg.file = PROJECT_1.xml
[/sourcecode]
Scripts ANT
Nous avons besoin de plusieurs scripts ANT, le premier initialise les propriétés, le second nous permet de nous connecter au SVN, et le troisième gère la configuration et l’export du projet.
ANT OSB Common
Ce fichier initialise les propriétés nécessaires au déploiement.
[sourcecode language= »xml »]
<?xml version="1.0" encoding="iso-8859-1"?>
<project name="ant-osb-common" basedir=".">
<property file="../../../config/environnement.properties"/>
<property file="./../config/deployment.properties"/>
<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
<propertycopy name="fmw.home" from="osb.${environnement}.fmw.home" silent="true"/>
<propertycopy name="fmw.osb.home" from="osb.${environnement}.fmw.osb.home" silent="true"/>
<propertycopy name="eclipse.home" from="osb.${environnement}.eclipse.home" silent="true"/>
<propertycopy name="wl.home" from="osb.${environnement}.wl.home" silent="true"/>
<propertycopy name="wls.server.url.admin" from="osb.${environnement}.wls.server.url.admin" silent="true"/>
<propertycopy name="wls.username" from="osb.${environnement}.wls.username" silent="true"/>
<propertycopy name="wls.password" from="osb.${environnement}.wls.password" silent="true"/>
<propertycopy name="wls.passphrase" from="osb.${environnement}.wls.passphrase" silent="true"/>
<propertycopy name="import.project" from="osb.${environnement}.import.project" silent="true"/>
<propertycopy name="svn.url" from="svn.url" silent="true"/>
<propertycopy name="svn.username" from="svn.username" silent="true"/>
<propertycopy name="svn.password" from="svn.username" silent="true"/>
<propertycopy name="svn.branch" from="${environnement}.svn.branch" silent="true"/>
<property environment="env"/>
<property name="domain.import.script"   value="../wlst/import.py"/>
<property name="build"                  value="build"/>
<property name="dist"                   value="dist"/>
<property name="workspace.dir" value="${basedir}/tmp"/>
<property name="metadata.dir" value="${workspace.dir}/.metadata"/>
</project>
[/sourcecode]
ANT SVN Command
Ce fichier fait le checkout d’un projet OSB et le copie dans le répertoire bin/tmp
[sourcecode language= »xml »]
<?xml version="1.0"?>
<!– Sample build file used to retrieve svnant’s sources –>
<project name="svn-soa" basedir="." default="main">
<!– Répertoire contenant les lib SVN –>
<path id="svnant.classpath">
<fileset dir="../lib">
<include name="**/*.jar"/>
</fileset>
</path>
<!– chargement de la librairie SVN et des tâches associées –>
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath" />
<!– Tache récupérant de récupération d’un projet situé sur le SVN–>
<target name="checkout">
<!– Initialisation des propriétés –>
<propertycopy name="project.svn.dir" from="${prefix}.project.svn.dir" silent="true"/>
<propertycopy name="project.name" from="${prefix}.project.name" silent="true"/>
<!– Suppression du dossier tmp dans lequel les projets sont récupérés –>
<!– Pour ne pas risquer de déployer une copie obsolète –>
<delete dir="tmp/${project.name}"/>
<!– Récupération du projet SVN et dépôt dans le dossier tmp –>
<svn username="${svn.username}" password="${svn.password}">
<checkout url="${svn.url}${svn.branch}${project.svn.dir}" revision="HEAD" destPath="tmp/${project.name}" />
</svn>
</target>
<!– Opération appelé par défaut  –>
<!– Elle parcourt la liste des composites à déployer, et transmet leur nom à la tache de checkout  –>
<target name="main">
<foreach list="${composite.to.deploy}" delimiter="," param="prefix" target="checkout" inheritall="true"/>
</target>
</project>
[/sourcecode]
ANT OSB Export
Ce fichier contient les taches permettant d’orchestrer le déploiement.
[sourcecode language= »xml »]
<?xml version="1.0" encoding="iso-8859-1"?>
<project name="ant-osb-export" default="main" basedir=".">
<import file="${basedir}/ant-osb-common.xml"/>
<import file="${basedir}/ant-svn-command.xml"/>
<!– @@ Configuration du classpath et définition des taches ANT @@ –>
<path id="class.path">
<pathelement path="${fmw.home}/wlserver_10.3/server/lib/weblogic.jar"/>
<pathelement path="${fmw.home}/Oracle_OSB1/lib/alsb.jar"/>
<pathelement path="${fmw.home}/Oracle_OSB1/modules/com.bea.common.configfwk_1.3.0.0.jar"/>
</path>
<taskdef name="wlst" classname="weblogic.ant.taskdefs.management.WLSTTask">
<classpath>
<pathelement path="${fmw.home}/wlserver_10.3/server/lib/weblogic.jar"/>
<pathelement path="${fmw.home}/Oracle_OSB1/lib/alsb.jar"/>
<pathelement path="${fmw.home}/Oracle_OSB1/modules/com.bea.common.configfwk_1.3.0.0.jar"/>
</classpath>
</taskdef>
<!– @@ Tache principale, elle parcourt la liste des projets à exporter définit
dans le fichier de propriétés @@ –>
<target name="main">
<foreach list="${osb.project.to.deploy}" delimiter="," param="prefix" target="configureCustomizationFile" inheritall="true"/>
</target>
<!– @@ Tache configurant le customization file associé au projet  @@ –>
<target name="configureCustomizationFile">
<!– @ Récupération du nom du projet –>
<propertycopy name="cfg.file" from="${prefix}.cfg.file" silent="true"/>
<!– @ Suppression du fichier de préférence présent et copie du fichier à modifier –>
<delete file="tmp/${cfg.file}"/>
<copy file="../plan/${cfg.file}" todir="tmp"/>
<!– @ Configuration du fichier, on remplace le token par les valeurs nécessaires –>
<replace dir="tmp">
<include name="${cfg.file}"/>
<replacefilter token="@@SOA_SERVER_URL@@" value="${wls.server.url.soa}"/>
<replacefilter token="@@SAS_DIRECTORY@@" value="${completeSASDirectory}"/>
</replace>
<!– @ Appel de la tache suivante –>
<antcall target="configureOSBConfiguration">
<param name="prefix" value="${prefix}"/>
<param name="customization.file" value="jars/${cfg.file}"/>
</antcall>
</target>
<!– @@ Cette tache ajoute le projet à exporter au projet de configuration @@ –>
<target name="configureOSBConfiguration">
<!– @ Récupération du nom du projet –>
<propertycopy name="project.name" from="${prefix}.project.name" silent="true"/>
<!– @ Suppression du fichier de préférence présent et copie du fichier à modifier –>
<delete file="tmp/OSB_CONFIGURATION/.settings/com.bea.alsb.core.prefs"/>
<copy file="../config/com.bea.alsb.core.prefs" todir="tmp/OSB_CONFIGURATION/.settings"/>
<!– @ Configuration du fichier de préférence, on remplace le token par le nom du projet –>
<replace dir="tmp/OSB_CONFIGURATION/.settings">
<include name="com.bea.alsb.core.prefs"/>
<replacefilter token="@@PROJECT_NAME@@" value="${project.name}"/>
</replace>
<!– @ Appel de la tache suivante –>
<antcall target="exportProjectToConfigurationJar">
<param name="prefix" value="${prefix}"/>
<param name="customization.file" value="jars/${cfg.file}"/>
</antcall>
</target>
<!– @@ Cette tache ajoute le projet à exporter au projet de configuration et créér le JAR @@ –>
<target name="exportProjectToConfigurationJar">
<!– @ Récupération du nom du projet –>
<propertycopy name="project.name" from="${prefix}.project.name" silent="true"/>
<!– @ Remise à zero des métadonnées du workspace en supprimant le dossier .metadata –>
<delete failonerror="false" includeemptydirs="true" dir="${metadata.dir}"/>
<!– @ Configuration des propriétés pour la création du jar –>
<property name="config.jar" location="./tmp/${project.name}.jar" />
<property name="subproject" value="${project.name}" />
<!– @ Appel du plugin de création de jar –>
<java dir="${eclipse.home}"
jar="${eclipse.home}/plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar"
fork="true" failonerror="true" maxmemory="768m">
<jvmarg line="-XX:MaxPermSize=256m"/>
<arg line="-data ${workspace.dir}"/>
<arg line="-application com.bea.alsb.core.ConfigExport"/>
<arg line="-configProject ${config.project}" />
<arg line="-configJar ${config.jar}"/>
<arg line="-configSubProjects ${subproject}"/>
<arg line="-includeDependencies ${config.includeDependencies}"/>
<sysproperty key="weblogic.home" value="${wl.home}"/>
<sysproperty key="osb.home" value="${fmw.osb.home}"/>
<sysproperty key="osgi.bundlefile.limit" value="500"/>
<sysproperty key="harvester.home" value="${osb.home}/harvester"/>
<sysproperty key="osgi.nl" value="en_US"/>
<sysproperty key="sun.lang.ClassLoader.allowArraySyntax" value="true"/>
</java>
<!– @ Appel de la tache suivante –>
<antcall target="importProjectToOSBServer">
<param name="config.jar" value="${config.jar}"/>
<param name="customization.file" value="tmp/${cfg.file}"/>
</antcall>
</target>
<!– @@ Cette tache exporte le JAR sur le serveur OSB @@ –>
<target name="importProjectToOSBServer">
<java classname="weblogic.WLST" fork="true">
<arg line="${domain.import.script} ${wls.server.url.admin} ${wls.username}
${wls.password} ${wls.passphrase} ${import.project}
${config.jar} ${customization.file}"/>
<classpath refid="class.path"/>
</java>
</target>
</project>
[/sourcecode]
SCRIPT WLST
Ce script permet de déployer un projet OSB, en utilisant un fichier de customisation.
[sourcecode language= »py »]
<pre>from java.util import HashMap
from java.util import HashSet
from java.util import ArrayList
from java.io import FileInputStream
from com.bea.wli.sb.util import Refs
from com.bea.wli.config.customization import Customization
from com.bea.wli.sb.management.importexport import ALSBImportOperation
import sys
#=======================================================================================
# Entry function to deploy project configuration and resources
#        into a ALSB domain
#=======================================================================================
def importToALSBDomain(URL, user, password, pphrase, projectName, configurationJar, customizationFile):
try:
SessionMBean = ‘None’
adminUrl = URL
importUser = user
importPassword = password
importJar = configurationJar
customFile = customizationFile
passphrase = pphrase
project = projectName
connectToServer(importUser, importPassword, adminUrl)
theBytes = readBinaryFile(importJar)
sessionName = createSessionName()
SessionMBean = getSessionManagementMBean(sessionName)
ALSBConfigurationMBean = findService(String("ALSBConfiguration.").concat(sessionName), "com.bea.wli.sb.management.configuration.ALSBConfigurationMBean")
ALSBConfigurationMBean.uploadJarFile(theBytes)
if project == ‘None’:
alsbJarInfo = ALSBConfigurationMBean.getImportJarInfo()
alsbImportPlan = alsbJarInfo.getDefaultImportPlan()
alsbImportPlan.setPassphrase(passphrase)
alsbImportPlan.setPreserveExistingEnvValues(true)
importResult = ALSBConfigurationMBean.importUploaded(alsbImportPlan)
SessionMBean.activateSession(sessionName, "Complete test import with customization using wlst")
else:
alsbJarInfo = ALSBConfigurationMBean.getImportJarInfo()
alsbImportPlan = alsbJarInfo.getDefaultImportPlan()
alsbImportPlan.setPassphrase(passphrase)
operationMap=HashMap()
operationMap = alsbImportPlan.getOperations()
printOpMap(operationMap)
set = operationMap.entrySet()
alsbImportPlan.setPreserveExistingEnvValues(true)
#boolean
abort = false
#list of created ref
createdRef = ArrayList()
for entry in set:
ref = entry.getKey()
op = entry.getValue()
#set different logic based on the resource type
type = ref.getTypeId
if type == Refs.SERVICE_ACCOUNT_TYPE or type == Refs.SERVICE_PROVIDER_TYPE:
if op.getOperation() == ALSBImportOperation.Operation.Create:
print ‘Unable to import a service account or a service provider on a target system’, ref
abort = true
elif op.getOperation() == ALSBImportOperation.Operation.Create:
#keep the list of created resources
createdRef.add(ref)
if abort == true :
print ‘This jar must be imported manually to resolve the service account and service provider dependencies’
SessionMBean.discardSession(sessionName)
raise
print
print ‘Modified importPlan’
printOpMap(operationMap)
importResult = ALSBConfigurationMBean.importUploaded(alsbImportPlan)
printDiagMap(importResult.getImportDiagnostics())
if importResult.getFailed().isEmpty() == false:
print ‘One or more resources could not be imported properly’
raise
#customize if a customization file is specified
#affects only the created resources
if customFile != ‘None’ :
print ‘Loading customization File’, customFile
print ‘Customization applied to the created resources only’, createdRef
iStream = FileInputStream(customFile)
customizationList = Customization.fromXML(iStream)
filteredCustomizationList = ArrayList()
setRef = HashSet(createdRef)
# apply a filter to all the customizations to narrow the target to the created resources
for customization in customizationList:
print customization
newcustomization = customization.clone(setRef)
filteredCustomizationList.add(newcustomization)
ALSBConfigurationMBean.customize(filteredCustomizationList)
SessionMBean.activateSession(sessionName, "Complete test import with customization using wlst")
print "Deployment of : " + importJar + " successful"
except:
print "Unexpected error:", sys.exc_info()[0]
if SessionMBean != None:
SessionMBean.discardSession(sessionName)
raise
#=======================================================================================
# Utility function to print the list of operations
#=======================================================================================
def printOpMap(map):
set = map.entrySet()
for entry in set:
op = entry.getValue()
print op.getOperation(),
ref = entry.getKey()
print ref
print
#=======================================================================================
# Utility function to print the diagnostics
#=======================================================================================
def printDiagMap(map):
set = map.entrySet()
for entry in set:
diag = entry.getValue().toString()
print diag
print
#=======================================================================================
# Utility function to load properties from a config file
#=======================================================================================
def loadProps(configPropFile):
propInputStream = FileInputStream(configPropFile)
configProps = Properties()
configProps.load(propInputStream)
return configProps
#=======================================================================================
# Connect to the Admin Server
#=======================================================================================
def connectToServer(username, password, url):
connect(username, password, url)
domainRuntime()
#=======================================================================================
# Utility function to read a binary file
#=======================================================================================
def readBinaryFile(fileName):
file = open(fileName, ‘rb’)
bytes = file.read()
return bytes
#=======================================================================================
# Utility function to create an arbitrary session name
#=======================================================================================
def createSessionName():
sessionName = String("SessionScript"+Long(System.currentTimeMillis()).toString())
return sessionName
#=======================================================================================
# Utility function to load a session MBeans
#=======================================================================================
def getSessionManagementMBean(sessionName):
SessionMBean = findService("SessionManagement", "com.bea.wli.sb.management.configuration.SessionManagementMBean")
SessionMBean.createSession(sessionName)
return SessionMBean
# IMPORT script init
try:
# import the service bus configuration
# argv[1] is the weblogic Admin server URL
# argv[2] is the weblogic server user
# argv[3] is the weblogic server password
# argv[4] is the weblogic passphrase
# argv[5] is the project name
# argv[6] is the configuration jar name
# argv[7] is the customization file name
importToALSBDomain(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6], sys.argv[7])
except:
print "Unexpected error: ", sys.exc_info()[0]
dumpStack()
raise
[/sourcecode]

2 réflexions sur “Récupérer, Compiler, Exporter un projet Oracle Service Bus”

  1. C’est possible d’utiliser ce script pour exporter des ressources spécifiés au lieu du projet complet .

  2. Ping : Oracle Enterprise Pack for Eclipse (aka OEPE) « EASYTEAM LE BLOG

Les commentaires sont fermés.