пятница, 27 апреля 2012 г.

Автоматизация бэкапа проекта в JDeveloper

Пояснение: иногда требуется забэкапить текущий проект (это более актуально при SOA и BPM приложениям), но коммитить в систему контроля версии ещё нельзя (например, если сервер непрерывной интеграции слушает систему контроля версии и по изменениям запускается сборка, развертывание и тесты).
  • Настройка:
    1. Запустить JDeveloper;
    2. В меню "Tools" выбрать "External Tools...":
    3. Выбрать тип "External Program":
    4. Далее заполнить поля аналогично:
      В данном случае бэкапы будут складываться в директорию C:\JDeveloper\backups, если требуется то изменить на другую.
    5. Переименовать метку на кнопке:
    6. Поставить галку "Main Toolbar":
  • Проверка:
    1. Нажать на созданную кнопку "Backup Project" - появится окно с запросом ввода метки для данного бэкапа:
    2. В JDeveloper можно увидеть лог выполнения бэкапа:
    3. В директории указанной для бэкапа появится zip-архив проекта с меткой в имени файла:

вторник, 24 апреля 2012 г.

Непрерывная интеграция для Oracle SOA Suite 11g

Программное обеспечение:
  • Сервер непрерывной интеграции: Oracle Enterprise Linux 5.7, JDeveloper 11.1.1.5, Hudson 2.2.0;
  • Сервер SOA: Oracle SOA Suite 11.1.1.5.
С общим понятием об непрерывной интеграции можно ознакомиться здесь, так же рекомендую данную книгу.
В нашем примере к качестве интеграционного сервера будет использоваться Hudson и он будет последовательно выполнять следующие действия:
  1. Периодический опрос SVN-репозитория, в случае наличия изменений выполнение последующих шагов;
  2. Сборка композитов;
  3. Развертываение композитов на SOA-сервере;
  4. Выполнение автотестов;
  5. Публикация отчетов о тестировании.
