Статьи

Конвейер развертывания для Java EE 7 с WildFly, Arquillian, Jenkins и OpenShift

Технический совет № 54 показал, как Arquillianate (Arquillianize?) Существующего проекта Java EE и запускать эти тесты в удаленном режиме, где WildFly работает на известном хосте и порте. Технический совет № 55 показал, как запускать эти тесты, когда WildFly работает в OpenShift. В обоих этих советах использовались профили Maven для разделения соответствующих зависимостей Arquillian в конфигурации «pom.xml» и <container> в «arquillian.xml», чтобы определить, где работает WildFy и как к нему подключаться.

Этот совет покажет, как настроить Jenkins в OpenShift и вызвать эти тесты из Jenkins. Давайте сначала увидим это в действии!

Конфигурация, необходимая для подключения из Jenkins в OpenShift к экземпляру WildFly в OpenShift, аналогична той, которая требуется для подключения с локального компьютера к WildFly в OpenShift. Эта конфигурация указана в «arquillian.xml», и мы можем указать некоторые параметры, которые затем могут быть определены в Jenkins.

На высоком уровне, вот что мы будем делать:

  • Используйте код, созданный в Tech Tip # 54 и # 55, и добавьте конфигурацию для Arquillian / Jenkins / OpenShift
  • Включить Дженкинс
  • Создайте новый экземпляр WildFly Test
  • Настройте Jenkins для запуска тестов на экземпляре Test
  • Перенесите приложение в производство, только если тесты пройдут на экземпляре теста

