{"id":25021,"date":"2015-12-07T10:54:10","date_gmt":"2015-12-07T08:54:10","guid":{"rendered":"https:\/\/mamchenkov.net\/wordpress\/?p=25021"},"modified":"2019-01-24T12:11:39","modified_gmt":"2019-01-24T10:11:39","slug":"infrastructure-update-github-bitbucket-hipchat-teamworkpm-and-redmine","status":"publish","type":"post","link":"https:\/\/mamchenkov.net\/wordpress\/2015\/12\/07\/infrastructure-update-github-bitbucket-hipchat-teamworkpm-and-redmine\/","title":{"rendered":"Infrastructure update : GitHub, BitBucket, HipChat, TeamworkPM and Redmine"},"content":{"rendered":"<!-- google_ad_section_start -->\n<p>It&#8217;s been a while since I posted an update on our infrastructure tools, so here goes one. &nbsp;(I know, ideally, it should be on <a href=\"http:\/\/qobo.biz\">our company&#8217;s blog<\/a>, but we haven&#8217;t finished that part of the site yet).<\/p>\n<p><!--more--><\/p>\n<p>First things first &#8211; <strong>migration from <a href=\"https:\/\/github.com\/QoboLtd\">GitHub<\/a> to <a href=\"https:\/\/bitbucket.org\/QoboLtd\/\">BitBucket<\/a><\/strong>. &nbsp;I have said many times that I love GitHub dearly. &nbsp;And I do. &nbsp;But it gets expensive pretty fast for the type of company that we are running. &nbsp;GitHub subscription price is based around the number of private repositories. &nbsp;Of which we have plenty as we are dealing with client&#8217;s projects mostly. &nbsp;BitBucket subscription strategy is around the team size. &nbsp;We have a small team and it probably won&#8217;t grow significantly in any distant future. &nbsp;So where we are spending $100 a month on GitHub, and hitting a limit, a $10 per month BitBucket subscription will do for a long time.<\/p>\n<p>Gladly, with git being distributed and decentralized, migrating from one to another is super easy. &nbsp;All you have to do is this:<\/p>\n<pre class=\"brush: plain; light: true; title: ; notranslate\" title=\"\">\n# Remove GitHub remote\ngit remote remove origin\n\n# Add BitBucket origin\ngit remote add origin git@bitbucket.com...\n\n# Update remotes\ngit remote update\n<\/pre>\n<p>And just to be clear, we are not moving away from GitHub completely. &nbsp;We are only moving our private repositories over. &nbsp;All our Open Source repositories will remain at GitHub, as it provides a larger exposure. &nbsp;And also, we are keeping private repositories for projects where we work with clients&#8217; developer teams, as GitHub seems to be the standard de facto.<\/p>\n<p>We&#8217;ve finished the migration last week and now we are on a $10 BitBucket subscription and $25 GitHub subscription, getting the best of both worlds.<\/p>\n<p>In terms of functionality, both services offer pretty much the same tools &#8211; git repositories, code browsers and review tools, pull requests, API and web hooks, etc.<\/p>\n<p>GitHub offers a handy feature called &#8220;<a href=\"https:\/\/github.com\/blog\/1547-release-your-software\">Releases<\/a>&#8220;, which extends the functionality of git tags into something more useful &#8211; release notes and attached files (like built binaries). &nbsp;BitBucket doesn&#8217;t have it yet, but <a href=\"https:\/\/bitbucket.org\/site\/master\/issues\/11404\/bitbucket-equivalent-of-github-releases-bb\">it&#8217;s been requested<\/a> and a lot of people voted for, so there is hope.<\/p>\n<p>Also, GitHub seems to work a bit faster &#8211; BitBucket sometimes gets a bit clunky when your push to it or when you create a Pull Request.<\/p>\n<p>But BitBucket has a neat Approve button, which works much like Facebooks&#8217; Like. &nbsp;Instead of all those :+1: and me too comments, one just clicks Approve and BitBucket shows the list of people who approved the pull request. &nbsp;Oh, and you can also ping people by assigning them to be the reviewers. &nbsp;So if you want somebody in particular to look at your changes, there is an interface for it, rather than a free form @-mentions. &nbsp;Which also work by the way.<\/p>\n<p>For us, the most difficult part of this migration was the fact that we had automated deployment logic built around GitHub actions. &nbsp;So, every time a pull request was merged into a master branch, we&#8217;d automatically deploy the branch to the test server (using GitHub web hooks). &nbsp;And every time a release was created, it would get automatically deployed to the live server.<\/p>\n<p>BitBucket provides similar web hooks, but without releases, which we could replace with tags. &nbsp;But that would mean that we had to support two different deployment scenarios, which sounded like too much. &nbsp;Also, there were a few issues related to that logic in the first place. &nbsp;For example:<\/p>\n<ul>\n<li>Deployment trigger was in one place, while deployment feedback was in another (HipChat, emails and logs).<\/li>\n<li>Re-deploying the same version wasn&#8217;t supported. &nbsp;You had to do dummy pull requests or dummy releases to re-deploy something.<\/li>\n<li>Multiple pull requests in a single deployment weren&#8217;t possible &#8211; each merged pull request was a separate deployment.<\/li>\n<li>Deployment of projects which consisted of more than one repository was not supported.<\/li>\n<\/ul>\n<p><span style=\"line-height: 1.6471;\">So instead of supporting two separate scenarios &#8211; one for BitBucket and one for GitHub &#8211; and fixing these issues later, we&#8217;ve changed to &#8230; &nbsp;<\/span><\/p>\n<p><strong><a href=\"https:\/\/www.hipchat.com\/\">HipChat<\/a><\/strong>. &nbsp;I know that everybody and their mother is crazy about <a href=\"https:\/\/slack.com\/\">Slack<\/a> these days, but we&#8217;ve started using HipChat slightly before all that hype and we love it. &nbsp;I&#8217;ve also tried Slask with some Open Source projects rooms, and I can&#8217;t say that I am a big fan of it. &nbsp;It just doesn&#8217;t click with me, and all those animated GIFs don&#8217;t help either.<\/p>\n<p>Anyways. &nbsp;HipChat works really well for us. &nbsp;It has a really nice user interface. &nbsp;It works as a web app, and has both desktop and mobile clients for anything you can image. &nbsp;It has public and private rooms. &nbsp;It has attachments and links. &nbsp;It has popup notifications. &nbsp;It has an API. &nbsp;And it&#8217;s free. &nbsp;The pro version for $2\/month\/user adds support for video calls and screen sharing, which are not the features that we use frequently.<\/p>\n<p>And there&#8217;s one more advantage when compared to Slack. &nbsp;Slack is built by the company that only (?) works on Slack. &nbsp;It does mean that they are more focused on it, but it also means that if it fails as a business they will just go away. &nbsp;HipChat is built by <a href=\"https:\/\/www.atlassian.com\/\">Atlassian<\/a>, which is the company building a whole array of developer tools &#8211; Jira, BitBucket, Confluence, and more. &nbsp;HipChat is not the primary source of income for them, but rather yet another tool they probably use internally.<\/p>\n<p>We use HipChat extensively. &nbsp;We have rooms for everybody, for particular groups of users, rooms for different project ideas, and each project gets a dedicated room as well. &nbsp;We&#8217;ve integrated HipChat with GitHub and BitBucket (appropriate HipChat rooms show notifications of new pull requests, comments, etc). &nbsp;We&#8217;ve integrated HipChat with <a href=\"https:\/\/www.nagios.org\/\">Nagios<\/a> and <a href=\"http:\/\/www.zabbix.com\/\">Zabbix<\/a> (monitoring notifications). &nbsp;We&#8217;ve integrated HipChat with Twitter and RSS feeds, to get updates on things around us.<\/p>\n<p>And now we&#8217;ve shifted out automated deployments from GitHub and BitBucket to HipChat. &nbsp;So, instead of relying on a button press or a new tag, we issue a command in one of the rooms, and the project gets deployed. &nbsp;And while the deployment is happening, all the logs and output of the deployment is shown in the same room. &nbsp;And everybody can see what&#8217;s going on. &nbsp;It&#8217;s beautiful and very very simple.<\/p>\n<p>The last but not least, is the migration from <a href=\"https:\/\/www.teamwork.com\/\">TeamworkPM<\/a> to <a href=\"http:\/\/www.redmine.org\/\">Redmine<\/a>. &nbsp;We&#8217;ve used Teamwork for slightly more than a year now and it&#8217;s a great tool. &nbsp;It just doesn&#8217;t fit our culture as well as a self-hosted Redmine setup. &nbsp;Teamwork is a feature-rich tool, with projects, contacts, task lists, sub-tasks, due-dates, estimations and time tracking, files, notebooks, links, comments, and more. &nbsp;But we needed something different. &nbsp;Here are the reasons that we moved:<\/p>\n<ul>\n<li>Tasks don&#8217;t have numbers. &nbsp;I mean, they do. &nbsp;You can see them in the URL. &nbsp;But they are not easy to reference, especially for the non-technical people. &nbsp;In Redmine, every task is assigned a unique number, which is the point of reference and makes it easy to find or spell it out on the phone.<\/li>\n<li>Watcher notifications is sub-par. &nbsp;As a manager, I want to get all notifications on all changes on all projects and activities. &nbsp;I have no problem cutting through a thousand emails a day, if I need to. &nbsp;But in Teamwork, there seems to be a way for people to remove me from notifications and completely bypass certain actions. &nbsp;In Redmine, it&#8217;s much more flexible.<\/li>\n<li>Sub-projects. &nbsp;In TeamworkPM every project is standalone. &nbsp;It&#8217;s organized under the client company, but we need a level more. &nbsp;Sometimes we do larger projects, which consist of smaller ones. We need estimation and billing summaries, which get tricky.<\/li>\n<li>Task statuses. &nbsp;This is probably the largest issue we had with TeamworkPM. &nbsp;Tasks are either open or closed. &nbsp;There&#8217;s nothing in between. &nbsp;Our workflow is not that simple. &nbsp;We have a lot of client communication for example, which might stall the task for quite a bit. &nbsp;We have approvals and other things that benefit greatly from custom task statuses (new, assigned, in progress, stalled, feedback, pending deploy, etc).<\/li>\n<li>Task types. &nbsp;Redmine speak for this is &#8220;tracker&#8221;. &nbsp;It&#8217;s like a different task type (&#8220;bug&#8221;, &#8220;feature&#8221;, &#8220;support request&#8221;, &#8220;user story&#8221;, etc). &nbsp;You can define as many of them as you want. &nbsp;Each one can have a separate access control and custom statuses. &nbsp;You can make it as simple or as complex as you need. &nbsp;And the best thing is that you can mix and match different trackers for different projects.<\/li>\n<li>Custom fields. &nbsp;I think a lot of things could have been solved and improved if custom fields were supported. &nbsp;I want my projects, tasks, users, and companies to have custom fields. &nbsp;I want to have API access to those custom fields. &nbsp;If I don&#8217;t &#8211; things get difficult and quite limited.<\/li>\n<li>Disk space. &nbsp;Not the biggest of issues, but still a concern. &nbsp;With self-hosted tools you get as much disk space as you need. &nbsp;With TeamworkPM, your quota is part of the subscription plan. &nbsp;We didn&#8217;t get close in year, but maybe because we were careful. &nbsp;Uploading large PSD and video files will quickly get you overboard. &nbsp;But if you are not involved in these kinds of projects, you are probably fine.<\/li>\n<\/ul>\n<p>As I said, we loved TeamworkPM and we think it&#8217;s a great tool. &nbsp;It&#8217;s just Redmine is a better fit for us. By the way, if you still insist on using TeamworkPM, have a look at <a href=\"https:\/\/hubstaff.com\/teamwork_projects_time_tracking\">Hubstuff<\/a>, which extends TeamworkPM with a few handy features.<\/p>\n<p>So, these are the news from the fronts. &nbsp;Coming soon is another update on our Amazon AWS setup, puppet configuration manager, monitoring switch from Nagios to Zabbix, and, hopefully blog and portfolio sections on the company website.<\/p>\n<!-- google_ad_section_end -->\n","protected":false},"excerpt":{"rendered":"<!-- google_ad_section_start -->\n<p>It&#8217;s been a while since I posted an update on our infrastructure tools, so here goes one. &nbsp;(I know, ideally, it should be on our company&#8217;s blog, but we haven&#8217;t finished that part of the site yet).<\/p>\n<!-- google_ad_section_end -->\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"Infrastructure update : #GitHub, #BitBucket, #HipChat, #TeamworkPM and #Redmine","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_links_to":"","_links_to_target":""},"categories":[1,18,133,62,1334],"tags":[3395,2809,3397,1079,3318,3145,3396,17],"keyring_services":[],"class_list":["post-25021","post","type-post","status-publish","format-standard","hentry","category-general","category-programming","category-sysadmin","category-technology","category-web-work","tag-bitbucket","tag-github","tag-hipchat","tag-productivity","tag-qobo","tag-redmine","tag-teamworkpm","tag-work"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":25167,"url":"https:\/\/mamchenkov.net\/wordpress\/2016\/02\/10\/what-is-chatops-a-guide-to-its-evolution-adoption-significance\/","url_meta":{"origin":25021,"position":0},"title":"What is ChatOps? A guide to its evolution, adoption &#038; significance","author":"Leonid Mamchenkov","date":"February 10, 2016","format":false,"excerpt":"HipChat blog runs a rather lengthy post on what ChatOps are - \"What is ChatOps? A guide to its evolution, adoption & significance\", which provides some insight into how the new generation of teams communicate. At Qobo, we are at Stage 3 - Gimini, with a whole lot of dedicated\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":27964,"url":"https:\/\/mamchenkov.net\/wordpress\/2017\/09\/08\/atlassian-stride\/","url_meta":{"origin":25021,"position":1},"title":"Atlassian Stride","author":"Leonid Mamchenkov","date":"September 8, 2017","format":false,"excerpt":"Stride is a new product from Atlassian. \u00a0It is a re-branded and, hopefully, improved HipChat. \u00a0I haven't tried it yet, but our team account will be upgraded soon enough. To be honest, I'm not that excited about this move, but I'll give it a benefit of a doubt. \u00a0I know\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/09\/stride-500x284.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":25138,"url":"https:\/\/mamchenkov.net\/wordpress\/2016\/01\/27\/pull-request-guidelines-for-bitbucket-cloud\/","url_meta":{"origin":25021,"position":2},"title":"Pull request guidelines for Bitbucket Cloud","author":"Leonid Mamchenkov","date":"January 27, 2016","format":false,"excerpt":"Bitbucket is often viewed as second best compared\u00a0to GitHub. \u00a0And while I love GitHub dearly, I have to say that it's not true. \u00a0It's as good as GitHub. \u00a0Sure, it doesn't offer all GitHub features yet (Releases, for example), but it does offer a few features of its own, which\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"overview","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2016\/01\/overview-500x281.gif?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":28831,"url":"https:\/\/mamchenkov.net\/wordpress\/2018\/10\/01\/hipchat-to-slack-migration\/","url_meta":{"origin":25021,"position":3},"title":"HipChat to Slack migration","author":"Leonid Mamchenkov","date":"October 1, 2018","format":false,"excerpt":"Back in July, Slack acquired Hipchat with the intent of migrating all the users and shutting down the service.\u00a0 For us at work, these were very sad news.\u00a0 We've been using HipChat for years, and relied on it heavily.\u00a0 We have also evaluated Slack in its early days and didn't\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2018\/10\/hipchat-slack-500x94.gif?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":26189,"url":"https:\/\/mamchenkov.net\/wordpress\/2016\/06\/15\/git-2-9\/","url_meta":{"origin":25021,"position":4},"title":"Git 2.9","author":"Leonid Mamchenkov","date":"June 15, 2016","format":false,"excerpt":"Git 2.9 has been released a few days, bringing in some very useful functionality, such as showing renamed files in git diff and git log, forbidding the merge of two branches that have no common ancestors, configurable path to hooks, and more. \u00a0All are welcome changes, making the life of\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":27257,"url":"https:\/\/mamchenkov.net\/wordpress\/2017\/01\/20\/bitbucket-tag-from-source\/","url_meta":{"origin":25021,"position":5},"title":"BitBucket : tag from source","author":"Leonid Mamchenkov","date":"January 20, 2017","format":false,"excerpt":"BitBucket has implemented one of the most frequently requested features, which was outstanding for more than three years now - creating tags from the source browser (as in BitBucket web interface, rather than from the local repository, using git and then pushing it to remote). I didn't see the announcement\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/01\/bitbucket-tag-from-source-500x287.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/25021","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/comments?post=25021"}],"version-history":[{"count":0,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/25021\/revisions"}],"wp:attachment":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/media?parent=25021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/categories?post=25021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/tags?post=25021"},{"taxonomy":"keyring_services","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/keyring_services?post=25021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}