Последовательность шагов:
  1. Скачиваем дистрибутив Hudson с официального сайта и устанавливаем его.
  2. Создадим в репозитории SNV следующую структуру:
  3. Создать тестовое SOA-приложение (в нашем случае это HelloWorldApplication), включая автотесты для этого приложения (подробнее об их создании для Oracle SOA Suite здесь).
  4. Добавим в SOA-приложение конфигурационный файл с именем build.properties:
    Следующего содержания:
     projects=HelloWorldProject,TestingProject  
     HelloWorldProject.revision=1.0  
     HelloWorldProject.partition=default  
     TestingProject.revision=1.0  
     TestingProject.partition=default  
    
  5. Для каждого композита сгенерировать "Configuration Plan":
    В наименование добавить суффикс dev (для разработческого окружения):
  6. Отредактировать конфигурационный файл build.properties находящийся в директории tools/ant/:
     # global  
     wn.bea.home=/u01/jdeveloper11.1.1.5  
     oracle.home=${wn.bea.home}/jdeveloper  
     java.passed.home=/u01/jdk1.6.0_30  
     wl_home=${wn.bea.home}/wlserver_10.3
      
     # temp  
     tmp.output.dir=/u01/tmp  
     junit.output.dir=../..  
     applications.home=../../apps  
     applications=HelloWorldApplication
      
     deployment.plan.environment=dev 
     
     # dev deployment server weblogic  
     dev.serverURL=http://192.168.2.130:9030   
     dev.user=weblogic    
     dev.password=welcome1   
     dev.overwrite=true 
     dev.forceDefault=true
     
     # testing deployment server weblogic  
     test.serverURL=http://192.168.2.130:8801  
     test.overwrite=true  
     test.user=weblogic  
     test.password=welcome1  
     test.forceDefault=true 
     
     # production deployment server weblogic  
     prod.serverURL=http://192.168.2.130:8001  
     prod.overwrite=true  
     prod.user=weblogic  
     prod.password=welcome1  
     prod.forceDefault=true  
    
    Если структура SVN-репозитория идентична структуре описанной на шаге 2, то изменить значения параметров выделенных красным и настройки развертывания.
  7. Отредактировать конфигурационный файл для каждого окружения (в нашем тестовом примере будем использовать только dev) - файл с именем <окружение>.jndi.properties (в нашем случае это dev.jndi.properties) в директорию tools/ant/:
     java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory  
     java.naming.provider.url=t3://192.168.2.130:9030/soa-infra  
     java.naming.security.principal=weblogic  
     java.naming.security.credentials=welcome1  
     dedicated.connection=true  
     dedicated.rmicontext=true  
    
  8. Теперь настроим Hudson на наш тестовый пример.
    1. Зайти в консоль Hudson, затем "Настроить Hudson" -> "Конфигурирование системы":
    2. Добавляем в секцию JDK используемую версию, а в секцию Ant добавляем входящий в состав JDeveloper из директории jdeveloper/ant:
    3. Создать новую задачу для нашего SOA-приложения (для этого нажать "Новая задача" в консоли Hudson):
    4. Откроется меня настройки проекта (или нажать "Настроить проект"). В "Управление исходным кодом" выбрать "Subversion" и ввести "URL репозитория":
      Если используется авторизация, то нажать "enter credential" и ввести параметры авторизации:
    5. В секции "Триггеры сборки" выбрать "Опрашивать SCM об изменениях" и ввести в поле расписание значение "* * * * *" (это значит что опрашивать каждую минуту):
    6. В секции "Сборка" выбрать "Добавить шаг сборки" и далее выбрать "Вызвать Ant":
    7. Заполнить поля следующим образом:
    8. В секции "Послесборочные операции" выбрать "Publish JUnit test result report" и ввести значение "*.xml":
    9. Сохранить все настройки.
  9. Протестируем работоспособность.
    1. Изменяем любой файл в SVN-репозитории (в течении одной минуты будет запущена сборка);
    2. Нажав на кнопку "Собрать сейчас":
    Для просмотра технической информации по сборке, развертыванию, выполнению тестов можно увидеть в консоли задачи:
    Пример:
     Started by user oracle  
     Updating http://autoteststand/repo/Projects revision: Apr 20, 2012 21:53:53 AM depth:infinity ignoreExternals: false  
     At revision 49  
     no change for http://autoteststand/repo/Projects since the previous build  
     [ant] $ /u01/jdeveloper11.1.1.5/jdeveloper/ant/bin/ant -file build.xml deployAll  
     Buildfile: build.xml  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] Please enter composite directory:  
       [input] Please enter composite name:  
       [input] Please enter composite revision:  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     deployAll:  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] Please enter composite directory:  
       [input] Please enter composite name:  
       [input] Please enter composite revision:  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     deployApplication:  
        [echo] deploy application HelloWorldApplication  
        [echo] deploy application.home ../../apps  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] Please enter composite directory:  
       [input] Please enter composite name:  
       [input] Please enter composite revision:  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     deployProject:  
        [echo] deploy project HelloWorldProject for environment dev  
        [echo] deploy compositeName HelloWorldProject  
        [echo] deploy compositeDir /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] skipping input as property compositeDir has already been set.  
       [input] skipping input as property compositeName has already been set.  
       [input] skipping input as property revision has already been set.  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     clean:  
        [echo] deleting /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/HelloWorldProject/deploy/sca_HelloWorldProject_rev1.0.jar  
       
     init:  
       [mkdir] Created dir: /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/HelloWorldProject/deploy  
       
     scac-validate:  
        [echo] Running scac-validate in /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/HelloWorldProject/composite.xml  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] skipping input as property compositeDir has already been set.  
       [input] skipping input as property compositeName has already been set.  
       [input] skipping input as property revision has already been set.  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     scac:  
        [scac] Validating composite "/var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/HelloWorldProject/composite.xml"  
        [scac] BPEL 2.0 validation of "BPELProcess1" took 136.1 milliseconds  
        [scac] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
        [scac] >> modified xmlbean locale class in use  
        [scac] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
        [scac] info: Validating composite "/var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/HelloWorldProject/composite.xml"  
        [scac] info: Pass  
        [scac] info: File to validate does not exist fault-policies.xml:/var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/HelloWorldProject/fault-policies.xml (No such file or directory)  
        [scac] info: Checking validateMessages....testsuites/TestCase2/messages  
        [scac] info: Begin validateIncludes....testsuites/TestCase2/includes  
        [scac] info: Begin validateTests....testsuites/TestCase2/tests  
        [scac] info:      Check validateTestDocument....testsuites/TestCase2/tests/Test2.1.xml  
        [scac] info:      Check doSchemaValidation....testsuites/TestCase2/tests/Test2.1.xml  
        [scac] info:      Check isSetInitiate ....testsuites/TestCase2/tests/Test2.1.xml  
        [scac] info:      Check WireActionsModel ....testsuites/TestCase2/tests/Test2.1.xml  
        [scac] info:      validateTestDocument Pass  
        [scac] info: validateTests Pass  
        [scac] info: Checking validateMessages....testsuites/TestCase1/messages  
        [scac] info: Begin validateIncludes....testsuites/TestCase1/includes  
        [scac] info: Begin validateTests....testsuites/TestCase1/tests  
        [scac] info:      Check validateTestDocument....testsuites/TestCase1/tests/Test1.xml  
        [scac] info:      Check doSchemaValidation....testsuites/TestCase1/tests/Test1.xml  
        [scac] info:      Check isSetInitiate ....testsuites/TestCase1/tests/Test1.xml  
        [scac] info:      Check WireActionsModel ....testsuites/TestCase1/tests/Test1.xml  
        [scac] info:      validateTestDocument Pass  
        [scac] info:      Check validateTestDocument....testsuites/TestCase1/tests/Test2.xml  
        [scac] info:      Check doSchemaValidation....testsuites/TestCase1/tests/Test2.xml  
        [scac] info:      Check isSetInitiate ....testsuites/TestCase1/tests/Test2.xml  
        [scac] info:      Check WireActionsModel ....testsuites/TestCase1/tests/Test2.xml  
        [scac] info:      validateTestDocument Pass  
        [scac] info: validateTests Pass  
       
     package:  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] skipping input as property compositeDir has already been set.  
       [input] skipping input as property compositeName has already been set.  
       [input] skipping input as property revision has already been set.  
     Trying to override old definition of task scac  
     Trying to override old definition of task attachplan  
     Trying to override old definition of task extractplan  
     Trying to override old definition of task generateplan  
     Trying to override old definition of task validateplan  
     Trying to override old definition of task replaceRevision  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     compile-source:  
       [mkdir] Created dir: /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/HelloWorldProject/dist  
        [copy] Copying 19 files to /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/HelloWorldProject/dist  
        [copy] Warning: /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/HelloWorldProject/src not found.  
        [copy] Copying 2 files to /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/HelloWorldProject/dist/SCA-INF/classes  
        [jar] Building jar: /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/HelloWorldProject/deploy/sca_HelloWorldProject_rev1.0.jar  
       [delete] Deleting directory /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/HelloWorldProject/dist  
        [echo] deploy on http://192.168.2.130:9030 with user weblogic  
        [echo] deploy sarFile /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/HelloWorldProject/deploy/sca_HelloWorldProject_rev1.0.jar  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] Please enter composite directory:  
       [input] Please enter composite name:  
       [input] Please enter composite revision:  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     deploy:  
       [input] skipping input as property serverURL has already been set.  
       [input] skipping input as property sarLocation has already been set.  
     [deployComposite] setting user/password..., user=weblogic  
     [deployComposite] Processing sar=/var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/HelloWorldProject/deploy/sca_HelloWorldProject_rev1.0.jar  
     [deployComposite] Adding sar file - /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/HelloWorldProject/deploy/sca_HelloWorldProject_rev1.0.jar  
     [deployComposite] INFO: Creating HTTP connection to host:192.168.2.130, port:9030  
     [deployComposite] INFO: Received HTTP response from the server, response code=200  
     [deployComposite] ---->Deploying composite success.  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] Please enter composite directory:  
       [input] Please enter composite name:  
       [input] Please enter composite revision:  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     test:  
        [echo] Classpth = /u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.fabric_11.1.1/fabric-ext.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.fabric_11.1.1/fabric-runtime.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.fabric_11.1.1/oracle-soa-client-api.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.mgmt_11.1.1/soa-infra-mgmt.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.bpel_11.1.1/orabpel-common.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.bpel_11.1.1/orabpel.jar:/u01/jdeveloper11.1.1.5/wlserver_10.3/server/lib/weblogic.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jps_11.1.1/jps-api.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jps_11.1.1/jps-common.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jps_11.1.1/jps-internal.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jrf_11.1.1/jrf-api.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.mgmt_11.1.1/soa-client-stubs-was.jar:/u01/jdeveloper11.1.1.5/websphere/runtimes/com.ibm.ws.ejb.thinclient_7.0.0.jar:/u01/jdeveloper11.1.1.5/websphere/runtimes/com.ibm.ws.orb_7.0.0.jar:/u01/jdeveloper11.1.1.5/websphere/plugins/com.ibm.ws.runtime.jar:/u01/jdeveloper11.1.1.5/websphere/runtimes/com.ibm.ws.admin.client_7.0.0.jar  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper HelloWorldProject  
        [echo] Using context = build.properties  
        [echo] Using path = /u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.fabric_11.1.1/fabric-ext.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.fabric_11.1.1/fabric-runtime.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.fabric_11.1.1/oracle-soa-client-api.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.mgmt_11.1.1/soa-infra-mgmt.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.bpel_11.1.1/orabpel-common.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.bpel_11.1.1/orabpel.jar:/u01/jdeveloper11.1.1.5/wlserver_10.3/server/lib/weblogic.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jps_11.1.1/jps-api.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jps_11.1.1/jps-common.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jps_11.1.1/jps-internal.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jrf_11.1.1/jrf-api.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.mgmt_11.1.1/soa-client-stubs-was.jar:/u01/jdeveloper11.1.1.5/websphere/runtimes/com.ibm.ws.ejb.thinclient_7.0.0.jar:/u01/jdeveloper11.1.1.5/websphere/runtimes/com.ibm.ws.orb_7.0.0.jar:/u01/jdeveloper11.1.1.5/websphere/plugins/com.ibm.ws.runtime.jar:/u01/jdeveloper11.1.1.5/websphere/runtimes/com.ibm.ws.admin.client_7.0.0.jar  
       [input] skipping input as property scatest.input has already been set.  
       [input] skipping input as property jndi.properties.input has already been set.  
      [scatest] Junit formatting  
      [scatest] <testsuite name="sca.test-HelloWorldProject.TestCase1" tests="2" errors="0" failures="0" time="0.313"><properties><property name="db.type" value="oracle"/><property name="bpel.host.name" value="oracle-sb.tsretail.ru"/><property name="soa.oracle.home" value="/opt/Middleware/soa_11.1"/><property name="suite.start.date" value="2012-04-20T11:51:18.297+04:00"/><property name="suite.end.date" value="2012-04-20T11:51:18.610+04:00"/><property name="run.start.date" value="2012-04-20T11:51:18.297+04:00"/><property name="run.end.date" value="2012-04-20T11:51:18.644+04:00"/></properties><testcase name="Test1" classname="sca.test-HelloWorldProject.TestCase1.Test1" time="0.313"/><testcase name="Test2" classname="sca.test-HelloWorldProject.TestCase1.Test2" time="0.067"/></testsuite>  
      [scatest] /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../BPEL-sca.test-HelloWorldProject.TestCase1.xml  
      [scatest] <testsuite name="sca.test-HelloWorldProject.TestCase2" tests="1" errors="0" failures="0" time="0.115"><properties><property name="db.type" value="oracle"/><property name="bpel.host.name" value="oracle-sb.tsretail.ru"/><property name="soa.oracle.home" value="/opt/Middleware/soa_11.1"/><property name="suite.start.date" value="2012-04-20T11:51:18.529+04:00"/><property name="suite.end.date" value="2012-04-20T11:51:18.644+04:00"/><property name="run.start.date" value="2012-04-20T11:51:18.297+04:00"/><property name="run.end.date" value="2012-04-20T11:51:18.644+04:00"/></properties><testcase name="Test2.1" classname="sca.test-HelloWorldProject.TestCase2.Test2.1" time="0.115"/></testsuite>  
      [scatest] /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../BPEL-sca.test-HelloWorldProject.TestCase2.xml  
      [scatest] <testsuite name="sca.test-HelloWorldProject.codeCoverages" errors="0" failures="0" tests="0" time="0.0"/>  
      [scatest] /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../BPEL-sca.test-HelloWorldProject.codeCoverages.xml  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] Please enter composite directory:  
       [input] Please enter composite name:  
       [input] Please enter composite revision:  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     deployProject:  
        [echo] deploy project TestingProject for environment dev  
        [echo] deploy compositeName TestingProject  
        [echo] deploy compositeDir /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] skipping input as property compositeDir has already been set.  
       [input] skipping input as property compositeName has already been set.  
       [input] skipping input as property revision has already been set.  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     clean:  
        [echo] deleting /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/TestingProject/deploy/sca_TestingProject_rev1.0.jar  
       
     init:  
       [mkdir] Created dir: /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/TestingProject/deploy  
       
     scac-validate:  
        [echo] Running scac-validate in /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/TestingProject/composite.xml  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] skipping input as property compositeDir has already been set.  
       [input] skipping input as property compositeName has already been set.  
       [input] skipping input as property revision has already been set.  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     scac:  
        [scac] Validating composite "/var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/TestingProject/composite.xml"  
        [scac] BPEL 2.0 validation of "TestBPELProcess" took 1.412 seconds  
        [scac] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
        [scac] >> modified xmlbean locale class in use  
        [scac] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
        [scac] info: Validating composite "/var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/TestingProject/composite.xml"  
        [scac] info: Pass  
        [scac] info: File to validate does not exist fault-policies.xml:/var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/TestingProject/fault-policies.xml (No such file or directory)  
        [scac] info: Checking validateMessages....testsuites/TestSuite1/messages  
        [scac] info: Begin validateIncludes....testsuites/TestSuite1/includes  
        [scac] info: Begin validateTests....testsuites/TestSuite1/tests  
        [scac] info:      Check validateTestDocument....testsuites/TestSuite1/tests/Test2.1.xml  
        [scac] info:      Check doSchemaValidation....testsuites/TestSuite1/tests/Test2.1.xml  
        [scac] info:      Check isSetInitiate ....testsuites/TestSuite1/tests/Test2.1.xml  
        [scac] info:      Check WireActionsModel ....testsuites/TestSuite1/tests/Test2.1.xml  
        [scac] info:      Check WireActionsModel ....testsuites/TestSuite1/tests/Test2.1.xml  
        [scac] info:      validateTestDocument Pass  
        [scac] info:      Check validateTestDocument....testsuites/TestSuite1/tests/Test2.2.xml  
        [scac] info:      Check doSchemaValidation....testsuites/TestSuite1/tests/Test2.2.xml  
        [scac] info:      Check isSetInitiate ....testsuites/TestSuite1/tests/Test2.2.xml  
        [scac] info:      Check WireActionsModel ....testsuites/TestSuite1/tests/Test2.2.xml  
        [scac] info:      validateTestDocument Pass  
        [scac] info:      Check validateTestDocument....testsuites/TestSuite1/tests/Test3.0.xml  
        [scac] info:      Check doSchemaValidation....testsuites/TestSuite1/tests/Test3.0.xml  
        [scac] info:      Check isSetInitiate ....testsuites/TestSuite1/tests/Test3.0.xml  
        [scac] info:      Check WireActionsModel ....testsuites/TestSuite1/tests/Test3.0.xml  
        [scac] info:      Check WireActionsModel ....testsuites/TestSuite1/tests/Test3.0.xml  
        [scac] info:      validateTestDocument Pass  
        [scac] info:      Check validateTestDocument....testsuites/TestSuite1/tests/Test1.1.xml  
        [scac] info:      Check doSchemaValidation....testsuites/TestSuite1/tests/Test1.1.xml  
        [scac] info:      Check isSetInitiate ....testsuites/TestSuite1/tests/Test1.1.xml  
        [scac] info:      Check WireActionsModel ....testsuites/TestSuite1/tests/Test1.1.xml  
        [scac] info:      validateTestDocument Pass  
        [scac] info: validateTests Pass  
       
     package:  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] skipping input as property compositeDir has already been set.  
       [input] skipping input as property compositeName has already been set.  
       [input] skipping input as property revision has already been set.  
     Trying to override old definition of task scac  
     Trying to override old definition of task attachplan  
     Trying to override old definition of task extractplan  
     Trying to override old definition of task generateplan  
     Trying to override old definition of task validateplan  
     Trying to override old definition of task replaceRevision  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     compile-source:  
       [mkdir] Created dir: /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/TestingProject/dist  
        [copy] Copying 18 files to /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/TestingProject/dist  
        [copy] Warning: /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/TestingProject/src not found.  
        [copy] Copying 2 files to /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/TestingProject/dist/SCA-INF/classes  
        [jar] Building jar: /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/TestingProject/deploy/sca_TestingProject_rev1.0.jar  
       [delete] Deleting directory /var/lib/hudson/jobs/HelloWorldApplication/workspace/apps/HelloWorldApplication/TestingProject/dist  
        [echo] deploy on http://192.168.2.130:9030 with user weblogic  
        [echo] deploy sarFile /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/TestingProject/deploy/sca_TestingProject_rev1.0.jar  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] Please enter composite directory:  
       [input] Please enter composite name:  
       [input] Please enter composite revision:  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     deploy:  
       [input] skipping input as property serverURL has already been set.  
       [input] skipping input as property sarLocation has already been set.  
     [deployComposite] setting user/password..., user=weblogic  
     [deployComposite] Processing sar=/var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/TestingProject/deploy/sca_TestingProject_rev1.0.jar  
     [deployComposite] Adding sar file - /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../apps/HelloWorldApplication/TestingProject/deploy/sca_TestingProject_rev1.0.jar  
     [deployComposite] INFO: Creating HTTP connection to host:192.168.2.130, port:9030  
     [deployComposite] INFO: Received HTTP response from the server, response code=200  
     [deployComposite] ---->Deploying composite success.  
        [echo] basedir /u01/jdeveloper11.1.1.5/jdeveloper/bin  
        [echo] current folder /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
        [echo] oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       [input] Please enter composite directory:  
       [input] Please enter composite name:  
       [input] Please enter composite revision:  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper  
       
     test:  
        [echo] Classpth = /u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.fabric_11.1.1/fabric-ext.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.fabric_11.1.1/fabric-runtime.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.fabric_11.1.1/oracle-soa-client-api.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.mgmt_11.1.1/soa-infra-mgmt.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.bpel_11.1.1/orabpel-common.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.bpel_11.1.1/orabpel.jar:/u01/jdeveloper11.1.1.5/wlserver_10.3/server/lib/weblogic.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jps_11.1.1/jps-api.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jps_11.1.1/jps-common.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jps_11.1.1/jps-internal.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jrf_11.1.1/jrf-api.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.mgmt_11.1.1/soa-client-stubs-was.jar:/u01/jdeveloper11.1.1.5/websphere/runtimes/com.ibm.ws.ejb.thinclient_7.0.0.jar:/u01/jdeveloper11.1.1.5/websphere/runtimes/com.ibm.ws.orb_7.0.0.jar:/u01/jdeveloper11.1.1.5/websphere/plugins/com.ibm.ws.runtime.jar:/u01/jdeveloper11.1.1.5/websphere/runtimes/com.ibm.ws.admin.client_7.0.0.jar  
        [echo] Running scatest using oracle.home = /u01/jdeveloper11.1.1.5/jdeveloper TestingProject  
        [echo] Using context = build.properties  
        [echo] Using path = /u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.fabric_11.1.1/fabric-ext.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.fabric_11.1.1/fabric-runtime.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.fabric_11.1.1/oracle-soa-client-api.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.mgmt_11.1.1/soa-infra-mgmt.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.bpel_11.1.1/orabpel-common.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.bpel_11.1.1/orabpel.jar:/u01/jdeveloper11.1.1.5/wlserver_10.3/server/lib/weblogic.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jps_11.1.1/jps-api.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jps_11.1.1/jps-common.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jps_11.1.1/jps-internal.jar:/u01/jdeveloper11.1.1.5/oracle_common/modules/oracle.jrf_11.1.1/jrf-api.jar:/u01/jdeveloper11.1.1.5/jdeveloper/soa/modules/oracle.soa.mgmt_11.1.1/soa-client-stubs-was.jar:/u01/jdeveloper11.1.1.5/websphere/runtimes/com.ibm.ws.ejb.thinclient_7.0.0.jar:/u01/jdeveloper11.1.1.5/websphere/runtimes/com.ibm.ws.orb_7.0.0.jar:/u01/jdeveloper11.1.1.5/websphere/plugins/com.ibm.ws.runtime.jar:/u01/jdeveloper11.1.1.5/websphere/runtimes/com.ibm.ws.admin.client_7.0.0.jar  
       [input] skipping input as property scatest.input has already been set.  
       [input] skipping input as property jndi.properties.input has already been set.  
      [scatest] Junit formatting  
      [scatest] <testsuite name="sca.test-TestingProject.TestSuite1" tests="4" errors="0" failures="0" time="7.389"><properties><property name="db.type" value="oracle"/><property name="bpel.host.name" value="oracle-sb.tsretail.ru"/><property name="soa.oracle.home" value="/opt/Middleware/soa_11.1"/><property name="suite.start.date" value="2012-04-20T11:51:46.894+04:00"/><property name="suite.end.date" value="2012-04-20T11:51:54.283+04:00"/><property name="run.start.date" value="2012-04-20T11:51:46.894+04:00"/><property name="run.end.date" value="2012-04-20T11:51:54.283+04:00"/></properties><testcase name="Test3.0" classname="sca.test-TestingProject.TestSuite1.Test3.0" time="0.166"/><testcase name="Test2.1" classname="sca.test-TestingProject.TestSuite1.Test2.1" time="0.224"/><testcase name="Test1.1" classname="sca.test-TestingProject.TestSuite1.Test1.1" time="7.346"/><testcase name="Test2.2" classname="sca.test-TestingProject.TestSuite1.Test2.2" time="7.304"/></testsuite>  
      [scatest] /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../BPEL-sca.test-TestingProject.TestSuite1.xml  
      [scatest] <testsuite name="sca.test-TestingProject.codeCoverages" errors="0" failures="0" tests="0" time="0.0"/>  
      [scatest] /var/lib/hudson/jobs/HelloWorldApplication/workspace/tools/ant/../../BPEL-sca.test-TestingProject.codeCoverages.xml  
       
     BUILD SUCCESSFUL  
     Total time: 1 minute 7 seconds  
     Recording test results  
     [DEBUG] Skipping watched dependency update; build not configured with trigger: HelloWorldApplication #2  
     Finished: SUCCESS  
    
