Статьи

Maven Build Progress с сообщениями службы TeamCity


Когда вы запускаете длинную конфигурацию сборки Maven в TeamCity, может быть сложно узнать, какой модуль собирается в
данный момент, поскольку все дисплеи TeamCity либо
«Работают», либо
«Тесты пройдены: Х» .

К счастью, TeamCity позволяет вашему сценарию сборки взаимодействовать с сервером с помощью служебных сообщений . Когда вы создаете сценарий, выдает следующую команду, TeamCity читает ее и ведет себя соответственно.

Таким образом, можно сообщать о результатах компиляции или тестирования , публиковать артефакты (вы можете найти сообщения «## teamcity [publishArtifacts» в журнале сборки IntelliJ IDEA ) и даже обновлять параметры сборки на лету. Однако, что меня заинтересовало, так это отчет о ходе сборки :

Добавление одного println в сборку Maven можно выполнить с помощью небольшого количества скриптов Groovy:

<plugin>
  <groupId>org.codehaus.gmaven</groupId>
  <artifactId>gmaven-plugin</artifactId>
  <version>1.4</version>
  <executions>
    <execution>
      <id>display-progress-report</id>
      <phase>initialize</phase>
      <goals>
        <goal>execute</goal>
      </goals>
      <configuration>
        <providerSelection>1.8</providerSelection>
        <source>
        if ( System.getProperty( 'teamcity.version' ))
        {
          println "##teamcity[progressMessage '${project.groupId}:${project.artifactId}']"
        }
        </source>
      </configuration>
    </execution>
  </executions>
</plugin>

После добавления этого фрагмента в родительский POM проекта индикатор выполнения становится (смотрите его вживую! )

И сейчас я работаю над тем, чтобы сделать эту функциональность встроенной для TeamCity 7.1.

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

allprojects {
    ...
    if ( project.properties.teamcity )
    {
        tasks.all { it.doFirst {
            logger.lifecycle( "##teamcity[progressMessage ':${project.name}:${it.name}']" )
        }}
    }
    ...
}