Давайте начнем!

  1. Удалите существующий исходный код, только каталог src , из репозитория WildFly git, созданного в Tech Tip # 55 .
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    mywildfly> git rm -rf src/ pom.xml
    rm 'pom.xml'
    rm 'src/main/java/.gitkeep'
    rm 'src/main/resources/.gitkeep'
    rm 'src/main/webapp/WEB-INF/web.xml'
    rm 'src/main/webapp/images/jbosscorp_logo.png'
    rm 'src/main/webapp/index.html'
    rm 'src/main/webapp/snoop.jsp'
    mywildfly> git commit . -m"removing source and pom"
    [master 564b275] removing source and pom
     7 files changed, 647 deletions(-)
     delete mode 100644 pom.xml
     delete mode 100644 src/main/java/.gitkeep
     delete mode 100644 src/main/resources/.gitkeep
     delete mode 100644 src/main/webapp/WEB-INF/web.xml
     delete mode 100644 src/main/webapp/images/jbosscorp_logo.png
     delete mode 100644 src/main/webapp/index.html
     delete mode 100644 src/main/webapp/snoop.jsp
  2. Установите новый удаленный репозиторий javaee7-непрерывной доставки :
    1
    2
    3
    4
    5
    6
    mywildfly> git remote add javaee7 https://github.com/arun-gupta/javaee7-continuous-delivery.git
    mywildfly> git remote -v
    javaee7 https://github.com/arun-gupta/javaee7-continuous-delivery.git (fetch)
    javaee7 https://github.com/arun-gupta/javaee7-continuous-delivery.git (push)
    origin  ssh://54699516ecb8d41cb8000016@mywildfly-milestogo.rhcloud.com/~/git/mywildfly.git/ (fetch)
    origin  ssh://54699516ecb8d41cb8000016@mywildfly-milestogo.rhcloud.com/~/git/mywildfly.git/ (push)
  3. Вытащите код из нового пульта:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    mywildfly> git pull javaee7 master
    warning: no common commits
    remote: Counting objects: 62, done.
    remote: Compressing objects: 100% (45/45), done.
    remote: Total 62 (delta 14), reused 53 (delta 5)
    Unpacking objects: 100% (62/62), done.
    From https://github.com/arun-gupta/javaee7-continuous-delivery
     * branch            master     -> FETCH_HEAD
     * [new branch]      master     -> javaee7/master
    Merge made by the 'recursive' strategy.
     .gitignore                                           |   6 +++
     README.asciidoc                                      |  15 ++++++
     pom.xml                                              | 197 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     src/main/java/org/javaee7/sample/MyApplication.java  |   9 ++++
     src/main/java/org/javaee7/sample/Person.java         |  31 ++++++++++++
     src/main/java/org/javaee7/sample/PersonDatabase.java |  39 ++++++++++++++
     src/main/java/org/javaee7/sample/PersonResource.java |  29 +++++++++++
     src/main/webapp/index.jsp                            |  13 +++++
     src/test/java/org/javaee7/sample/PersonTest.java     |  77 ++++++++++++++++++++++++++++
     src/test/resources/arquillian.xml                    |  26 ++++++++++
     10 files changed, 442 insertions(+)
     create mode 100644 .gitignore
     create mode 100644 README.asciidoc
     create mode 100644 pom.xml
     create mode 100644 src/main/java/org/javaee7/sample/MyApplication.java
     create mode 100644 src/main/java/org/javaee7/sample/Person.java
     create mode 100644 src/main/java/org/javaee7/sample/PersonDatabase.java
     create mode 100644 src/main/java/org/javaee7/sample/PersonResource.java
     create mode 100644 src/main/webapp/index.jsp
     create mode 100644 src/test/java/org/javaee7/sample/PersonTest.java
     create mode 100644 src/test/resources/arquillian.xml

    Это принесет весь исходный код, включая наши конечные точки REST, веб-страницы, тесты, обновленные «pom.xml» и «arquillian.xml». Обновленный «pom.xml» имеет два новых профиля.

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <profile>
     <id>openshift</id>
     <build>
        <plugins>
          <plugin>
                <groupid>org.apache.maven.plugins</groupid>
                <artifactid>maven-war-plugin</artifactid>
                <version>2.3</version>
                <configuration>
                    <failonmissingwebxml>false</failonmissingwebxml>
                    <outputdirectory>deployments</outputdirectory>
                          <warname>ROOT</warname>
                </configuration>
            </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
        <id>jenkins-openshift</id>
        <build>
            <plugins>
                <plugin>
                    <artifactid>maven-surefire-plugin</artifactid>
                    <version>2.14.1</version>
                    <configuration>
                        <systempropertyvariables>
                            <arquillian.launch>jenkins-openshift</arquillian.launch>
                        </systempropertyvariables>
                    </configuration>
                </plugin>
            </plugins>
        </build>
        <dependencies>
            <dependency>
                <groupid>org.jboss.arquillian.container</groupid>
                <artifactid>arquillian-openshift</artifactid>
                <version>1.0.0.Final-SNAPSHOT</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </profile>

    Несколько моментов для наблюдения здесь:

    1. Профиль «openshift» используется при создании приложения на OpenShift. Здесь файл WAR приложения создается и развертывается в WildFly.
    2. Добавлен новый профиль «jenkins-openshift», который будет использоваться экземпляром Jenkins (будет вскоре включен) в OpenShift для запуска тестов.
    3. Зависимость «arquillian-openshift» такая же, как в Tech Tip # 55, и позволяет запускать тесты Arquillian на экземпляре WildFly в OpenShift.
    4. Этот профиль относится к конфигурации контейнера «jenkins-openshift», которая будет определена в «arquillian.xml».

    Обновленный файл «src / test / resources / arquillian.xml» содержит следующий контейнер:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    <container qualifier="jenkins-openshift">
        <configuration>
            <property name="namespace">${env.ARQ_DOMAIN}</property>
            <property name="application">${env.ARQ_APPLICATION}</property>
            <property name="libraDomain">rhcloud.com</property>
            <property name="sshUserName">${env.ARQ_SSH_USER_NAME}</property>
            <property name="login">arungupta@redhat.com</property>
            <property name="deploymentTimeoutInSeconds">300</property>
            <property name="disableStrictHostChecking">true</property>
        </configuration>
    </container>

    Эта конфигурация контейнера аналогична той, которая была добавлена ​​в Tech Tip # 55 . Единственная разница здесь в том, что доменное имя, имя приложения и имя пользователя SSH параметризованы. Значение этих свойств определяется в конфигурации экземпляра Jenkins и позволяет запускать тест для отдельного тестового узла.

  4. Еще две вещи нужно сделать, прежде чем изменения будут отправлены в удаленный репозиторий. Сначала необходимо создать экземпляр WildFly Test, который можно использовать для запуска тестов. Это может быть легко сделано как показано:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    workspaces> rhc app-create mywildflytest jboss-wildfly-8
    Application Options
    -------------------
    Domain:     milestogo
    Cartridges: jboss-wildfly-8
    Gear Size:  default
    Scaling:    no
     
    Creating application 'mywildflytest' ... Artifacts deployed: ./ROOT.war
    done
     
      WildFly 8 administrator added.  Please make note of these credentials:
     
       Username: adminITJt7Yh
       Password: yXP2mUd1w4_8
        
       run 'rhc port-forward mywildflytest' to access the web admin area on port 9990.
     
    Waiting for your DNS name to be available ... done
     
    Cloning into 'mywildflytest'...
    Warning: Permanently added the RSA host key for IP address '54.205.69.88' to the list of known hosts.
     
    Your application 'mywildflytest' is now available.
     
      URL:        http://mywildflytest-milestogo.rhcloud.com/
      SSH to:     546e3743ecb8d49ca9000014@mywildflytest-milestogo.rhcloud.com
      Git remote: ssh://546e3743ecb8d49ca9000014@mywildflytest-milestogo.rhcloud.com/~/git/mywildflytest.git/
      Cloned to:  /Users/arungupta/workspaces/javaee7/mywildflytest
     
    Run 'rhc show-app mywildflytest' for more details about your app.

    Обратите внимание, что доменом является milestogo , имя приложения – mywildflytest , а имя пользователя SSH – 546e3743ecb8d49ca9000014 . Они будут переданы Arquillian для проведения тестов.

  5. Второе – включить и настроить Jenkins. В консоли OpenShift выберите приложение «mywildfly» и нажмите ссылку «Включить Jenkins», как показано ниже:

    techtip56 включения-Дженкинса Помните, что это не ваш экземпляр Test, потому что весь исходный код живет в ранее созданном экземпляре. Укажите соответствующее имя, например, jenkins-milestogo.rhcloud.com в моем случае, и нажмите кнопку «Добавить Jenkins». Это обеспечит наличие экземпляра Jenkins, если его там еще нет, а также настроит проект со сценарием для построения и развертывания приложения. Запишите имя и пароль.

  6. Используйте учетные данные для входа в свой экземпляр Jenkins. Выберите соответствующую сборку «mywildfly-build» в этом случае. Прокрутите вниз до раздела «Сборка» и добавьте следующий скрипт сразу после «# Выполнить тесты здесь» в оболочке «Выполнение»:
    1
    2
    3
    4
    export ARQ_DOMAIN=milestogo
    export ARQ_SSH_USER_NAME=546e3743ecb8d49ca9000014
    export ARQ_APPLICATION=mywildflytest
    mvn test -Pjenkins-openshift

    Нажмите «Сохранить», чтобы сохранить конфигурацию. Это позволит запускать тесты Arquillian на экземпляре Test. Если тесты пройдены, приложение будет развернуто. Если тесты не пройдены, ни один из шагов после этого шага не будет выполнен, и приложение не будет развернуто.

  7. Теперь давайте перенесем изменения в удаленное репо:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    mywildfly> git push
    Counting objects: 68, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (49/49), done.
    Writing objects: 100% (61/61), 8.85 KiB | 0 bytes/s, done.
    Total 61 (delta 14), reused 0 (delta 0)
    remote: Executing Jenkins build.
    remote:
    remote: You can track your build at https://jenkins-milestogo.rhcloud.com/job/mywildfly-build
    remote:
    remote: Waiting for build to schedule............................................................................................Done
    remote: Waiting for job to complete................................................................................................................................................................................................................................................................................................................................................................................................Done
    remote: SUCCESS
    remote: New build has been deployed.
    remote: -------------------------
    remote: Git Post-Receive Result: success
    remote: Deployment completed with status: success
    To ssh://546cef93ecb8d4ff37000003@mywildfly-milestogo.rhcloud.com/~/git/mywildfly.git/
       e8f6c61..e9ad206  master -> master

    Количество точек указывает на ожидание конкретной задачи и, скорее всего, будет варьироваться для разных запусков. И консоль Jenkins ( jenkins-milestogo.rhcloud.com/job/mywildfly-build/1/console ) отображает вывод в виде:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    -------------------------------------------------------
     T E S T S
    -------------------------------------------------------
    Running org.javaee7.sample.PersonTest
    Nov 20, 2014 2:54:56 PM org.jboss.arquillian.container.openshift.OpenShiftContainer start
    INFO: Preparing Arquillian OpenShift container at http://mywildflytest-milestogo.rhcloud.com
    Nov 20, 2014 2:55:48 PM org.jboss.arquillian.container.openshift.OpenShiftRepository push
    INFO: Pushed to the remote repository ssh://546e3743ecb8d49ca9000014@mywildflytest-milestogo.rhcloud.com/~/git/mywildflytest.git/
    Nov 20, 2014 2:56:37 PM org.jboss.arquillian.container.openshift.OpenShiftRepository push
    INFO: Pushed to the remote repository ssh://546e3743ecb8d49ca9000014@mywildflytest-milestogo.rhcloud.com/~/git/mywildflytest.git/
    Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 103.056 sec
    Nov 20, 2014 2:56:37 PM org.jboss.arquillian.container.openshift.OpenShiftContainer stop
    INFO: Shutting down Arquillian OpenShift container at http://mywildflytest-milestogo.rhcloud.com
    Results :
     
    Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
     
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 3:13.069s
    [INFO] Finished at: Thu Nov 20 14:57:34 EST 2014
    [INFO] Final Memory: 10M/101M
    [INFO] ------------------------------------------------------------------------
    + /usr/libexec/openshift/cartridges/jenkins/bin/git_ssh_wrapper.sh 546e36e5e0b8cd4e2a000007@mywildfly-milestogo.rhcloud.com 'gear stop --conditional'
    Warning: Permanently added 'mywildfly-milestogo.rhcloud.com,10.5.171.43' (RSA) to the list of known hosts.
    Stopping gear...
    Stopping wildfly cart
    Sending SIGTERM to wildfly:418673 ...
    + rsync --delete-after -azO -e /usr/libexec/openshift/cartridges/jenkins/bin/git_ssh_wrapper.sh /var/lib/openshift/546e46304382ec3f29000012//.m2/ '546e36e5e0b8cd4e2a000007@mywildfly-milestogo.rhcloud.com:~/.m2/'
    Warning: Permanently added 'mywildfly-milestogo.rhcloud.com,10.5.171.43' (RSA) to the list of known hosts.
    + rsync --delete-after -azO -e /usr/libexec/openshift/cartridges/jenkins/bin/git_ssh_wrapper.sh /var/lib/openshift/546e46304382ec3f29000012/app-root/runtime/repo/deployments/ '546e36e5e0b8cd4e2a000007@mywildfly-milestogo.rhcloud.com:${OPENSHIFT_REPO_DIR}deployments/'
    Warning: Permanently added 'mywildfly-milestogo.rhcloud.com,10.5.171.43' (RSA) to the list of known hosts.
    + rsync --delete-after -azO -e /usr/libexec/openshift/cartridges/jenkins/bin/git_ssh_wrapper.sh /var/lib/openshift/546e46304382ec3f29000012/app-root/runtime/repo/.openshift/ '546e36e5e0b8cd4e2a000007@mywildfly-milestogo.rhcloud.com:${OPENSHIFT_REPO_DIR}.openshift/'
    Warning: Permanently added 'mywildfly-milestogo.rhcloud.com,10.5.171.43' (RSA) to the list of known hosts.
    + /usr/libexec/openshift/cartridges/jenkins/bin/git_ssh_wrapper.sh 546e36e5e0b8cd4e2a000007@mywildfly-milestogo.rhcloud.com 'gear remotedeploy'
    Warning: Permanently added 'mywildfly-milestogo.rhcloud.com,10.5.171.43' (RSA) to the list of known hosts.
    Preparing build for deployment
    Deployment id is dff28e58
    Activating deployment
    Deploying WildFly
    Starting wildfly cart
    Found 127.12.255.129:8080 listening port
    Found 127.12.255.129:9990 listening port
    /var/lib/openshift/546e36e5e0b8cd4e2a000007/wildfly/standalone/deployments /var/lib/openshift/546e36e5e0b8cd4e2a000007/wildfly
    /var/lib/openshift/546e36e5e0b8cd4e2a000007/wildfly
    CLIENT_MESSAGE: Artifacts deployed: ./ROOT.war
    Archiving artifacts
    Finished: SUCCESS

    Файлы журнала для Jenkins можно просмотреть, как показано на рисунке:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Nov 20, 2014 2:51:11 PM hudson.plugins.openshift.OpenShiftCloud provision
    INFO: Provisioning new node for workload = 2 and label = mywildfly-build in domain milestogo
    Nov 20, 2014 2:51:11 PM hudson.plugins.openshift.OpenShiftCloud getOpenShiftConnection
    INFO: Initiating Java Client Service - Configured for OpenShift Server https://openshift.redhat.com
    Nov 20, 2014 2:51:11 PM com.openshift.internal.client.RestService request
    INFO: Requesting GET with protocol 1.2 on https://openshift.redhat.com/broker/rest/api
    Nov 20, 2014 2:51:11 PM com.openshift.internal.client.RestService request
    INFO: Requesting GET with protocol 1.2 on https://openshift.redhat.com/broker/rest/user
    Nov 20, 2014 2:51:11 PM com.openshift.internal.client.RestService request
     
    . . .
     
    INFO: Checking availability of computer hudson.plugins.openshift.OpenShiftSlave@8ce21115
    Nov 20, 2014 2:53:35 PM com.openshift.internal.client.RestService request
    INFO: Requesting GET with protocol 1.2 on https://openshift.redhat.com/broker/rest/domain/milestogo/application/mywildflybldr/gear_groups
    Nov 20, 2014 2:53:35 PM hudson.plugins.openshift.OpenShiftComputerLauncher launch
    INFO: Checking SSH access to application mywildflybldr-milestogo.rhcloud.com
    Nov 20, 2014 2:53:35 PM hudson.plugins.openshift.OpenShiftComputerLauncher launch
    INFO: Connecting via SSH '546e46304382ec3f29000012' 'mywildflybldr-milestogo.rhcloud.com' '/var/lib/openshift/546e393e5973ca0492000070/app-root/data/.ssh/jenkins_id_rsa'
    Nov 20, 2014 2:53:35 PM hudson.slaves.NodeProvisioner update
    INFO: mywildfly-build provisioningE successfully completed. We have now 2 computer(s)
    Nov 20, 2014 2:53:35 PM hudson.plugins.openshift.OpenShiftComputerLauncher launch
    INFO: Connected via SSH.
    Nov 20, 2014 2:53:35 PM hudson.plugins.openshift.OpenShiftComputerLauncher launch
    INFO: Exec mkdir -p $OPENSHIFT_DATA_DIR/jenkins && cd $OPENSHIFT_DATA_DIR/jenkins && rm -f slave.jar && wget -q --no-check-certificate https://jenkins-milestogo.rhcloud.com/jnlpJars/slave.jar
    Nov 20, 2014 2:53:42 PM hudson.plugins.openshift.OpenShiftComputerLauncher launch
    INFO: Slave connected.
    Nov 20, 2014 2:58:24 PM hudson.model.Run execute
    INFO: mywildfly-build #1 main build action completed: SUCCESS

    Это показывает, что приложение было успешно развернуто на mywildfly-milestogo.rhcloud.com/index.jsp и выглядит примерно так:

    techtip56-mywildfly-выход-тесты, прохождение

