Automatic deployment is super nice way to deliver software. In the past I’ve successfully used Capifony (Symfony-o-centric Capistrano 2.x gem) for deployments. Now as Symfony3 is out with an updated structure, Capifony does not handle it anymore (or a bit of coding sweat is required) – because it’s not maintained anymore. So I’ve decided to stick with it’s ancestor – Capistrano. So lets’ start.

P.S. This is based on Capistrano v3 now.

Continue reading

Tips to Ensure Your Values Unify Your Team, Not Divide It

It was quite a blow-up. Laura and Will each accused the other of violating one of the team’s core values – integrity. They each felt they had honored the value and the other person had disregarded it.  People sure get mad when they feel someone has trampled on their values!

Will had promised the client he would send the proposal by the end of the day.  It was 4:45 pm and he was waiting for Laura to finish the final edits on the graphics. Laura was conscientiously checking every detail for accuracy making sure that each segment of the pie chart was the exact same size.

At 4:55 pm, Will walked over to Laura’s desk and asked her when she’d be ready. She said she needed 15 more minutes.  Will told her to forget it – that he was going to use the earlier version. He walked back to his desk and sent the proposal at 5:00 pm sharp.

And that’s when the blow-up occurred.

Continue reading

The error


CoreUtils needed:


Google home device

Looks like Google just promised what we all want – personal assistant that can control it all: your home, your calendar, events, and so much more.

Allo and Duo

Even more, conversations just got much more human alike, including personification

It will be open for developers soon.

Seems like a simple problem, there must be a simple solution? Here are the existing options:

  • syslog-ng or rsyslogd logging to a central location.
    • Pros: centralized logs, easy to analyse, near to real time
    • Cons: Requires extra dedicated server (costs). Have to extend storage or upload to S3 periodically. PITA setup from a security POV unless you know the IP addresses in advance (you can set up your own CA and generate a number of SSL keys and distribute these to the servers on startup and use TLS encrypted communications, but I really CBA with all that hassle – not to mention that last time I checked Amazon Linux didn’t support these serversOOTB so I’d have to install them from a CentOS RPM or similar)
  • Message queuing
    • (I don’t think this is a perfect match)
  • Hadoop cluster
    • Pros: awesome data crunching ability
    • Cons: we don’t have 10million users yet, I think this is a bit heavy handed (not to mention expensive)

Continue reading

Jenkins Docker delivery pipeline tests

The problem

Jenkins is good old CI where you can set up everything from simple cron job to complicated delivery pipeline. At the company where I’m working at the moment we ourselfes built an pretty-damn good Continuous Delivery pipeline which includes:

As I ordered above, tests takes from 30s (unit tests) to around 30 minutes (UAT). When taking in consideration all delivery pipeline action (code deployment, various procedures to be executed and so on) it becomes 45 minutes for a single release. So the math is 8hrs / 45min = up to 10 releases /day. That’s the physical limit. Well we are A-class team (A-for-Agile) so we need more release power.
Continue reading

Branch name. Same as Local as Origin

Often working on fast-moving projects I find myself creating branches from branches and more. I found one really nice trick to shave couple of seconds and keyboard click. By default when you create new GIT branch locally and try to push that freshly baked branch to your origin, in my entire career I did not have to rename branches, so using the same branch name mades perfect sense. If you are in line with me, there is that magic line below:

git config --global push.default current

git config --global pull.default current

C U,


Conditional Step in Your Continuous Delivery Pipeline

Continuous Delivery (CI)  often requires something to happen under certain condition. You can have different pipelines, jobs or tasks dedicated to differentiate it, but as far as best practices states – reuse. In my experience of building Delivery Pipelines, it starts with single pipeline for a product, but is often configured to have multiple paths depending on options chosen at the first step.

Continue reading

True at all corners of software development

It’s complicated to make complicated things simple and it’s simple to make complicated things complicated.

This saying can be applied to anything – architecture, design, pattern application and all other complicated things around our complicated world.