Twitter Facebook
Follow Grindr on
Download Learn More Gear Blog Events Press Contact Help

Grindr Blog

The official Grindr blog.
News and more from Team Grindr.

(Part 3 of 3) Tech Talk - iOS Development with Test Driven Development, Unit Testing, and Monitoring

Posted on June 18, 2014 by Grindr Team


Part (3 of 3) Tech Talk - iOS Development with Test Driven Development, Unit Testing, and Monitoring Code Metrics

[54:00] Audience >> Do they have to access into our iTunes’ account or two different [inaudible].

[54:07] Luke >> Essentially developers don’t have access to… yeah… ok?

[54:14] Luke >> So that’s really what you want. Key here is the release candidate and actually the usage of the artifact repository. Another thing here, Sonar will talk about code metrics. I’m very big about having empirical data about what my code is like, you know? It’s not a what a cool conversation, I want to see actual metrics, they’re standard metrics to measure the quality of my code. We’ll see that in a little bit. And also, I want to have automated testing as part of the process. So this build, everytime I do build, right? There is going to be unit testing. I’m gonna calculate my metrics. I’m gonna also run my automated fuctional testing, and that’s the future we’re working on that right now. We are doing a big push to have that done by the end of the summer. At the end of the day, everytime I do a build, I want to have a couple things get done. I want to calculate my code quality metrics and I want to fail the build if someone wrote something without the unit test, which means my code coverage percentage decreased. Also, you know, if my unit tests fail, obviously I want to fail the build and once on top of that once the artifact is done, I want to run my automated testing using functional tests, which means that now I’m actually testing the out functionality, right? And that should happen every night, at least. Right?


**** WE ARE HIRING **** is hiring for Senior Android Developers, iOS Developers and Principal Application Developers.  If you are interested in our careers, check out and email


[55:42] Luke >>  So now, developers can innovate, they can do whatever, they can test different frameworks. There’s a harness in place to fail fast, preventing me from pushing crap to production.

[55:54] Luke >>  So let’s talk about how it’s actually implemented, so Rudy, if you could take over and talk about our Jenkins setup and the pipeline.

[56:21] Rudy >> Alright, hi guys, so I’m now going through some of the stuff that Lukas and John went through in a little more detail about how the builds are happening, how the artifacts are stored, how do we track them, and what we do with them after our QA signs off on them, right?

[56:36] Rudy >> So Lukas briefly mentioned, now what we do is we basically store we build. So I’m gonna start with a couple of tools we’re actually using in-house. So we’re using Jenkins for all the build processes. So we use Jenkins to build the artifacts, we use Sonar, if you guys are familiar with it, for reporting. So what we do is after we build, we run the Code Quantmetrics and report it to sonar. So I’m gonna put up Sonar and show you guys the dashboard, it basically tells you where the violations are, what code is missing, unit test coverage, if they added five classes, and they haven’t unit tested obviously, the coverage percentage drops so we can flag it as a failure and ship it back to the dev team before it even makes it to QA.

[57:17] Rudy >> We’re using Nexus, it’s an artifact group repository. So what we do is, after we have the APP and the IPA artifacts, we store them there for tracking purposes with the appropriate Git hashes so we can trace it back to which Git commits they were associated with and we can troubleshoot them if we need to.

[57:35] Rudy >> And Hockeyapp obviously wants to, if you guys aren’t familiar with it, to doing distribution of the IPAs.

[57:43] Rudy >> I’m gonna start with the iOS sold with the Jenkins piece. So what we do is we basically use Jenkins to build the artifacts. What we have done is our new build process basically is the… we’re tying down a couple moving parts to together to make this happen so first we start off with Code Quantmetrics. Do they pass? If it does pass the code quality and we’re good with that, they have done proper unit testing, all unit tests pass, they haven’t broken anything existing. We go ahead and build the app. Once we build the app, all this stuff is still done in Jenkins. Jenkins will build the app after doing the reporting to Sonar and store the artifact over at the Nexus repository. If all that stuff is successful, which means we have a proper IPA, with the right provisional profile sign, we ship that artifact out to Hockeyapp for QA to be able to download and take a look at it.