Теперь измените «src / main / webapp / index.jsp», чтобы показать другой заголовок. И измените «src / test / java / org / javaee7 / sample / PersonTest.java», чтобы один из тестов не прошел. Выполнение «git commit» и «git push» показывает следующие результаты в командной строке:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mywildfly> git commit . -m"breaking the test"
[master ff2de09] breaking the test
 2 files changed, 2 insertions(+), 2 deletions(-)
mywildfly> git push
Counting objects: 23, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (12/12), 771 bytes | 0 bytes/s, done.
Total 12 (delta 5), reused 0 (delta 0)
remote: Executing Jenkins build.
remote:
remote: You can track your build at https://jenkins-milestogo.rhcloud.com/job/mywildfly-build
remote:
remote: Waiting for build to schedule.......Done
remote: Waiting for job to complete.....................................................................................................................................................................Done
remote: FAILED
remote: !!!!!!!!
remote: Deployment Halted!
remote: If the build failed before the deploy step, your previous
remote: build is still running.  Otherwise, your application may be
remote: partially deployed or inaccessible.
remote: Fix the build and try again.
remote: !!!!!!!!
remote: An error occurred executing 'gear postreceive' (exit code: 1)
remote: Error message: CLIENT_ERROR: Failed to execute: 'control post-receive' for /var/lib/openshift/546e36e5e0b8cd4e2a000007/jenkins-client
remote:
remote: For more details about the problem, try running the command again with the '--trace' option.
To ssh://546e36e5e0b8cd4e2a000007@mywildfly-milestogo.rhcloud.com/~/git/mywildfly.git/
   d618fad..ff2de09  master -> master

Ключевое утверждение, на которое следует обратить внимание, заключается в том, что развертывание прекращается после сбоя тестов. И вы можете убедиться в этом, посетив mywildfly-milestogo.rhcloud.com/index.jsp и убедившись, что обновленный «index.jsp» не виден.

Одним словом, тесты проходят, сайт обновляется. И тесты не пройдены, сайт не обновляется. Итак, вы создали простой конвейер развертывания для Java EE 7 с использованием WildFly, OpenShift, Arquillian и Jenkins!