Экспорт из SVN-репозитория здесь.

P.S. см. так же статью Непрерывная интеграция для Oracle SOA Suite 11g. Альтернативный вариант

воскресенье, 22 апреля 2012 г.

Рекомендации по настройке JVM для Weblogic Server в промышленном окружении

Внимание: описанные ниже рекомендации являются общими без учёта специфики конкретных приложений выполняющихся на сервере приложений Weblogic (например: некоторые фреймворки генерируют большое количество временных объектов, для этого случая, рекомендуется сделать размер nursery больше чем в общей рекомендации, но после проведения мониторинга JVM).

Общие рекомендации для любой JVM:
  • Установите одинаковый размер для initial heap size (параметр -Xms) и maximum heap size (параметр -Xmx);
  • Установить размер heap-а немного больше того, с которого нагрузочные тесты перестают получают исключение Out-of-Memory;
  • Не устанавливайте суммарный размер heap-а всех сервером на физической машине (с точки зрения ОС) больше чем 75% доступной памята.
Рекомендации для JRockit JVM:
  • Установите размер nursery (параметр -Xns) примерно 25-40% от размера heap-а;
  • Установите приоритетный уровень (параметр -XgcPrio) для сборщика мусора на значение по-умолчанию, т.е. throughput.
Рекомендации для Sun JVM:
  • Установите одинаковый размер для initial New Space (параметр -XX:NewSize) и maximum New Space (параметр -XX:MaxNewSize);
  • Установите значение New Space примерно 25% от размера heap-а;
  • Установите Survivor Ratio (параметр -XX:SurvivorRatio) значение 8.

