Wednesday, October 12, 2016

Trying @teamcity for #ContinuousIntegration - Part 3

In part 1, we looked at how to install and create a simple build job in Teamcity. In part 2, we looked at how to create an agent and run a build on the agent.

In part 3, we will look at how to build a Maven Java project. We already added the project to the build job in part 2, but we did not configure the build step to actually perform the compilation using Maven.

Auto detect build steps

It is as good as it sounds. I clicked 'Auto detect build steps' and the build step was automatically created to perform a 'maven clean test'.

Check the checkbox in the table and click 'Use selected' to add the build step to your build job.

Observe the 'mvn clean test' step in the table.

Run the build job

Run the build by clicking the 'Run' button at the top of the page. A live status and percentage of completion is shown on the project view.

Edit the maven goals

Click on the 'Edit' link on the maven build step row (second column from the right).

Change 'clean test' to 'clean test compile'.

Run the build again using the Run button. The build log now shows the Maven build step.

The 'Maven Build Info' tab shows that the jar artifact was compiled successfully.

I am curious to see more of this tool. The auto detect feature is very impressive.

Trying @teamcity for #ContinuousIntegration - Part 2

Continuing from where we got stuck in the prior post for running a build on Trying @teamcity for #ContinuousIntegration - Part 1. Before I started working on the agent, I deleted two of the three builds in the queue.

Create the Teamcity agent

I learned that I must have an agent running. I executed the following docker command to create an agent that automatically registered itself on the Teamcity server as an unauthorized agent.

docker run -d -e SERVER_URL="http://teamcity-server-instance:8111" \
--name=teamcity-agent \
-p 9090:9090 \
-v $HOME/docker-shares/teamcity/agent/conf:/data/teamcity_agent/conf \
-e AGENT_NAME=teamcity-agent \
--link teamcity-server-instance:TSI \

Authorize the agent

Click on the 'Unauthorized' link next to the agent and click 'Authorize' on the dialog  that pops up.

Navigate back to 'Connected' tab where only authorized agents are listed.

The build that was in the queue kicked off while I was trying to take a screenshot and I missed it on the screenshot. Navigate to 'Projects' and you'll see a 'Success' status on your build job.

More work needed

I was not expecting the build job to actually determine that this is a maven Java project and compile the code automatically. I looked at the build log and confirmed as much.

The work we did above is truly just 'Hello World'. There is a build steps section that I didn't look for earlier. For now, I successfully connected an agent and kicked off a job. Moving on to build steps on the next post.

Trying @teamcity for #ContinuousIntegration - Part 1

Teamcity is a continuous integration software application from JetBrains. I am a Jenkins expert. I use it at work and I go deep into it with custom plugins and custom code to orchestrate builds and deployments. I use CircleCI and TravisCI for my github projects and these are just for fun. All these products are good in their own way. Jenkins is the mother of all CI tools. CircleCI and TravisCI are simpler to use and I really like the speed and agility of these tools. I would use Jenkins for enterprise and CircleCI/TravisCI for open source public domain projects.

I didn't realize that there is a free version of Teamcity until last night and the features are fairly decent. There is a 50% discount for startups and free for open source projects. This is welcoming.


Jumping right into it. I downloaded the windows version and the installation was fairly simple with the executable, but I could not get it to work. The browser would just show a blank page. I quickly switched over to my favorite way of doing things - Docker - and it worked right away.

docker run -d --name teamcity-server-instance \
-v $HOME/docker-shares/teamcity/server:/data/teamcity_server/datadir \
-v $HOME/docker-shares/teamcity/logs:/opt/teamcity/logs \
-p 8111:8111 \

Open http://localhost:8111 and you see a very welcoming 'Teamcity First Start' page.

I kept the installation simple. I chose the internal database option for the database and accepted the license agreement. I created a user account on the next form and I was brought to the settings page which shows off some pleasing features like:

  1. Version control integration
  2. Email, Jabber, IDE and Windows notifier
  3. Some popular plugin choices and tools on the right

Hello Teamcity

Step 1: Click on 'Projects' link on the top left and click 'Create Project' - 'Manually'.

Step 2: Enter project details and click 'Create'

Features observed: Very interesting feature titles that I will explore later.

  1. Build Configuration Templates
  2. Subprojects

Step 3: Build Configuration

Click 'Create build configuration' - 'Manually'.

I came this far to realize that I cannot do a simple 'echo "Hello Teamcity"'. I have to integrate with a version control system to proceed with this trial.

Step 4: Integrating with Github

There are two tiny icons below the 'Repository URL' textbox for github or bitbucket. I chose github because I have a few projects there that I could build easily. Click on the 'Github' icon.

We have to register our local teamcity instance with GitHub. This was easier to do on Jenkins, CircleCI and TravisCI.

Click 'register Teamcity' and create a new application token on GitHub. Just copy paste as stated in the screen above.

When you click 'Register application', a new client id and client secret are created. Copy paste from github page to the teamcity github connection page and save. This takes you to a connection page instead of taking you back to your project configuration page. Just use the browser's back button to go back to your project configuration page. Now, the github icon will be showing as enabled.

Click on the github icon and sign in with your github credentials.

Step 5: Select project to build and trigger the build

I have a marstime github project. It is a maven project with java code. It is not perfect, not accurate and it is not well written. But, it compiles and runs.

Select the github project and click create.

Step 6: Run the build

Click on the dotted button next to 'Run'. Select 'run as a personal build' and 'clean all files in the checkout directory before the build' (Just some good CI habits). Then click on 'Run Build'.

I was expecting teamcity to start building this code like Jenkins does on the master when it does not have agents. That didn't happen on teamcity. I clicked on 'Run' three times. Now there are three builds in the queue.

I'll have to create a teamcity agent docker container and hook it up to this teamcity server. Coming soon in part 2 of this blogpost.