[58:41] Rudy >>  So here is some of the individual artifacts we have nest code built. That does the actual build. We have the code quality metrics that we run right before we run the build. So I’m gonna open up one of the jobs where you can actually see how it’s tied together. So this is an example of it first, so first we do the code quality, if it’s successful we move on with Xcode build and if that is successful, we move on to storing it in the artifact. We jot that point where we contact Nexus and we ship out the artifact for storage and retrieval and we sign it with the proper artifact and we store those.

[59:19] Rudy >> The builds themselves take about five to ten minutes, so with all this stuff included, so from the time that a… go ahead sorry…

[59:27] Audience >> When does the get figured?

[59:30] Rudy >> So we have two versions of it, right. We have a calling system which we keep calling the repository every ten minutes. If there are new commits, we shake it all, we build it. Automatically.

[59:41] Audience >> On any branch?

[59:30] Rudy >> Yeah we have a few active branches that we have job set up for then we have master and kind of stable branch which is always production-like, plus, the other option is QA can always trigger it, if they want to. So, those are the options we have built, and then we’re also working on refining what the proper incremental timeframe should be for polling. Is it too frequent or not frequent enough, right? Because if the builds take about ten minutes you don’t want to keep pulling every five minutes. Then you have your jobs lined up and queued up and it’s going to bog down Jenkins itself. Any other questions?

[59:41] Audience >> [inaudible]

[59:30] Rudy >> So what we do is, with the code quality metrics… so after everything is done, you’ll see that the build is successful and this is basically Sonar. So what we do is we gather all the statistic from unit testing that job went through and we report it to this tool called Sonarcubes. What it does is that it basically aggregates it and you see the two green graphs for each branch right now? So, as we keep working on branches and committing code, the code quality is gone, and reports are getting generated and updated. If you start missing your commitment – let’s say threshold is set up, 90% for unit test coverage and you add ten new classes and you have no unit test, you’re obviously gonna cut off on that threshold and not meet it. So, we’re gonna flag it and once we ship the results here, you’re gonna see red and yellow and going all the way down to red obviously. We can actually enable triggers on these jobs, on this reporting, and say in this case we have actual coverage set to, if it’s greater than 65%, mark it as warning. If it’s greater than 70%, fail the build. So when the build fails it gets kicked back to the dev team and they’re like, ‘alright we gotta address this, this is not making it to QA’, because the next step is actually the build process and that never got triggers, so QA has nothing to test on.

[61:40] Luke >> Let me touch a little bit on that. So, from the perspective of having metrics on how well you’re doing as an engineering organization, this dashboard is very important to me, because we have multiple teams, we have multiple, you know, we got Android, we got iOS, we got backend, we got multiple branches. Setting rules and having these static code analyser rules that the team overtime develops, is very important, right? Because those are essentially your automated code reviews that happen every time you build, right? So as you’re developing these you’re getting better and better and better, so you can make this a part of your retrospective process if you want. You can make it more collaborative when developers are updating it all the time. The bottom line is that those are very important. Another metrics I look at is comment density. You wanna make sure that your code is well documented. I’m not big on writing separate documents from the code. I think the code in the class is very important, also, that’s on top of naming standards and conventions or whatever. Obviously, if you name your classes correctly, if you name your method correctly, you don’t need comments, but if you don’t, then it’s a problem.

[63:06] Luke >> Duplications, that’s very important for me as well. I don’t want copy and paste, right? It’s very easy if you are bending out stuff. You’d be like, okay, that looks cool, I’m just going to reuse it, copy and paste. If that goes up, I’m not a very happy person, right? And then, that’s something that we are trying to make work, Cyclomatic complexity is also a very good metrics to look at anything greater than 5, I usually reject the build, so that’s analogous with having god objects, right? If I have a class with ten thousand lines and does everything, cyclomatic complexity goes through the roof. I want nice, clean eco-position, right? So, cyclomatic complexity is one way to ensure that you have that. And then, our good old unit test coverage, so obviously, we want this number around 80%. You’re going to have 100% coverage. You may strive for that but I use 80-20 rule. 80% of code coverage is good. The bottom line is that if you set the threshold and if you setup your failure SLA, you’re kind of saying, ok, engineering, we have 60% now. From now on you cannot decrease this number, you can only go up, which means, now you’re forcing your developers to write code that has proper unit tests in place, and that’s part of your automated process. You don’t have to rely on humans to decode reviews of whatever. It’s part of your build pipeline.