четверг, 19 апреля 2012 г.

Автоматизированное тестирование композитов в Oracle SOA Suite 11g

Рассмотрим автоматизированное тестирование (Unit- или модульное тестирование, подробнее здесь) на примере простейшего композита с BPEL-процессом, который вызывает другой HelloWorld-композит (руководство по созданию здесь).

Последовательность шагов:
  1. Создадим композит (например TestingProject) с BPEL-процессом (например TestBPELProcess), который на входе принимает строку, вызывает HelloWorld-композит и возвращает ответ от вызываемого композита:
  2. Создадим новый набор тестов (TestSuite):
  3. Создадим первый тест (например Test1):
  4. Откроется дизайнер теста:
  5. Проинициализируем входную переменную:
  6. Сгенерируем входную переменную нажав "Generate":
  7. Теперь проинициализируем выходную переменную:
  8. Добавить новое утверждение (Assert), выбрать тип "Assert Output", сгенерировать выходную переменную и изменить её значение:
  9. Получился простейший тест - вводим входную и выходную переменную, если значения совпадут, то тест пройден успешно, если нет, то тест не пройден.
  10. Теперь сделаем простейший тест с использованием эмуляции вызова сервиса (т.е. вместо реального вызова сервиса будет возвращаться определённое значение). Для этого создадим новый тест (например Test2):
  11. Повторить шаги 5-8 для второго теста. Получится следующее:
  12. Далее создадим эмуляцию для сервиса HelloWorldProcess. Для этого:
  13. Перейти в закладку "Emulates" и создать эмуляцию:
  14. Сгенерируем ответ сервиса:
  15. Второй тест получился таким:
  16. Развернём композит на сервере Oracle SOA Suite 11g.
  17. Зайти в Oracle Enterprise Manager Fusion Middleware Control, выбрать наш композит и перейти в закладку "Unit Tests":
  18. Выбрать тесты для запуска и нажать "Execute":
  19. Ввести имя запуска теста:
  20. После окончания выполнения тестов можно увидеть результат выполнения каждого теста:
  21. А так же увидеть детали сравнения на основе которых определяются результаты теста:

