Рубрики
Uncategorized

Непрерывная доставка с Apache Maven

Легкая непрерывная доставка с Apache Maven. Помечено Maven, DevOps, Opensource.

На основании сегодняшних требований необходимо выполнить непрерывную доставку ваших артефактов каждым изменением вашего мастера (GIT)/багажника (SVN). Вопрос в том, что вам нужно добиться этого с Maven?

Обычно вы используете так называемый Снимок Версии, что означает, что ваша версия выглядит как 1.2.3-Снимок и указывает на то, что вы в настоящее время работаете над версией выпуска 1.2.3 Отказ После этого вы продолжаете с следующей версией снимка, как 1.2.4-Snapshot и так далее. В зависимости от вашей среды это изменилось, что означает, что каждое изменение, которое вы сделали на Master (Git), вам нужно создать новую версию выпуска, что означает 1.2.3 и дальше будет 1.2.4 Отказ Разработка будет сделана на филиалах, где вам может понадобиться версия снимка.

Давайте посмотрим в один модуль POM файл, который выглядит так:



  4.0.0

  
    com.soebes.smpp
    smpp
    4.0.1
  

  com.soebes.examples.j2ee
  domain
  1.2.3-SNAPSHOT
...

Версия определяется с 1.2.3-Снимок Если вы сейчас звоните:

mvn clean package

Вы будете производить артефакты, которые выглядят как Домен-1.2.3-Snapshot.jar Отказ К сожалению, этот вид артефакта — это то, что может измениться в течение времени на основе философии Maven. Это означает, что если вы теперь сделаете изменение в своем коде и просто сделайте это снова MVN чистый пакет Это создаст тот же Домен-1.2.3-Snapshot.jar файл. Нет никакой реальной разницы, если вы делаете MVN чистая установка вместо. Это будет устанавливать только созданный артефакт в ваш локальный кеш $ Главная/.m2/Репозиторий Отказ Кроме того, если вы делаете MVN Clean Deploy Разница только в том, что каждый раз, когда вы это делаете в своем менеджере репозитория, схема именования немного отличается, что означает, что артефакт будет выглядеть как Домен-1.2.3-20180821.202345-1.jar. . Таким образом, в конце концов артефакт содержит отметку времени. Но самое главное, что Снимка Версии не являются неизменными, так как вы уже могли бы реализовать на основе вышеуказанного.

Таким образом, единственный способ создать настоящие неизменные версии — создавать выбросы с точки зрения Maven. Это означает, что вы должны использовать версию без -Snapshot Отказ Таким образом, в последствии у вас есть файл POM, который выглядит следующее:



  4.0.0

  
    com.soebes.smpp
    smpp
    4.0.1
  

  com.soebes.examples.j2ee
  domain
  1.2.3
...

Так что вы можете сделать MVN Clean Deploy И вы создали неизменяемый релиз артефакта Домен-1.2.3.jar Отказ Если вы попытаетесь сделать это во второй раз, ваш менеджер репозитория скажет вам, что это не работает, потому что релизы определения являются неизменными, что означает, что вы не можете перезаписать их. Таким образом, следствие, если вы сделали изменение/ошибку/исправить вашему проекту, вы должны изменить номер версии. Хорошо, не очень сложно, просто измените версию на 1.2.4 совершать и сделать еще один MVN Clean Deploy ? Так хорошо до сих пор.

Некоторые люди не любят коммиты, когда была изменена только версия. Таким образом, вопрос: есть ли более удобный способ справиться с этим?

Начиная с Maven 3.5.0 + (Я рекомендую использовать самую последнюю версию), есть более удобный способ справиться с этим. Вы можете написать свой файл POM, как следующее:



  4.0.0

  
    com.soebes.smpp
    smpp
    4.0.1
  

  com.soebes.examples.j2ee
  domain
  ${revision}

...

Итак, теперь вы можете просто создать артефакты релиза, используя следующее:

mvn -Drevision=1.2.3 clean package

Это только создаст артефакты в цель Справочник вашего проекта. Если вам нравится развернуть их в репозиторий, есть Улучшения нужны :



  4.0.0

  
    com.soebes.smpp
    smpp
    4.0.1
  

  com.soebes.examples.j2ee
  domain
  ${revision}

  
    
      
        org.codehaus.mojo
        flatten-maven-plugin
        1.0.0
        
          true
        
        
          
            flatten
            process-resources
            
              flatten
            
          
          
            flatten.clean
            clean
            
              clean
            
          
        
      
    
  

Итак, теперь вы можете создать релиз, используя следующую команду:

mvn -Drevision=1.2.3 clean deploy

Но, конечно, версия может быть использована только один раз. Так что если вы хотите сделать другой релиз, вы должны изменить версию Но сейчас это действительно легко:

mvn -Drevision=1.2.4 clean deploy

В настоящее время поддерживается три свойства, которые могут использоваться внутри тега версии:

  1. редакция
  2. Sha1.
  3. список изменений

Только эти три свойства могут использоваться внутри тега версии. Вы можете, конечно, использовать комбинации таких, как это:

${revision}${sha1}${changelist}

Если вы используете разные свойства, вы получите предупреждение Maven. Я настоятельно рекомендую пользователям взять уведомление о предупреждениях, и, конечно, очистите их.

