At Q42 we use TeamCity for our Continuous Integration. When working on a project created with the Play Framework we found out that it does not play well with Team City out of the box. Since there seems to be little information about this topic we will walk you through it.

Assumptions

For this tutorial, we assume the following:

  • TeamCity 6.5 is installed and configured on a Windows machine
  • Play 1.2.4

Configure the build agents

Install Play framework

Download and unzip the Play Framework on all your agents. For example: C:Toolsplay-1.2.4

Create one .bat file in C:Toolsplay-1.2.4

  • play-autotest-teamcity.bat
  • This batch file will first compile the play project and auto-test it. If compilation of your project fails or tests fail play will not return different exit codes. This is why we need to validate that the tests have been ran manually by checking for existing test result files.
  • ::this script should be called from your projects working directory

    ::run play to compile our project and let it test
    CALL C:Toolsplay-1.2.4play.bat auto-test

    ::verify that the unit tests have been ran
    @IF EXIST test-resultresult.passed @(
    @ECHO Play tests returned .passed file;
    EXIT 0;
    )
    @IF EXIST test-resultresult.failed @(
    @ECHO Play tests returned .failed file;
    EXIT 1;
    )

    @ECHO Compiling Play Framework project failed! No tests output exists in test-result folder. See build log for details. 1>&2
    EXIT 2;

Create agent requirement property

Open the installation folder of your build agents and modify theconfbuildAgent.properties file. Add the following on a newline:

env.frameworks.java.play=1.2.4

Save the file. TeamCity will catch on in a few minutes.

You are now ready to build Play projects

Create a new build configuration in TeamCity.

Step 1 — general settings

Set the following for your “Artifact paths”:

/test-result/*.html=>/test-results/

This will preserve all the generated test results (html files) as artifacts of the build.

Enable “Fail build if:”

  • “build process exit code is not zero”
  • “at least one test failed”
  • “an error message is logged by build runner”

Version Control

Set the usual Version Control Settings for your project.

NOTE: We assume that the root of the checkout directly contains your Play project (the folder in which your app and conf folder reside).

Build Steps

We will create 3 build steps to resolve the dependencies, compile and test and to publish the test results.

Build step 1: Resolve dependencies

  • Command Line runner
  • Leave Working directory empty.
  • Run Executable with parameters.
  • Command executable: C:Toolsplay-1.2.4play.bat
  • Command parameters: dependencies

This will download all your dependencies.

Build step 2: Compile and test

  • Command Line runner
  • Leave Working directory empty.
  • Run Executable with parameters.
  • Command executable: C:Toolsplay-1.2.4play-autotest-teamcity.bat
  • Command parameters: -

This will run the script we previously created on all the agents.

Add build feature — Xml Report processing

  • (Build steps tab in the wizard)
  • Report type: ANT JUnit
  • Monitoring Rules: +:test-result/TEST-*.xml

This will monitor if test result files are generated and will process them. By default TeamCity will fail the build if it finds tests which have failed.

Build triggering

Add some build triggers to your liking.

Agent Requirements

Add a new requirement and fill in the following:

  • Parameter name=env.frameworks.java.play
  • Condition=exists

Now only build agents on which you have defined this parameter in the properties will be able to build your config. In the list of available agents your agent should still be in the list of ‘available agents’ or TeamCity did not pickup your agent config change (or you forgot it?)

Save, run and be happy. When compilation fails the Compile and Test step will fail, if your unit tests fail the last step will fail.

Add code coverage

Play can integrate with Cobertura to create code coverage reports which TeamCity understands.

Add Cobertura to Play Dependencies

Add cobertura to your Play dependencies.yml file. For example:

require:
- play
- play -> cobertura 2.4

NOTE: if you omit the version number it will not download cobertura (as per specs) but gives no warning about it.

Add the following artifact path to your build configuration in step 1 — general settings

/test-result/code-coverage/**=>/code-coverage-cobertura/

this will copy the cobertura output to the artifacts code-coverage-cobertura folder of your build

New Artifact-Based-Report tab

Configure your TeamCity server to have a conditional-artifact-based Report tab

Go to http://{your-team-city-server.com}/admin/serverConfig.html?init=1&tab=reportTabs

Add a new report tab

  • title: “Code Coverage (Cobertura)”
  • Base Path: code-coverage-cobertura/
  • Start Page: index.html

Now when the folder code-coverage-cobertura is available in the artifacts of your build the tab ‘Code Coverage (Cobertura)’ will be available and if you open it it will show the index.html file.

Credits


Check out our Engineering Blog for more in-depth articles on pragmatic code for happy users!