[64:48] Rudy >> You can kind of have, yeah go ahead…

[64:51] Audience >> Does Sonar sit on top of your repository as if on github?

[64:56] Rudy >> No, this is a separate thing, this is a separate application. So what it does is, when Jenkins builds it, and it runs your unit test coverage, it actually publishes the numbers to Sonar. Sonar takes them, figures out what to do with them and does the whole graphing for you. So it’s kind of creating the link between Sonar and Jenkins unit test reporting and it just takes care of everything else.

[65:17] Audience >> So when Jenkins builds it, it sends it to Sonar?

[65:21] Rudy >> Sonar, yeah, It spills the reports to Sonar. Actually, I’m gonna do one thing for the demo right now and then I’ll carry on and you guys can see the difference so I’m gonna go to alerts, and you noticed how to coverage was. I wanted to fail, it gave me a warning at 80% and failed at 90%, right?

[65:52] Rudy >> So I’m just gonna trigger a build right now and we can continue.

[66:05] Audience >> So where is it building from? Is everybody ready with a common file? Is there a server somewhere?

[66:11] Audience >> No, this is checking out the code repository, right, a given branch and running the unit test coverage and doing the reports. If that is successful and Sonar doesn’t report a failure on that, which means you haven’t exceeded any of the thresholds, right, you’re still good, and then Jenkins carries on with doing the build, and then storing the artifact.

[66:29] Lukas >> We set up a pipeline, build pipeline templates through Jenkins, so there’s a wizard that we have that allows you to specify the branch. When you enter the branch, you enter the provisioning profile and that sets all those builds for you with all those multi-steps building process and then you just schedule and run. So let’s say I have new… I’ve been developing on my feature branches, I’ve been checking through Stable. I’m ready to, okay, I’ve got enough stuff to do a release candidate. I would cut the release branch, and then I would go to Jenkins, use my wizard to set up with this branch build and now our building gets correct. There’s also a stable branch that we’ll build against all the time. And that’s all, you can lock it.

[67:18]Rudy >> So the moving pieces where getting a build ready for QA is basically checking the code, having proper unit test coverage. We run the unit test coverage. If everything passes, we run the build, we create the artifact. If that is successful, we store it over at Nexus and that’s the raw APP file, right? So at that point we can sign it with any provision profile we need which is an issue that Lukas mentioned that they were having earlier, which is once QA signs off, the developer checks out the code again and does a brand new build and that’s all gone now. We have the actually raw APP that QA signed off on depending on which provisioning profile we use. If they sign off on that, we check out the exact APP file. We sign it with production and we ship that same thing off to Apple.

[68:00] Rudy >> Now, dev could have messed around with the branch as much as they wanted. That one build is going out, the one QA si

**** WE ARE HIRING **** is hiring for Senior Android Developers, iOS Developers and Principal Application Developers.  If you are interested in our careers, check out and email

Go to:

Part (1 of 3) Tech Talk - iOS Development with Test Driven Development, Unit Testing, and Monitoring Code Metrics

(Part 2 of 3) Tech Talk - iOS Development with Test Driven Development, Unit Testing, and Monitoring Code Metrics

Happy Birthday Grindr

Posted on March 25, 2014 by Grindr Team

Today we mark a milestone, Grindr turns 5. It’s been a long road and quite a trip, but in those 5 years we continued to grow and that’s largely in part to our users. We at Grindr want to thank you for making us the go-to app for finding gay men. Before Grindr, finding other gay men was a real challenge and we’re proud that we can provide the fastest and easiest way to meet a guy. In fact, our users have made millions of connections (and that number is only going up).

Since our inception in 2009, Grindr have taken the world by storm, experiencing explosive growth with iPhone, iPad, iPod touch, Android and BlackBerry users in 192 countries. To date, we have more than five million active monthly users on the app and their daily chat messages have topped 38+ million. Not to mention the number of Grindr photos sent has jumped to over 3.1 million a day, and we have  been downloaded more than 10 million times.