Так как насчет мульти модуля? Там вы можете использовать их. Родитель будет выглядеть так:



  4.0.0

  
    com.soebes.smpp
    smpp
    4.0.1
  

  com.soebes.examples.j2ee
  parent
  ${revision}
  pom
  ..
  [enhancements described earlier]
  ..
  
    webgui
    app
    domain
    service
    service-client
    appasm
    assembly
    shade
  

И ребенок, например Домен будет выглядеть так:



  4.0.0

  
    com.soebes.examples.j2ee
    parent
    ${revision}
  


  domain
  ..

Теперь вы можете построить весь проект с корневого уровня с помощью команды:

mvn -Drevision=1.7.0-SNAPSHOT clean package

Выход будет выглядеть так:

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] parent                                                             [pom]
[INFO] domain                                                             [jar]
[INFO] service-client                                                     [jar]
[INFO] webgui                                                             [war]
[INFO] service                                                            [ejb]
[INFO] app                                                                [ear]
[INFO] appasm                                                             [pom]
[INFO] shade                                                              [jar]
[INFO] assembly                                                           [pom]
[INFO]
[INFO] ------------------< com.soebes.examples.j2ee:parent >-------------------
[INFO] Building parent 1.7.0-SNAPSHOT                                     [1/9]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
....
[INFO]
[INFO] -----------------< com.soebes.examples.j2ee:assembly >------------------
[INFO] Building assembly 1.7.0-SNAPSHOT                                   [9/9]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ assembly ---
[INFO] Deleting /Users/kama/ws-git/javaee/assembly/target
[INFO]
[INFO] --- flatten-maven-plugin:1.0.0:clean (flatten.clean) @ assembly ---
[INFO] Deleting /Users/kama/ws-git/javaee/assembly/.flattened-pom.xml
[INFO]
[INFO] --- jacoco-maven-plugin:0.8.1:prepare-agent (default) @ assembly ---
[INFO] argLine set to -javaagent:/Users/kama/.m2/repository/org/jacoco/org.jacoco.agent/0.8.1/org.jacoco.agent-0.8.1-runtime.jar=destfile=/Users/kama/ws-git/javaee/assembly/target/jacoco.exec
[INFO]
[INFO] --- flatten-maven-plugin:1.0.0:flatten (flatten) @ assembly ---
[INFO] Generating flattened POM of project com.soebes.examples.j2ee:assembly:pom:1.7.0-SNAPSHOT...
[INFO]
[INFO] --- maven-site-plugin:3.7.1:attach-descriptor (attach-descriptor) @ assembly ---
[INFO] No site descriptor found: nothing to attach.
[INFO]
[INFO] --- maven-assembly-plugin:3.0.0:single (assemblies) @ assembly ---
[INFO] Reading assembly descriptor: jar-with-prod.xml
[INFO] Reading assembly descriptor: assembly.xml
[INFO] Reading assembly descriptor: jar-with-dev.xml
[INFO] Building jar: /Users/kama/ws-git/javaee/assembly/target/assembly-1.7.0-SNAPSHOT-prod.jar
[INFO] Building zip: /Users/kama/ws-git/javaee/assembly/target/assembly-1.7.0-SNAPSHOT-archive.zip
[INFO] Building jar: /Users/kama/ws-git/javaee/assembly/target/assembly-1.7.0-SNAPSHOT-dev.jar
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] parent 1.7.0-SNAPSHOT .............................. SUCCESS [  1.535 s]
[INFO] domain ............................................. SUCCESS [  0.876 s]
[INFO] service-client ..................................... SUCCESS [  0.111 s]
[INFO] webgui ............................................. SUCCESS [  0.474 s]
[INFO] service ............................................ SUCCESS [  0.454 s]
[INFO] app ................................................ SUCCESS [  0.282 s]
[INFO] appasm ............................................. SUCCESS [  0.237 s]
[INFO] shade .............................................. SUCCESS [  0.443 s]
[INFO] assembly 1.7.0-SNAPSHOT ............................ SUCCESS [  1.238 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.292 s
[INFO] Finished at: 2018-08-26T15:57:12+02:00
[INFO] ------------------------------------------------------------------------

Таким образом, сейчас действительно легко создать отпуск со всего проекта, используя следующую команду:

mvn -Drevision=1.7.0 clean deploy

Это приведет к выпуску, развернутому диспетчеру репозитория. Так что теперь давайте посмотрим на использование его в непрерывном интеграционном решении, таким как Дженкинс. На Jenkins у вас часто ситуация для производства артефактов на филиальной базе (возможно, снимок на основе возможности развертывать их в тестовые среды). Таким образом, вы можете объединить такие свойства:



  4.0.0

  
    com.soebes.smpp
    smpp
    4.0.1
  

  com.soebes.examples.j2ee
  domain
  ${revision}${sha1}${changelist}

  
    1.0.0
    
    
  
...

В вашем трубопроводе Jenkins вы можете извлечь имя ветви и вставить его в звонок по сборке:

mvn -Dsha1=-BRANCHNAME -Dchangelist=-SNAPSHOT clean deploy

Этот подход имеет то преимущество, что на каждом ветви вы используете другую версию, отличащуюся -Бросковое имя И эти версии — это снимки. Это удобная, потому что все менеджеры репозитои поддерживают версии снимки через некоторое время.

Оригинал: «https://dev.to/khmarbaise/continuous-delivery-with-apache-maven—4i03»