среда, 18 апреля 2012 г.

Конфигурирование автоматической миграции сервера

Описание: Описана настройка автоматической миграции серверов в конфигуции с двумя физическими машинами.
ПО: RHEL 5.5, Weblogic 10.3.5.

Есть простой Weblogic-домен следующей конфигурации:
Weblogic сервера:
  • AdminServer - порт 7001;
  • mserver1 - порт 7100.
Есть две физические машины (с точки зрения ОС) с IP-адресами, например:
  • 192.168.2.130
  • 192.168.2.96

Последовательность шагов:
  1. Необходимо разрешить пользователю операционной системы под которым развернут Oracle FMW (в нашем случае - это weblogic) полномочия для запуска команд /sbin/ifconfig и /sbin/arping. Для этого пользователем root добавим в файл /etc/sudoers следующую строку (выделена красным):
     ......
     ## Next comes the main part: which users can run what software on  
     ## which machines (the sudoers file can be shared between multiple  
     ## systems).  
     ## Syntax:  
     ##  
     ##   user  MACHINE=COMMANDS  
     ##  
     ## The COMMANDS section may have other options added to it.  
     ##  
     ## Allow root to run any commands anywhere  
     root  ALL=(ALL)    ALL  
     weblogic    ALL=NOPASSWD:  /sbin/ifconfig,/sbin/arping  
    
     ## Allows members of the 'sys' group to run networking, software,  
     ## service management apps and more.  
     ...... 
  2. Для обеспечения работоспособности необходим дополнительный "плавающий"/виртуальный IP-адрес из той же подсети, например: 192.168.2.139. После этого выполнить следующие команды на первой машине:
     $ sudo /sbin/ifconfig eth0:1 192.168.2.139 netmask 255.255.252.0  
     $ sudo /sbin/arping -q -U -c 3 -I eth0 192.168.2.139  
    
  3. Добавить в переменную PATH следующее (лучше на уровне профиля пользователя, если используется bash, то это файл ~/.bash_profile):
     PATH=$PATH:$MW_HOME/wlserver_10.3/common/nodemanager:$MW_HOME/user_projects/domains/bam_domain/bin/server_migration:$MW_HOME/wlserver_10.3/common/bin  
     export PATH
    
  4. Зайти в mserver1 и ввести Server Listen Address - 192.168.2.139:
  5. Клонируем mserver1 (переходим в "Environment"->"Servers", выбираем mserver1 и нажимаем на кнопку "Clone"). Новый сервер:
    • Server Name - mserver2;
    • Server Listen Address - 192.168.2.96;
    • Server Listen Port - 7200.
  6. Создаем кластер:
    • Name - WLS_Cluster;
    • Messaging Mode - Unicast.
  7. Добавляем в данный кластер оба сервера - mserver1 и mserver2:
  8. На каждой физической машине (с т.з. операционной системы) сконфигурируем по Node Manager-у (подробнее здесь) и создадим две Weblogic-машины (Machines):
    • Machine1 - 192.168.2.130;
    • Machine2 - 192.168.2.96.
  9. Соотнесём Weblogic-сервера и Weblogic-машины следующий образом:
    • mserver1 - Machine1;
    • mserver2 - Machine2.
  10. Создать новый Data Source для механизма контроля миграции (если потребуется, то создать отдельного пользователя в СУБД. Не использовать административных пользователей, таких как SYS и SYSTEM) и соотнесём его с кластером WLS_Cluster:
  11. Создадим необходимую служебную таблицу для механизма контроля миграции, для этого надо выполнить скрипт лежащий в $MW_HOME/wlserver_10.3/server/db/<СУБД>/leasing.ddl.
  12. Если используется технология JMS, то перейти в "Services"->"Persistence Stores" и проверить какие типы Persistence Store-ов используются:
    • Если FileStore, то обеспечить доступ к директориям со второго сервера, как правило для этого используется раздел дискового массива или кластерной файловой системы.
    • Если JDBCStore, то соотнести используемый Data Source с кластером WLS_Cluster.
  13. Необходимо донастроить Node Manager-ы на каждой физической машине, добавить опции для сетевых интерфейсов в файл nodemanager.properties:
     Interface=eth0  
     NetMask=255.255.255.0  
     UseMACBroadcast=true  
    
    где eth0 - имя сетевого интерфейса на котором будет поднят "плавающий"/виртульный IP-адрес.
  14. Затем в Weblogic Console выбрать кластер WLS_Cluster и перейти в "Configuration"->"Migration" и заполнить поле "Data Source For Automatic Migration:", где выбрать созданный Data Source для механизма контроля миграции (см. пункт 11):
  15. Далее перейти в "Environment"->"Servers" выбрать mserver1. Перейти в "Configuration"->"Migration" и поставить галку "Automatic Server Migration Enabled". Аналогично для mserver1:
  16. Перезапустить сервера и протестировать миграцию.