To celebrate our 5th birthday, we surveyed our massive user base to learn about the habits and trends among the guys that use the app. Users got personal and shared their meet-up history, favorite feature on a guy, and more. We took those survey results and made an infographic, take a look here.

And thanks again for helping make Grindr the app it is today.



The Grindr Best of 2013 Awards

Posted on December 9, 2013 by Grindr Team

Award season is officially underway! The votes have been counted and the many men of Grindr have made their voice heard in Grindr’s Best of 2013 poll. You have let us know who and what you view to be the best of the best is…so without further adieu, the winners are:

• Gay icon of the year: Neil Patrick Harris
• Straight ally of the year: Lady Gaga
• Best coming out story: Wentworth Miller
• Enemy of the LGBT community: Vladimir Putin
• Best song of 2013: “Same Love: by Macklemore and Ryan Lewis
• Best movie of 2013: Gravity
• Best TV show on air: “Modern Family”
• Most wanted man in the Grindr cascade: Channing Tatum
• Best comeback of 2013: Netflix
• Social blunders: Miley Cyrus’ twerking
• Biggest loss of 2013: Cory Monteith
• Next celebrity to come out: Taylor Lautner
• Hottest gadget of 2014: iPad Air
• Next state/country to legalize gay marriage: Florida
• Next celebrity train wreck: Justin Bieber
• What will become obsolete: Facebook

Congratulations to all the winners and Channing Tatum…should you ever need that Xtra subscription…it’ll be on us.

Meet the New Grindr Guys

Posted on October 17, 2013 by Grindr Team


Who’s hot and ripped and toned all over? The new Grindr guys of course.

After 780 submissions, more than 2,500 votes and an intense battle of the abs, Matthew Stehlik of Orlando, FL and Eric Angelo of Hollywood, CA have been crowned the winners of the Grindr Model Contest.

We were looking for the best guys to represent the new Grindr and boy did we find them (just check out their pictures below).

Eric (on the left) is a Texas native who now calls Hollywood home. He’s gogo dancer who doesn’t believe in shirts or pants and in his free time enjoys collecting old books and reading science fiction. Matthew (on the right) hails from Orlando by way of Pittsburgh. Matthew is a bartender and has modeled for several years - we can see why.
These two lucky lads will be brought to Los Angeles for a three night stay that includes some serious pampering, a killer new wardrobe from Kent Denim and Maor Luz, a Grindr photo shoot and a coming out party. Keep a look out for these guys to be featured in our upcoming Grindr ads.

Want to see more of Eric and Matthew? Check out their social media pages here:

Eric: Youtube & Facebook

Matthew: Instagram & Facebook

Take a Stand on #SpiritDay

Posted on October 16, 2013 by Grindr Team

Have you ever seen a Pride flag before? Ya know, rainbow, often held at rallies, marches, or Pride parades. Yeah…that flag. Well did you know that each color means something?


They all mean something to everyone but let’s just focus on the last one: Spirit.

On October 17th, 2013 the GLTBQI community will celebrate the annual tradition of Spirit Day by wearing purple. It is a way for our community to take a stand against bullying. We will unite for the equality that we’ve earned and the equality still to come. We will come together for those who have stood up to bullying and remember those who sadly, could not. The history of the gay movement is rooted in the ability to find strength through spirit, as our spirit is also the momentum that propels us forward.

You can take part in the most simple of ways - on Thursday, October 17th, wear purple, change your Grindr profile photo purple, change your Grindr name to Spirit Day, and inspire others to do the same. See, it’s that easy.

You can alter your photo on websites such as,  or you can do it on your phone using GLAAD’s free Spirit Day app that you can download here for iOS users or here for Android users.

If you want take your Spirit Day enthusiasm to the next level, help us inspire others. Send us a snapshot of your purple Grindr profile and we might post it to our Facebook on October 17th!  Simply take a screen capture and email it to

There’s no one way to show pride or spirit but there is one way to be united. Let’s get the Spirit Day momentum started as we move closer to a future of great unity.