<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>GitLab</title>
  <id>https://about.gitlab.com/blog/</id>
  <link href="https://about.gitlab.com/blog/"/>
  <updated>2016-12-01T00:00:00+00:00</updated>
  <author>
    <name>Blog Author</name>
  </author>
  <entry>
    <title>GitLab 8.14.2 released</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/12/01/gitlab-8-dot-14-dot-2-released/"/>
    <id>https://about.gitlab.com/2016/12/01/gitlab-8-dot-14-dot-2-released/</id>
    <published>2016-12-01T00:00:00+00:00</published>
    <updated>2016-12-01T00:00:00+00:00</updated>
    <author>
      <name>Alejandro Rodríguez</name>
    </author>
    <content type="html">
&lt;p&gt;Today we are releasing version 8.14.2 for GitLab Community Edition (CE) and
Enterprise Edition (EE).&lt;&#x2F;p&gt;

&lt;p&gt;This version resolves a number of regressions and bugs in the &lt;a href=&quot;&#x2F;2016&#x2F;11&#x2F;22&#x2F;gitlab-8-14-released&quot;&gt;recent 8.14
release&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;Please read on for more details.&lt;&#x2F;p&gt;



&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Rephrase some system notes to be compatible with new system note style (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7692&quot;&gt;!7692&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Create tag after running pre-hooks and pass updated SHA to post-hooks (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7700&quot;&gt;!7700&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fixed commit time not rendering after initial page load (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7704&quot;&gt;!7704&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Prevent error when submitting a merge request and pipeline is not defined (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7707&quot;&gt;!7707&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix: Timeout creating and viewing merge request for binary file (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7713&quot;&gt;!7713&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; New system note design for commit discussion (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7721&quot;&gt;!7721&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Refresh project authorizations using a Redis lease (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7733&quot;&gt;!7733&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fixed issue boards issue sorting when dragging issue into list (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7734&quot;&gt;!7734&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix for builds with no start date throwing an error in cycle analytics events (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7738&quot;&gt;!7738&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Clean up JiraService (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7756&quot;&gt;!7756&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Update GitLab Workhorse to v1.0.1 (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7759&quot;&gt;!7759&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix pipelines info being hidden in merge request widget (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7808&quot;&gt;!7808&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Update Sidekiq-cron to fix compatibility issues with Sidekiq 4.2.1 (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7815&quot;&gt;!7815&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix a transient spec failure (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7825&quot;&gt;!7825&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fixes access to the wiki code with git when repository feature disabled (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7832&quot;&gt;!7832&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Revert bump in rufus-scheduler (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7844&quot;&gt;!7844&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Make deleting with optimistic locking respect NULL (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7867&quot;&gt;!7867&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Remove caching of events data (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;6578&quot;&gt;!6578&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix broken external links in help&#x2F;index.html (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7582&quot;&gt;!7582&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Evalute time_ago method instead of printing it (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7634&quot;&gt;!7634&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Resolves updated and resolved status is not showing (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7655&quot;&gt;!7655&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fixed resolved discussion timeago not rendering (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7656&quot;&gt;!7656&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Pick valid event objects for the events list (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7689&quot;&gt;!7689&lt;&#x2F;a&gt;)&lt;&#x2F;p&gt;
  &lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EE:&lt;&#x2F;strong&gt; Port of rephrase-system-notes to EE (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;913&quot;&gt;!913&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EE:&lt;&#x2F;strong&gt; Get rid of user activites table and replace it with redis (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;915&quot;&gt;!915&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;EE:&lt;&#x2F;strong&gt; Geo: Display Custom Avatars in secondary nodes (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;904&quot;&gt;!904&lt;&#x2F;a&gt;)&lt;&#x2F;p&gt;
  &lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;Omnibus GitLab:&lt;&#x2F;strong&gt; Revert default IPv6 configuration for NGINX (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;omnibus-gitlab&#x2F;merge_requests&#x2F;1133&quot;&gt;!1133&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;upgrade-barometer&quot;&gt;Upgrade barometer&lt;&#x2F;h2&gt;

&lt;p&gt;This version has no migrations and should not require any downtime.&lt;&#x2F;p&gt;

&lt;p&gt;Please be aware that by default the Omnibus packages will stop, run migrations,
and start again, no matter how “big” or “small” the upgrade is. This behavior
can be changed by adding a &lt;a href=&quot;http:&#x2F;&#x2F;doc.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;&lt;code&gt;&#x2F;etc&#x2F;gitlab&#x2F;skip-auto-migrations&lt;&#x2F;code&gt;
file&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;

&lt;p&gt;To update, check out our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;update&#x2F;&quot;&gt;update page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;enterprise-edition&quot;&gt;Enterprise Edition&lt;&#x2F;h2&gt;

&lt;p&gt;Interested in GitLab Enterprise Edition? Check out the &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;features&#x2F;#enterprise&quot;&gt;features exclusive to
EE&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;Access to GitLab Enterprise Edition is included with a &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;pricing&#x2F;&quot;&gt;subscription&lt;&#x2F;a&gt;.
No time to upgrade GitLab yourself? Subscribers receive upgrade and installation
services.&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>How to Keep your Fork Up-To-Date with its Origin</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/12/01/how-to-keep-your-fork-up-to-date-with-its-origin/"/>
    <id>https://about.gitlab.com/2016/12/01/how-to-keep-your-fork-up-to-date-with-its-origin/</id>
    <published>2016-12-01T00:00:00+00:00</published>
    <updated>2016-12-01T00:00:00+00:00</updated>
    <author>
      <name>Marcia Ramos</name>
    </author>
    <content type="html">
&lt;p&gt;Have you ever wondered how to keep a fork automatically up-to-date with its origin (&lt;strong&gt;upstream&lt;&#x2F;strong&gt;)?&lt;&#x2F;p&gt;

&lt;p&gt;In this post we&#x27;ll show you how to do that on GitLab!&lt;&#x2F;p&gt;



&lt;h2 id=&quot;fork&quot;&gt;Fork&lt;&#x2F;h2&gt;

&lt;p&gt;As you most likely know, a &lt;strong&gt;fork&lt;&#x2F;strong&gt; is a copy of a Git repository &quot;connected&quot; with the project you forked from (upstream). When you collaborate on code, it&#x27;s pretty common forking a project, cloning to your local machine, making the changes you&#x27;re up to, pushing to your fork, and submitting a merge request (MR) to merge your code into the original project.&lt;&#x2F;p&gt;

&lt;p&gt;You fork a repository whenever you want to contribute to a project which you don&#x27;t have access to, as it&#x27;s not your own or your team&#x27;s. This is how open source projects hosted by GitLab get so much collaboration from the community.&lt;&#x2F;p&gt;

&lt;p&gt;When you are a member of a project (or a group), it&#x27;s easier using the &lt;a href=&quot;&#x2F;2014&#x2F;09&#x2F;29&#x2F;gitlab-flow&#x2F;&quot;&gt;GitLab Flow&lt;&#x2F;a&gt;, or &lt;em&gt;branching strategy&lt;&#x2F;em&gt;, since anyone in your team can pull your branch and preview your changes locally. By the way, with our brand-new solution for this, called &lt;a href=&quot;&#x2F;features&#x2F;review-apps&quot;&gt;Review Apps&lt;&#x2F;a&gt;, you can preview your apps in a per-branch basis, for each MR submitted to GitLab, directly from a link generated by GitLab. Review Apps came to bring the &lt;a href=&quot;&#x2F;2016&#x2F;10&#x2F;25&#x2F;gitlab-workflow-an-overview&#x2F;&quot;&gt;GitLab Workflow&lt;&#x2F;a&gt; up to the next level! 🙌&lt;&#x2F;p&gt;

&lt;h2 id=&quot;the-problem&quot;&gt;The Problem&lt;&#x2F;h2&gt;

&lt;p&gt;When you fork a project and clone it to your local computer, you&#x27;ll eventually need to update it with the &lt;code&gt;master&lt;&#x2F;code&gt; branch of the upstream project (or whatever the default branch is set to). That way you will be able to checkout an up-to-date branch to work from. If you do not do that, you are very likely to stumble upon merge conflicts in the end, since the copy of the code you&#x27;re working could be out-of-date.&lt;&#x2F;p&gt;

&lt;p&gt;To prevent this, first you&#x27;d need to pull the upstream, push to the remote, checkout a new branch from the &lt;code&gt;master&lt;&#x2F;code&gt; branch up-to-date, then finally start working on your changes. This takes time, and if you forget to do it, can cause a lot of pain. This process takes some time to complete, and turns out to be annoying if you need to do this multiple times a day. That&#x27;s why we could use a better solution.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;the-solution&quot;&gt;The Solution&lt;&#x2F;h2&gt;

&lt;p&gt;GitLab can do that for you with no pain! Yay! What you need to do is very simple: enable &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;workflow&#x2F;repository_mirroring.html&quot;&gt;GitLab Repository Mirroring&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-arrow-circle-o-right gitlab-purple&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;
&lt;strong&gt;First&lt;&#x2F;strong&gt;. Mirror your fork:&lt;&#x2F;p&gt;

&lt;p&gt;Under your forked project&#x27;s &lt;strong&gt;Settings&lt;&#x2F;strong&gt;, navigate to &lt;strong&gt;Mirror Repository&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;how-to-keep-your-fork-up-to-date-with-its-origin&#x2F;mirror-repository-settings.png&quot; alt=&quot;settings - mirror repository&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-arrow-circle-o-right gitlab-purple&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;
&lt;strong&gt;Second&lt;&#x2F;strong&gt;. Add the upstream&#x27;s path to the field &lt;strong&gt;Git repository URL&lt;&#x2F;strong&gt;, then enable automatic mirroring:&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;how-to-keep-your-fork-up-to-date-with-its-origin&#x2F;setup-automatic-mirror.png&quot; alt=&quot;fork - enable automatic repository update&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-arrow-circle-o-right gitlab-purple&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;
&lt;strong&gt;Third&lt;&#x2F;strong&gt;. Setup the &lt;strong&gt;mirror user&lt;&#x2F;strong&gt;: it&#x27;s the user whose new commits to the upstream project will be attributed to in your fork.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-check-circle-o&quot; aria-hidden=&quot;true&quot; style=&quot;color: green&quot;&gt;&lt;&#x2F;i&gt;
&lt;strong&gt;Done&lt;&#x2F;strong&gt;! Once an hour, GitLab will pull the upstream for you, and keep your fork up-to-date!&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;how-to-keep-your-fork-up-to-date-with-its-origin&#x2F;repository-mirrored.png&quot; alt=&quot;fork - repo successfully mirrored&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;By doing so, you only need to proceed as you usually do for your own projects (pull, checkout a new branch, and push your commits). All the rest GitLab does for you!&lt;&#x2F;p&gt;

&lt;p&gt;Simple, isn&#x27;t it?&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-success text-center&quot;&gt;Repository Mirroring is available for free at &lt;strong&gt;GitLab.com&lt;&#x2F;strong&gt; and to all &lt;strong&gt;GitLab Enterprise Edition&lt;&#x2F;strong&gt; users.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;the-secret&quot;&gt;The Secret&lt;&#x2F;h2&gt;

&lt;p&gt;In order to pull without authentication from an upstream repository you are contributing to, the project should be public in the first place. Also, the &lt;strong&gt;Repository&lt;&#x2F;strong&gt;&#x27;s &lt;strong&gt;Feature Visibility&lt;&#x2F;strong&gt; settings of the upstream project needs to be set to &lt;strong&gt;Everyone with access&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;how-to-keep-your-fork-up-to-date-with-its-origin&#x2F;feature-visibility-settings.png&quot; alt=&quot;feature visibility settings&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;You can find them in your project&#x27;s &lt;strong&gt;Settings&lt;&#x2F;strong&gt; (&lt;i class=&quot;fa fa-cog&quot; aria-hidden=&quot;true&quot; style=&quot;color: grey&quot;&gt;&lt;&#x2F;i&gt;) &amp;gt; &lt;strong&gt;Edit Project&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;Note that you can mirror private projects as well, but you&#x27;d need to be a member of the project or the group it belongs.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;what-is-your-solution&quot;&gt;What is Your Solution?&lt;&#x2F;h2&gt;

&lt;p&gt;We would love to know how you do that! Do you have a different solution? You can certainly help others. Please share them in the comments, so everyone from the community can decide which solution is the best for them. Thank you!&lt;&#x2F;p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;

&lt;p&gt;Hopefully, we provided you with an easy solution for keeping your fork up-to-date. Remember, you can even mirror repositories hosted in other Git platforms!&lt;&#x2F;p&gt;

&lt;p&gt;Cool! I&#x27;m looking forward to hearing from you: feedback, questions, and suggestions are very welcome! Leave your comment below, and&#x2F;or tweet at us &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;gitlab&quot;&gt;@GitLab&lt;&#x2F;a&gt;! We &lt;i class=&quot;fa fa-heart gitlab-purple&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt; our community!&lt;&#x2F;p&gt;

&lt;!-- cover image: https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;8yqds_91OLw --&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;how-to-keep-your-fork-up-to-date-with-its-origin&#x2F;fork.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>How to explain GitLab to anyone</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/30/how-to-explain-gitlab-to-anyone/"/>
    <id>https://about.gitlab.com/2016/11/30/how-to-explain-gitlab-to-anyone/</id>
    <published>2016-11-30T00:00:00+00:00</published>
    <updated>2016-11-30T00:00:00+00:00</updated>
    <author>
      <name>Rebecca Dodd</name>
    </author>
    <content type="html">
&lt;p&gt;How do you explain what GitLab is and how it works to a non-technical person?&lt;&#x2F;p&gt;

&lt;p&gt;This is a challenge I’m facing right now, as I try to describe the company I just joined to my family and friends.  Initial conversations were not very successful:&lt;&#x2F;p&gt;

&lt;p&gt;Me: “It’s an open source workflow solution…”&lt;&#x2F;p&gt;

&lt;p&gt;Them: “What’s a workflow?”&lt;&#x2F;p&gt;

&lt;p&gt;Me:&lt;&#x2F;p&gt;

&lt;p&gt;Them:&lt;&#x2F;p&gt;

&lt;p&gt;Me:&lt;&#x2F;p&gt;

&lt;p&gt;I’ve been getting closer (“We help people who write code to collaborate on projects”), but it’s still hard to drive the idea home in a way that really speaks to people – especially if they have only a vague idea of what coding is.&lt;&#x2F;p&gt;

&lt;p&gt;In a team meeting we tried to come up with some real-world examples of how GitLab works, from using files on a computer, to DropBox, to Google Docs. But what if you’re talking to someone who’s not that comfortable with computers?&lt;&#x2F;p&gt;

&lt;h2 id=&quot;lets-bring-it-back-to-something-relatable-paper&quot;&gt;Let’s bring it back to something relatable, paper!&lt;&#x2F;h2&gt;

&lt;p&gt;Say I’m a newspaper journalist collaborating with my team on a big story about a concert. We’ve been given a brief, but we each have different aspects of the story to cover: someone will interview the performers, someone else will provide some background about the venue.&lt;&#x2F;p&gt;

&lt;p&gt;If we all worked on that original brief, we might end up writing over each other’s contributions and it would be hard to see what each person is working on. We have a meeting to divide up the work and establish what each team member’s task is and how we will approach it. To make things more efficient, we make photocopies of the brief so that each team member has their own copy that they can start adding to. We all have other articles we’re working on at the same time, so we spend some time prioritising tasks.&lt;&#x2F;p&gt;

&lt;p&gt;I write a draft, and when I’m happy with my contribution, it needs to be fact checked and edited for spelling and grammar. Once a sub-editor gives it the go-ahead, I approach my editor to add my piece (currently on the photocopied brief) to the main story. My editor reviews my work, approves it for the story and includes it in the original. When this is done we create a mock-up of the newspaper page with the article so we can see how it will look.&lt;&#x2F;p&gt;

&lt;p&gt;My colleagues go through the same process until all of their work is visible too – this happens every time a change is made, no matter how small, so we know that each new part of the story has been reviewed and checked for errors. When the deadline comes, we send the newspaper to the printers and then it gets distributed. We might get some responses to our story from readers who write in: someone might suggest some information that would have been useful to include in the article, so we update the online version of the article on our website and the new addition is visible right away. Other reader feedback might be useful for improving what we write about next time.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;brief-to-print.png&quot; alt=&quot;Brief to Print&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;this-is-how-gitlab-works&quot;&gt;This is how GitLab works!&lt;&#x2F;h2&gt;

&lt;p&gt;The process I described above is a &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;2016&#x2F;10&#x2F;25&#x2F;gitlab-workflow-an-overview&#x2F;&quot;&gt;workflow in which everyone collaborates to bring an idea to production&lt;&#x2F;a&gt;, and it’s a process that works just as well for developers making software as it does for my imaginary newspaper team.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;idea-to-production.png&quot; alt=&quot;Idea to Production&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;In GitLab, we start with an Idea (the main article that everyone will work on), then break it up into Issues (each team member’s tasks). To help us plan, we have an Issue Board to organize Issues into order of priority, just as the journalists had to work out how they were going to approach their tasks in amongst the other articles they are working on. To make sure we don’t overwrite each other’s work, we make our own ‘photocopies’ of the original idea: we call these Branches.&lt;&#x2F;p&gt;

&lt;p&gt;Then, we code! This is like that first draft of my contribution to the story. When the code is ready, we Commit it, like a final draft. The sub-editor checking the work before updating the article is part of what we call Continuous Integration – a system by which the project is updated throughout the day, and those updates are automatically, continually checked for any problems. When I ask the editor to approve my contribution, we do this in the form of a Merge Request, and when that’s been approved, we can preview the changes in Staging, just like the newspaper team did with the mock-up of the page. If everything looks good, it goes into Production, the equivalent of going off to the printers.&lt;&#x2F;p&gt;

&lt;p&gt;The last stage of the cycle is feedback: our ‘reader letters’ might be comments from colleagues or users, or data from analytics, and we use it to make sure we’re always improving. If there’s something we can change immediately, Continuous Deployment ensures the project is always up to date (like the newspaper’s website can show a change or addition to an article right away), and other feedback is used to do better next time.&lt;&#x2F;p&gt;

&lt;p&gt;Image: &quot;&lt;a href=&quot;https:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;eivind1983&#x2F;4703991995&#x2F;in&#x2F;gallery-94794587@N03-72157635294619645&#x2F;&quot;&gt;The Deptford Project — Newspaper&lt;&#x2F;a&gt;&quot; by &lt;a href=&quot;https:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;eivind1983&#x2F;&quot;&gt;Eivind Z. Molvær&lt;&#x2F;a&gt; is licensed under &lt;a href=&quot;https:&#x2F;&#x2F;creativecommons.org&#x2F;licenses&#x2F;by&#x2F;2.0&#x2F;&quot;&gt;CC BY 2.0&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;explain-gitlab-cover.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>GitLab Major Security Update for CVE-2016-9469</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/30/gitlab-major-security-update-for-cve-2016-9469/"/>
    <id>https://about.gitlab.com/2016/11/30/gitlab-major-security-update-for-cve-2016-9469/</id>
    <published>2016-11-30T00:00:00+00:00</published>
    <updated>2016-11-30T00:00:00+00:00</updated>
    <author>
      <name>Brian Neel</name>
    </author>
    <content type="html">
&lt;p&gt;On Monday, December 5th, 2016 at 3:59pm PST (23:59 UTC), we will publish a major
GitLab security update to address CVE-2016-9469, a denial-of-service and data
corruption vulnerability. More details will be forthcoming on &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;blog&quot;&gt;our blog&lt;&#x2F;a&gt;, 
including which versions of GitLab are affected.&lt;&#x2F;p&gt;

&lt;p&gt;We recommend installations running affected versions to upgrade
immediately. Please forward this alert to the appropriate people at your
organization and have them subscribe to &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;contact&#x2F;&quot;&gt;Security Notices&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;


&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>Setting Up GitLab CI for Android Projects</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/30/setting-up-gitlab-ci-for-android-projects/"/>
    <id>https://about.gitlab.com/2016/11/30/setting-up-gitlab-ci-for-android-projects/</id>
    <published>2016-11-30T00:00:00+00:00</published>
    <updated>2016-11-30T00:00:00+00:00</updated>
    <author>
      <name>Greyson Parrelli</name>
    </author>
    <content type="html">
&lt;p&gt;Have you ever accidentally checked in a typo that broke your Android build or unknowingly broke an important use case with a new change? Continuous Integration is a way to avoid these headaches, allowing you to confirm that changes to your app compile, and your tests pass before they&#x27;re merged in.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;gitlab-ci&#x2F;&quot;&gt;GitLab CI&lt;&#x2F;a&gt; is a wonderful &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;2016&#x2F;08&#x2F;05&#x2F;continuous-integration-delivery-and-deployment-with-gitlab&#x2F;&quot;&gt;Continuous Integration&lt;&#x2F;a&gt; built-in solution, and in this post we&#x27;ll walk through how to setup a basic config file (&lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt;) to ensure your Android app compiles and passes unit and functional tests. We assume that you know the process of creating an Android app, can write and run tests locally, and are familiar with the basics of the GitLab UI.&lt;&#x2F;p&gt;



&lt;h2 id=&quot;our-sample-project&quot;&gt;Our Sample Project&lt;&#x2F;h2&gt;

&lt;p&gt;Here&#x27;s the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;greysonp&#x2F;gitlab-ci-android&quot;&gt;sample project&lt;&#x2F;a&gt; we&#x27;ll be working with today. It&#x27;s very simple. The app allows you to input two numbers, and then click &quot;Calculate&quot; to view the sum in a separate Activity. This is of course a very silly way to structure an app, but it allows us to write some clear examples of different kinds of tests.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;setting-up-gitlab-ci-for-android-projects&#x2F;sample-app-screenshot.png&quot; alt=&quot;Sample app screenshot&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;h3 id=&quot;unit-tests&quot;&gt;Unit Tests&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;developer.android.com&#x2F;training&#x2F;testing&#x2F;unit-testing&#x2F;index.html&quot;&gt;Unit tests&lt;&#x2F;a&gt; are the fundamental tests in your app testing strategy, from which you can verify that the logic of individual units is correct. They are a fantastic way to catch regressions when making changes to your app. They run directly on the Java Virtual Machine (JVM), so you don&#x27;t need an actual Android device to run them.&lt;&#x2F;p&gt;

&lt;p&gt;If you already have working unit tests, you shouldn&#x27;t have to make any adjustments to have them work with GitLab CI. You can see some example unit tests in the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;greysonp&#x2F;gitlab-ci-android&#x2F;tree&#x2F;master&#x2F;app&#x2F;src&#x2F;test&#x2F;java&#x2F;com&#x2F;greysonparrelli&#x2F;gitlabciandroid&quot;&gt;sample app&lt;&#x2F;a&gt;. The sample doesn&#x27;t use &lt;a href=&quot;http:&#x2F;&#x2F;robolectric.org&#x2F;&quot;&gt;Robolectric&lt;&#x2F;a&gt;, but nothing stops you from doing so.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;functional-tests&quot;&gt;Functional Tests&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;(https:&#x2F;&#x2F;developer.android.com&#x2F;training&#x2F;testing&#x2F;ui-testing&#x2F;index.html)&quot;&gt;Functional tests&lt;&#x2F;a&gt;, sometimes called UI tests or emulator tests, are great for those times when unit tests aren&#x27;t practical. They are often used when you want to test a distinct user path that would be difficult to unit test. In our &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;greysonp&#x2F;gitlab-ci-android&#x2F;blob&#x2F;master&#x2F;app&#x2F;src&#x2F;androidTest&#x2F;java&#x2F;com&#x2F;greysonparrelli&#x2F;gitlabciandroid&#x2F;AddingTest.java&quot;&gt;sample app&lt;&#x2F;a&gt;, we test the path of a user inputting numbers, pressing &quot;Calculate,&quot; and seeing the result in the next Activity. Functional tests run on an actual Android device or emulator and can therefore be slow to execute, meaning that are typically only used when other testing methods aren&#x27;t sufficient.&lt;&#x2F;p&gt;

&lt;p&gt;Because functional tests run on an actual Android device or emulator, they tend to be finnicky. Any number of things could happen to screw up the test, including the screen locking. To help prevent this, the sample project includes a &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;greysonp&#x2F;gitlab-ci-android&#x2F;blob&#x2F;master&#x2F;app&#x2F;src&#x2F;androidTest&#x2F;java&#x2F;com&#x2F;greysonparrelli&#x2F;gitlabciandroid&#x2F;TestBase.java&quot;&gt;base class&lt;&#x2F;a&gt; for tests to ensure the screen is unlocked when the tests are run. The base class contains this &lt;code&gt;@Before&lt;&#x2F;code&gt;-annotated method, meaning that it is run before each of your tests:&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight java&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@Before&lt;&#x2F;span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;&#x2F;span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;nf&quot;&gt;setup&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;&#x2F;span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;&#x2F;span&gt;
    &lt;span class=&quot;c1&quot;&gt;&#x2F;&#x2F; Unlock the screen if it&#x27;s locked&lt;&#x2F;span&gt;
    &lt;span class=&quot;n&quot;&gt;UiDevice&lt;&#x2F;span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;&#x2F;span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;n&quot;&gt;UiDevice&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;getInstance&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;n&quot;&gt;InstrumentationRegistry&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;getInstrumentation&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;&#x2F;span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;&#x2F;span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;&#x2F;span&gt;
        &lt;span class=&quot;n&quot;&gt;device&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;wakeUp&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;&#x2F;span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;&#x2F;span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;&#x2F;span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;n&quot;&gt;RemoteException&lt;&#x2F;span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;&#x2F;span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;&#x2F;span&gt;
        &lt;span class=&quot;n&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;printStackTrace&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;&#x2F;span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;&#x2F;span&gt;

    &lt;span class=&quot;c1&quot;&gt;&#x2F;&#x2F; Set the flags on our activity so it&#x27;ll appear regardless of lock screen state&lt;&#x2F;span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;&#x2F;span&gt; &lt;span class=&quot;n&quot;&gt;Activity&lt;&#x2F;span&gt; &lt;span class=&quot;n&quot;&gt;activity&lt;&#x2F;span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;n&quot;&gt;getActivityRule&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;getActivity&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;&#x2F;span&gt;
    &lt;span class=&quot;n&quot;&gt;Runnable&lt;&#x2F;span&gt; &lt;span class=&quot;n&quot;&gt;wakeUpDevice&lt;&#x2F;span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;&#x2F;span&gt; &lt;span class=&quot;n&quot;&gt;Runnable&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;&#x2F;span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;&#x2F;span&gt;
        &lt;span class=&quot;kd&quot;&gt;public&lt;&#x2F;span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;nf&quot;&gt;run&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;&#x2F;span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;&#x2F;span&gt;
            &lt;span class=&quot;n&quot;&gt;activity&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;getWindow&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;addFlags&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;n&quot;&gt;WindowManager&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;LayoutParams&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;FLAG_TURN_SCREEN_ON&lt;&#x2F;span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;&#x2F;span&gt;
                    &lt;span class=&quot;n&quot;&gt;WindowManager&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;LayoutParams&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;FLAG_SHOW_WHEN_LOCKED&lt;&#x2F;span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;&#x2F;span&gt;
                    &lt;span class=&quot;n&quot;&gt;WindowManager&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;LayoutParams&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;FLAG_KEEP_SCREEN_ON&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;&#x2F;span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;&#x2F;span&gt;
    &lt;span class=&quot;o&quot;&gt;};&lt;&#x2F;span&gt;
    &lt;span class=&quot;n&quot;&gt;activity&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;na&quot;&gt;runOnUiThread&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;n&quot;&gt;wakeUpDevice&lt;&#x2F;span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;&#x2F;span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now that we&#x27;ve got the project setup, let&#x27;s look at how we integrate GitLab CI.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;setting-up-gitlab-ci&quot;&gt;Setting Up GitLab CI&lt;&#x2F;h2&gt;

&lt;p&gt;We want to be able to configure our project so that our app is built, and it has both the unit and functional tests run upon check-in. To do so, we have to create our GitLab CI config file, called &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt;, and place it in the root of our project.&lt;&#x2F;p&gt;

&lt;p&gt;So, first things first: If you&#x27;re just here for a snippet to copy-paste, here is a &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt; that will build and test your app:&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;image&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;openjdk:8-jdk&lt;&#x2F;span&gt;

&lt;span class=&quot;na&quot;&gt;variables&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;ANDROID_COMPILE_SDK&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;&#x2F;span&gt;&lt;span class=&quot;s&quot;&gt;25&quot;&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;ANDROID_BUILD_TOOLS&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;&#x2F;span&gt;&lt;span class=&quot;s&quot;&gt;24.0.0&quot;&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;ANDROID_SDK_TOOLS&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;&#x2F;span&gt;&lt;span class=&quot;s&quot;&gt;24.4.1&quot;&lt;&#x2F;span&gt;

&lt;span class=&quot;na&quot;&gt;before_script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;apt-get --quiet update --yes&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;wget --quiet --output-document=android-sdk.tgz https:&#x2F;&#x2F;dl.google.com&#x2F;android&#x2F;android-sdk_r${ANDROID_SDK_TOOLS}-linux.tgz&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;tar --extract --gzip --file=android-sdk.tgz&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter android-${ANDROID_COMPILE_SDK}&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter platform-tools&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter build-tools-${ANDROID_BUILD_TOOLS}&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter extra-android-m2repository&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter extra-google-google_play_services&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter extra-google-m2repository&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;export ANDROID_HOME=$PWD&#x2F;android-sdk-linux&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;export PATH=$PATH:$PWD&#x2F;android-sdk-linux&#x2F;platform-tools&#x2F;&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;chmod +x .&#x2F;gradlew&lt;&#x2F;span&gt;

&lt;span class=&quot;na&quot;&gt;stages&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;build&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;test&lt;&#x2F;span&gt;

&lt;span class=&quot;na&quot;&gt;build&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;stage&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;build&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;.&#x2F;gradlew assembleDebug&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;artifacts&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;paths&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;app&#x2F;build&#x2F;outputs&#x2F;&lt;&#x2F;span&gt;

&lt;span class=&quot;na&quot;&gt;unitTests&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;stage&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;test&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;.&#x2F;gradlew test&lt;&#x2F;span&gt;

&lt;span class=&quot;na&quot;&gt;functionalTests&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;stage&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;test&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;wget --quiet --output-document=android-wait-for-emulator https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;travis-ci&#x2F;travis-cookbooks&#x2F;0f497eb71291b52a703143c5cd63a217c8766dc9&#x2F;community-cookbooks&#x2F;android-sdk&#x2F;files&#x2F;default&#x2F;android-wait-for-emulator&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;chmod +x android-wait-for-emulator&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter sys-img-x86-google_apis-${ANDROID_COMPILE_SDK}&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo no | android-sdk-linux&#x2F;tools&#x2F;android create avd -n test -t android-${ANDROID_COMPILE_SDK} --abi google_apis&#x2F;x86&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;android-sdk-linux&#x2F;tools&#x2F;emulator64-x86 -avd test -no-window -no-audio &amp;amp;&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;.&#x2F;android-wait-for-emulator&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;adb shell input keyevent 82&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;.&#x2F;gradlew cAT&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;greysonp&#x2F;gitlab-ci-android&#x2F;blob&#x2F;master&#x2F;.gitlab-ci.yml&quot;&gt;Source&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Well, that&#x27;s a lot of code! Let&#x27;s break it down.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;understanding-&quot;&gt;Understanding &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt;&lt;&#x2F;h3&gt;

&lt;h4 class=&quot;special-h4&quot; id=&quot;defining-the-docker-image&quot;&gt;Defining the Docker Image&lt;&#x2F;h4&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;image&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;openjdk:8-jdk&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This tells &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;runners&#x2F;README.html#runners&quot;&gt;GitLab Runners&lt;&#x2F;a&gt; (the things that are executing our build) what &lt;a href=&quot;https:&#x2F;&#x2F;hub.docker.com&#x2F;explore&#x2F;&quot;&gt;Docker image&lt;&#x2F;a&gt; to use. If you&#x27;re not familiar with &lt;a href=&quot;https:&#x2F;&#x2F;hub.docker.com&#x2F;&quot;&gt;Docker&lt;&#x2F;a&gt;, the TL;DR is that Docker provides a way to create a completely isolated version of a virtual operating system running in it’s own &lt;a href=&quot;https:&#x2F;&#x2F;www.sdxcentral.com&#x2F;cloud&#x2F;containers&#x2F;definitions&#x2F;what-is-docker-container-open-source-project&#x2F;&quot;&gt;container&lt;&#x2F;a&gt;. Anything running inside the container thinks it has the whole machine to itself, but in reality there can be many containers running on a single machine. Unlike full virtual machines, Docker containers are super fast to create and destroy, making them great choices for setting up temporary environments for building and testing.&lt;&#x2F;p&gt;

&lt;p&gt;This &lt;a href=&quot;https:&#x2F;&#x2F;hub.docker.com&#x2F;_&#x2F;openjdk&#x2F;&quot;&gt;Docker image (&lt;code&gt;openjdk:8-jdk&lt;&#x2F;code&gt;)&lt;&#x2F;a&gt; works perfectly for our use case, as it is just a barebones installation of Debian with Java pre-installed. We then run additional commands further down in our config to make our image capable of building Android apps.&lt;&#x2F;p&gt;

&lt;h4 id=&quot;defining-variables&quot;&gt;Defining Variables&lt;&#x2F;h4&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;variables&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;ANDROID_COMPILE_SDK&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;&#x2F;span&gt;&lt;span class=&quot;s&quot;&gt;25&quot;&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;ANDROID_BUILD_TOOLS&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;&#x2F;span&gt;&lt;span class=&quot;s&quot;&gt;24.0.0&quot;&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;ANDROID_SDK_TOOLS&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;&#x2F;span&gt;&lt;span class=&quot;s&quot;&gt;24.4.1&quot;&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;These are variables we&#x27;ll use throughout our script. They&#x27;re named to match the properties you specify in your app&#x27;s &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;greysonp&#x2F;gitlab-ci-android&#x2F;blob&#x2F;master&#x2F;app&#x2F;build.gradle&quot;&gt;&lt;code&gt;build.gradle&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;ANDROID_COMPILE_SDK&lt;&#x2F;code&gt; is the version of Android you&#x27;re compiling with. It should match &lt;code&gt;compileSdkVersion&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;code&gt;ANDROID_BUILD_TOOLS&lt;&#x2F;code&gt; is the version of the Android build tools you are using. It should match &lt;code&gt;buildToolsVersion&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;code&gt;ANDROID_SDK_TOOLS&lt;&#x2F;code&gt; is a little funny. It&#x27;s what version of the command line tools we&#x27;re going to download from the &lt;a href=&quot;https:&#x2F;&#x2F;developer.android.com&#x2F;studio&#x2F;index.html&quot;&gt;official site&lt;&#x2F;a&gt;. So, that number really just comes from the latest version available there.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h4 class=&quot;special-h4&quot; id=&quot;installing-packages&quot;&gt;Installing Packages&lt;&#x2F;h4&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;before_script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;apt-get --quiet update --yes&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This starts the block of the commands that will be run before each job in our config.&lt;&#x2F;p&gt;

&lt;p&gt;These commands ensure that our package repository listings are up to date, and it installs packages we&#x27;ll be using later on, namely: &lt;code&gt;wget&lt;&#x2F;code&gt;, &lt;code&gt;tar&lt;&#x2F;code&gt;, &lt;code&gt;unzip&lt;&#x2F;code&gt;, and some packages that are necessary to allow 64-bit machines to run Android&#x27;s 32-bit tools.&lt;&#x2F;p&gt;

&lt;h4 id=&quot;installing-the-android-sdk&quot;&gt;Installing the Android SDK&lt;&#x2F;h4&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;wget --quiet --output-document=android-sdk.tgz https:&#x2F;&#x2F;dl.google.com&#x2F;android&#x2F;android-sdk_r${ANDROID_SDK_TOOLS}-linux.tgz&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;tar --extract --gzip --file=android-sdk.tgz&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter android-${ANDROID_COMPILE_SDK}&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter platform-tools&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter build-tools-${ANDROID_BUILD_TOOLS}&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter extra-android-m2repository&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter extra-google-google_play_services&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter extra-google-m2repository&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here we&#x27;re downloading the Android SDK tools from their official location, using our &lt;code&gt;ANDROID_SDK_TOOLS&lt;&#x2F;code&gt; variable to specify the version. Afterwards, we&#x27;re unzipping the tools and running a series of &lt;code&gt;android&lt;&#x2F;code&gt; commands to install the necessary Android SDK packages that will allow our app to build.&lt;&#x2F;p&gt;

&lt;h4 id=&quot;setting-up-the-environment&quot;&gt;Setting Up the Environment&lt;&#x2F;h4&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;export ANDROID_HOME=$PWD&#x2F;android-sdk-linux&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;export PATH=$PATH:$PWD&#x2F;android-sdk-linux&#x2F;platform-tools&#x2F;&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;chmod +x .&#x2F;gradlew&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, we wrap up the &lt;code&gt;before_script&lt;&#x2F;code&gt; section of our config with a few remaining tasks. First, we set the &lt;code&gt;ANDROID_HOME&lt;&#x2F;code&gt; environment variable to the SDK location, which is necessary for our app to build. Next, we add the platform tools to our &lt;code&gt;PATH&lt;&#x2F;code&gt;, allowing us to use the &lt;code&gt;adb&lt;&#x2F;code&gt; command without specifying its full path, which is important when we run a downloaded script later. Finally, we ensure that &lt;code&gt;gradlew&lt;&#x2F;code&gt; is executable, as sometimes Git will mess up permissions.&lt;&#x2F;p&gt;

&lt;h4 id=&quot;defining-the-stages&quot;&gt;Defining the Stages&lt;&#x2F;h4&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;stages&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;build&lt;&#x2F;span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;test&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here we&#x27;re defining the different &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;ci&#x2F;yaml&#x2F;README.html#stages&quot;&gt;stages&lt;&#x2F;a&gt; of our build. We can call these anything we want. A stage can be thought of as a group of &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;ci&#x2F;yaml&#x2F;README.html#jobs&quot;&gt;jobs&lt;&#x2F;a&gt;. All of the jobs in the same stage happen in parallel, and all jobs in one stage must be completed before the jobs in the subsequent stage begin. We&#x27;ve defined two stages: &lt;code&gt;build&lt;&#x2F;code&gt; and &lt;code&gt;test&lt;&#x2F;code&gt;. They do exactly what you think: the &lt;code&gt;build&lt;&#x2F;code&gt; stage ensures the app compiles, and the &lt;code&gt;test&lt;&#x2F;code&gt; stage runs our unit and functional tests.&lt;&#x2F;p&gt;

&lt;h4 id=&quot;building-the-app&quot;&gt;Building the App&lt;&#x2F;h4&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;build&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;stage&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;build&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;.&#x2F;gradlew assembleDebug&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;artifacts&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;paths&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;app&#x2F;build&#x2F;outputs&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This defines our first job, called &lt;code&gt;build&lt;&#x2F;code&gt;. It&#x27;s the only job in the &lt;code&gt;build&lt;&#x2F;code&gt; stage. It just builds the debug version of the app and makes the outputs of the build available for download via the &lt;code&gt;artifacts&lt;&#x2F;code&gt; field.&lt;&#x2F;p&gt;

&lt;h4 id=&quot;running-unit-tests&quot;&gt;Running Unit Tests&lt;&#x2F;h4&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;unitTests&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;stage&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;test&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;.&#x2F;gradlew test&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This defines a job called &lt;code&gt;unitTests&lt;&#x2F;code&gt; that runs during the &lt;code&gt;test&lt;&#x2F;code&gt; stage. Nothing crazy here - we&#x27;re just running unit tests.&lt;&#x2F;p&gt;

&lt;h4 id=&quot;running-functional-tests&quot;&gt;Running Functional Tests&lt;&#x2F;h4&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;functionalTests&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;stage&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;test&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;wget --quiet --output-document=android-wait-for-emulator https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;travis-ci&#x2F;travis-cookbooks&#x2F;0f497eb71291b52a703143c5cd63a217c8766dc9&#x2F;community-cookbooks&#x2F;android-sdk&#x2F;files&#x2F;default&#x2F;android-wait-for-emulator&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;chmod +x android-wait-for-emulator&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo y | android-sdk-linux&#x2F;tools&#x2F;android --silent update sdk --no-ui --all --filter sys-img-x86-google_apis-${ANDROID_COMPILE_SDK}&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;echo no | android-sdk-linux&#x2F;tools&#x2F;android create avd -n test -t android-${ANDROID_COMPILE_SDK} --abi google_apis&#x2F;x86&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;android-sdk-linux&#x2F;tools&#x2F;emulator64-x86 -avd test -no-window -no-audio &amp;amp;&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;.&#x2F;android-wait-for-emulator&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;adb shell input keyevent 82&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;.&#x2F;gradlew cAT&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;artifacts&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;paths&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;app&#x2F;build&#x2F;reports&#x2F;androidTests&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This defines a job called &lt;code&gt;functionalTests&lt;&#x2F;code&gt; that runs during the &lt;code&gt;test&lt;&#x2F;code&gt; stage. Functional tests are a little tricky to setup. First, we download a script that will allow us to detect when an emulator has finished booting. Then, we download the emulator system image we&#x27;re going to use and create an instance of it. Afterwards, we start the emulator, wait for it to finish booting using our downloaded script, use &lt;code&gt;adb&lt;&#x2F;code&gt; to send a signal to unlock the screen, and run our tests. After running these tests, the generated test report is made available for download via the &lt;code&gt;artifacts&lt;&#x2F;code&gt; field.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;run-your-new-ci-setup&quot;&gt;Run Your new CI Setup&lt;&#x2F;h2&gt;

&lt;p&gt;After you&#x27;ve added your new &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt; file to the root of your directory, just push your changes and off you go! You can see your running builds in the &lt;strong&gt;Pipelines&lt;&#x2F;strong&gt; tab of your project. You can even watch your build execute live and see the runner&#x27;s output, allowing you to easily debug problems.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;setting-up-gitlab-ci-for-android-projects&#x2F;artifacts-tutorial-01.png&quot; alt=&quot;Pipelines tab screenshot&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;After your build is done, you can retrieve your build artifacts:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;First, click on your completed build:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;setting-up-gitlab-ci-for-android-projects&#x2F;artifacts-tutorial-02.png&quot; alt=&quot;Build details button screenshot&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;Then, navigate to the &lt;strong&gt;Builds&lt;&#x2F;strong&gt; tab:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;setting-up-gitlab-ci-for-android-projects&#x2F;artifacts-tutorial-03.png&quot; alt=&quot;Builds tab screenshot&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;Lastly, click on the download button for your desired job:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;setting-up-gitlab-ci-for-android-projects&#x2F;artifacts-tutorial-04.png&quot; alt=&quot;Download button screenshot&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;

&lt;p&gt;So, there you have it! You now know how to create a GitLab CI config that will ensure your app:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;Compiles&lt;&#x2F;li&gt;
  &lt;li&gt;Passes unit tests&lt;&#x2F;li&gt;
  &lt;li&gt;Passes functional tests&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;And allows you to access your build artifacts (like your &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Android_application_package&quot;&gt;APK&lt;&#x2F;a&gt;) afterwards.&lt;&#x2F;p&gt;

&lt;p&gt;Enjoy your newfound app stability :)&lt;&#x2F;p&gt;

&lt;h2 id=&quot;about-guest-author&quot;&gt;About Guest Author&lt;&#x2F;h2&gt;

&lt;p&gt;&lt;a href=&quot;http:&#x2F;&#x2F;www.greysonparrelli.com&#x2F;&quot;&gt;Greyson Parrelli&lt;&#x2F;a&gt; is an Android developer at Snap Inc. working on &lt;a href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.snapchat.android&amp;amp;hl=en&quot;&gt;Snapchat&lt;&#x2F;a&gt;. Previously, he&#x27;s worked on the &lt;a href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.google.android.youtube&amp;amp;hl=en&quot;&gt;YouTube&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.yahoo.mobile.client.android.weather&amp;amp;hl=en&quot;&gt;Yahoo! Weather&lt;&#x2F;a&gt;, and &lt;a href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.yahoo.mobile.client.android.mail&amp;amp;hl=en&quot;&gt;Yahoo! Mail&lt;&#x2F;a&gt; Android apps.&lt;&#x2F;p&gt;

&lt;!-- closes https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;blog-posts&#x2F;issues&#x2F;28 --&gt;
&lt;!-- cover image: https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;aso6SYJZGps --&gt;

&lt;style&gt;
  img {
    display: block;
    margin: 0 auto 20px auto;
  }
  .special-h4 {
    margin-top: 20px !important;
  }
&lt;&#x2F;style&gt;

&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;setting-up-gitlab-ci-for-android-projects&#x2F;banner.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>Join our December Issue Bash</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/28/join-our-december-issue-bash/"/>
    <id>https://about.gitlab.com/2016/11/28/join-our-december-issue-bash/</id>
    <published>2016-11-28T00:00:00+00:00</published>
    <updated>2016-11-28T00:00:00+00:00</updated>
    <author>
      <name>Rebecca Dodd</name>
    </author>
    <content type="html">
&lt;p&gt;Join us for an all-weekend Issue Bash on 3-4 December and you could walk away with a &lt;a href=&quot;https:&#x2F;&#x2F;getchip.com&#x2F;pages&#x2F;pocketchip&quot;&gt;Pocket CHIP&lt;&#x2F;a&gt; – we&#x27;re giving away two! Two Raspberry Pis and 10 GitLab T-shirts are also up for grabs.&lt;&#x2F;p&gt;

&lt;p&gt;There are currently over 5000 open issues on GitLab CE! We have over 1400 GitLab contributors, and we want everyone to be able to find issues to work on. Part of that means streamlining our issue tracker: culling duplicate issues, categorizing unlabelled issues and tackling bugs.&lt;&#x2F;p&gt;



&lt;p&gt;Our last Bug Bash helped us squash 80 bugs, let’s see what we can do this time!&lt;&#x2F;p&gt;

&lt;h2 id=&quot;when-is-it&quot;&gt;When is it?&lt;&#x2F;h2&gt;

&lt;p&gt;It all kicks off at 00:01 UTC on Saturday, 3 December and will run until 23:59 UTC on Sunday, 4 December.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;how-can-you-get-involved&quot;&gt;How can you get involved?&lt;&#x2F;h2&gt;

&lt;p&gt;Help us close issues: identify duplicate issues so a team member can close them&lt;&#x2F;p&gt;

&lt;p&gt;Investigate bugs: attempt to reproduce labeled bugs in a test project on GitLab.com&lt;&#x2F;p&gt;

&lt;p&gt;Fix bugs: close bug issues once and for all&lt;&#x2F;p&gt;

&lt;p&gt;Categorize existing issues: provide a suitable label for uncategorized issues&lt;&#x2F;p&gt;

&lt;p&gt;Check out the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;17815&quot;&gt;2016 GitLab-ce Issue Bash Proposal&lt;&#x2F;a&gt; to find out how to get started. To be considered for a prize you need at least one contribution accepted by the time GitLab 8.15 releases on 22 December. Prizes will be drawn at random.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;who-can-take-part&quot;&gt;Who can take part?&lt;&#x2F;h2&gt;

&lt;p&gt;This is a chance for anyone in the GitLab community to get involved, even if you don’t have technical experience. Some of the tasks above, like categorizing issues or spotting duplicates, are ideal for non-technical community members and are definitely prize-worthy!&lt;&#x2F;p&gt;

&lt;h2 id=&quot;questions-more-info&quot;&gt;Questions? More info?&lt;&#x2F;h2&gt;

&lt;p&gt;GitLab team members &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;markglenfletcher&quot;&gt;@markglenfletcher&lt;&#x2F;a&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;ClemMakesApps&quot;&gt;@ClemMakesApps&lt;&#x2F;a&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;haynes&quot;&gt;@haynes&lt;&#x2F;a&gt; will be on hand to answer questions and close issues.&lt;&#x2F;p&gt;

&lt;p&gt;Image: &quot;&lt;a href=&quot;https:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;schatz&#x2F;3893795729&quot;&gt;Smash&lt;&#x2F;a&gt;&quot; by &lt;a href=&quot;https:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;schatz&#x2F;&quot;&gt;Richard Schatzberger&lt;&#x2F;a&gt; is licensed under &lt;a href=&quot;https:&#x2F;&#x2F;creativecommons.org&#x2F;licenses&#x2F;by-sa&#x2F;2.0&#x2F;#&quot;&gt;CC BY-SA 2.0&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;issue-bash.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>GitLab 8.14.1, 8.13.7 and 8.12.10 Released</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/28/gitlab-8-14-1-released/"/>
    <id>https://about.gitlab.com/2016/11/28/gitlab-8-14-1-released/</id>
    <published>2016-11-28T00:00:00+00:00</published>
    <updated>2016-11-28T00:00:00+00:00</updated>
    <author>
      <name>GitLab</name>
    </author>
    <content type="html">
&lt;p&gt;Today we are releasing version 8.14.1, 8.13.7 and 8.12.10 for GitLab Community Edition (CE) and
Enterprise Edition (EE).
This version contains an important security fix for a critical remote command
execution vulnerability in Mattermost, and we &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that anyone
running GitLab 8.14.0 with Mattermost enabled upgrade to this version
&lt;strong&gt;immediately&lt;&#x2F;strong&gt;.
Please read on for more details.
&lt;&#x2F;p&gt;
&lt;h2 id=&quot;remote-command-execution-via-mattermost-service-in-8140&quot;&gt;Remote Command Execution via Mattermost Service in 8.14.0&lt;&#x2F;h2&gt;
&lt;p&gt;Mattermost recently released a critical security update to address a remote
command execution vulnerability. Because the Omnibus version of GitLab 8.14.0
ships with Mattermost we are providing this emergency security patch.
Details of the vulnerability can be found at
&lt;a href=&quot;https:&#x2F;&#x2F;docs.mattermost.com&#x2F;administration&#x2F;changelog.html#release-v3-5-1&quot;&gt;https:&#x2F;&#x2F;docs.mattermost.com&#x2F;administration&#x2F;changelog.html#release-v3-5-1&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running GitLab 8.14.0 with
Mattermost enabled upgrade immediately. Mattermost is &lt;em&gt;not&lt;&#x2F;em&gt; enabled by default.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;workarounds&quot;&gt;Workarounds&lt;&#x2F;h3&gt;
&lt;p&gt;If you&#x27;re unable to upgrade right away, you can secure your GitLab installation
against this vulnerability using the workaround outlined below until you have
time to upgrade.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;disable-mattermost&quot;&gt;Disable Mattermost&lt;&#x2F;h4&gt;
&lt;p&gt;Login to your GitLab server(s) and perform the following:&lt;&#x2F;p&gt;
&lt;ol&gt;
  &lt;li&gt;Edit your &lt;code&gt;&#x2F;etc&#x2F;gitlab&#x2F;gitlab.rb&lt;&#x2F;code&gt; file&lt;&#x2F;li&gt;
  &lt;li&gt;Verify &lt;code&gt;mattermost[&#x27;gitlab_enable&#x27;]&lt;&#x2F;code&gt; is set to &lt;code&gt;false&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Save the file&lt;&#x2F;li&gt;
  &lt;li&gt;Run &lt;code&gt;sudo gitlab-ctl reconfigure&lt;&#x2F;code&gt;
Note: If you are running Mattermost on an external server and not through GitLab
this workaround will not be sufficient. Please consult your Mattermost
documentation on how to disable the service until you can install the patch.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;

&lt;h2 id=&quot;8141-8137-and-81210-security-fixes&quot;&gt;8.14.1, 8.13.7 and 8.12.10 Security fixes&lt;&#x2F;h2&gt;

&lt;h3 id=&quot;users-with-read-access-to-a-project-can-create-labels&quot;&gt;Users with Read Access to a Project Can Create Labels&lt;&#x2F;h3&gt;
&lt;p&gt;Hari Gopal reported a vulnerability involving non-members of a project who have
read-only access being able to create labels inside the project. &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;23416&quot;&gt;#23416&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;information-disclosure-for-private-project-names&quot;&gt;Information Disclosure for Private Project Names&lt;&#x2F;h3&gt;
&lt;p&gt;An internal code review discovered that it was possible to enumerate private
project names. &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;22869&quot;&gt;#22869&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;information-disclosure-for-private-issues&quot;&gt;Information Disclosure for Private Issues&lt;&#x2F;h3&gt;
&lt;p&gt;An internal code review discovered that it was possible to read private issues
using specifically-crafted search queries for projects with issues visibility
restricted to ‘Only team members&#x27;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;other-fixes-in-8141&quot;&gt;Other fixes in 8.14.1&lt;&#x2F;h2&gt;

&lt;p&gt;This version resolves a number of regressions and bugs in the &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;2016&#x2F;11&#x2F;22&#x2F;gitlab-8-14-released&#x2F;&quot;&gt;recent 8.14 release&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;ul&gt;
  &lt;li&gt;CE&#x2F;EE: Fix deselecting calendar days on contribution graph (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;6453&quot;&gt;!6453&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: 500 error on project show when user is not logged in and project is still empty (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7376&quot;&gt;!7376&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: Unify all MR widget text colors and background colors (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7571&quot;&gt;!7571&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: If Build running change accept merge request when build succeeds button from orange to blue (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7577&quot;&gt;!7577&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: External jobs do not have show page nor traces (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7617&quot;&gt;!7617&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: Issue creation now accepts trailing whitespace (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7633&quot;&gt;!7633&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: Resolve &quot;Labeling system notes downcase labels&quot; (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7636&quot;&gt;!7636&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: Fix NPM install warnings due to incompatible dependency version (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7641&quot;&gt;!7641&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: Clean up globals exemptions within .eslintrc (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7642&quot;&gt;!7642&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: Fix IID filter for merge requests and milestones (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7648&quot;&gt;!7648&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: Fix sidekiq stats in admin area (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7654&quot;&gt;!7654&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: Fix exceptions when loading build trace (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7658&quot;&gt;!7658&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: Fixed bug to do with calculating durations (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7663&quot;&gt;!7663&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: Resolve &quot;Wrong &lt;code&gt;render &#x27;index&#x27;&lt;&#x2F;code&gt;, should be &lt;code&gt;render &#x27;show&#x27;&lt;&#x2F;code&gt; in &lt;code&gt;Projects::PipelinesSettingsController#update&lt;&#x2F;code&gt;&quot; (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7665&quot;&gt;!7665&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;CE&#x2F;EE: Fix spacing between icon and word in status badge (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7678&quot;&gt;!7678&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;EE: Fix MergeRequestSerializer breaks on  when source_project doesn&#x27;t exist anymore (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;903&quot;&gt;!903&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;upgrade-barometer&quot;&gt;Upgrade barometer&lt;&#x2F;h2&gt;
&lt;p&gt;These versions do not include any new migrations, and should not require any
downtime.
Please be aware that by default the Omnibus packages will stop, run migrations,
and start again, no matter how “big” or “small” the upgrade is. This behavior
can be changed by adding a &lt;a href=&quot;http:&#x2F;&#x2F;doc.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;&lt;code&gt;&#x2F;etc&#x2F;gitlab&#x2F;skip-auto-migrations&lt;&#x2F;code&gt;
file&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;
&lt;p&gt;To update, check out our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;update&quot;&gt;update page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;enterprise-edition&quot;&gt;Enterprise Edition&lt;&#x2F;h2&gt;
&lt;p&gt;Interested in GitLab Enterprise Edition? Check out the &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;features&#x2F;#enterprise&quot;&gt;features exclusive to
EE&lt;&#x2F;a&gt;.
Access to GitLab Enterprise Edition is included with a
&lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;pricing&#x2F;&quot;&gt;subscription&lt;&#x2F;a&gt;. No time to upgrade GitLab
yourself? Subscribers receive upgrade and installation services.&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>'GitLab is a Slam Dunk': One Team Lead Weighs His Options</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/27/gitlab-is-a-slam-dunk/"/>
    <id>https://about.gitlab.com/2016/11/27/gitlab-is-a-slam-dunk/</id>
    <published>2016-11-27T00:00:00+00:00</published>
    <updated>2016-11-27T00:00:00+00:00</updated>
    <author>
      <name>Emily von Hoffmann</name>
    </author>
    <content type="html">
&lt;p&gt;Warren Postma is a team lead and &quot;de facto DevOps guy&quot; at &lt;a href=&quot;https:&#x2F;&#x2F;www.ramsoft.com&#x2F;&quot;&gt;RamSoft&lt;&#x2F;a&gt;, but like so many he&#x27;s gotten hooked on &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;warren.postma&quot;&gt;contributing&lt;&#x2F;a&gt; to GitLab in his spare time. After becoming familiar with GitHub, Atlassian, and Mercurial in previous jobs, he felt strongly that Git and GitLab were the best choice for his current team. Since reaching that conclusion, he&#x27;s also assisted his peers and former colleagues in their switch to GitLab, so I wanted to hear his opinions - they&#x27;re both strong and numerous, which made for a fun conversation.&lt;&#x2F;p&gt;



&lt;p&gt;Here are some highlights:&lt;&#x2F;p&gt;
&lt;ul&gt;
  &lt;li&gt;In a team distributed across timezones and languages, the decentralized nature of Git and GitLab is a huge win.&lt;&#x2F;li&gt;
  &lt;li&gt;If you pair people for code review who are in the same timezone, you can prevent having merge requests stay open for days or weeks.&lt;&#x2F;li&gt;
  &lt;li&gt;When switching to GitLab CI, the biggest barrier is training and removing ingrained habits - especially if people are also new to Git.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Can you briefly describe the kinds of projects you use GitLab for?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Warren:&lt;&#x2F;strong&gt; I use it for both personal projects and for my job. I switched a team at a small healthcare company from Subversion to Git, taught some of the team members their first steps in Git, and I switched from preferring Mercurial (another DVCS) to preferring Git, chiefly because I really like GitLab. There is nothing like GitLab for Mercurial although there is a project called RhodeCode and its fork Kallithea that comes close.  I spun up our private GitLab instance and taught our IT people how to maintain it (not hard really).&lt;&#x2F;p&gt;

&lt;p&gt;I also have counseled other people to switch to GitLab, and I&#x27;m generally most active in doing so among peers. I know a guy who runs a small software company and I&#x27;m helping him switch his team over to GitLab. It feels like I could be finding my niche.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;What is the makeup of your team at RamSoft, and what is your workflow like?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Warren:&lt;&#x2F;strong&gt; Our workflow and culture is evolving rapidly. My team is multi-cultural, multi-language, multi-everything, in multiple physical sites.  One part of our team is in Toronto, another part is in Vietnam. The decentralized nature of Git and GitLab is a major win for us. We have two merge request (MR) pipelines. We have all Toronto devs code-review via MR with someone in the same timezone because our MRs should be short-lived MRs, reviewed and merged quickly.  We don&#x27;t have MRs that stay open for days or weeks.  We don&#x27;t use WIP much yet, but I am starting to advocate for WIP merge requests for collaborative feature development. Since we&#x27;re in the same office, we can mostly work in pairs when our work requires it. GitLab provides a history of our work, and our reviews, and MRs are like a project history.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;How did you decide to get started with GitLab?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Warren:&lt;&#x2F;strong&gt; It was easy, I chose Ubuntu (I can&#x27;t remember if it was 12 or 14) LTS and it was around GitLab 8.0, September 2015 or so, and I simply copied the installation commands from the website and pasted it into terminal.  I needed a bit of help from my IT guy to set up LDAP to our ActiveDirectory, and we were good.
Our company is 99% composed of Windows-only technical people, I&#x27;m a Linux guy working in a Windows company.  I&#x27;d say that in many companies this is a significant barrier to getting up and running.  If I could suggest something, it would be to provide a Hyper-V and a VMWare image of a working private GitLab, which can be downloaded and run by anyone. I think that should be done in-house as opposed to via Bitnami. I have used Bitnami products, and I have nothing against them, but I see the opportunity for GitLab to provide technical support even to smaller corporations as a significant opportunity to GitLab, that it should be taking on.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Is there anything you feel you can do in GitLab that you can&#x27;t do with other tools?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Warren:&lt;&#x2F;strong&gt; GitLab is about integration of tools. I don&#x27;t want to set everything up separately. GitLab provides an all-in-one version control server, bug tracker (issues), kanban board (issues in progress, completed, in production), merge request handling (code reviews). All those tools exist in many flavors, but none so well integrated, and I can self-host.&lt;&#x2F;p&gt;

&lt;p&gt;Your closest competitor is Bitbucket, in my opinion, which can be run privately but the private Bitbucket is closed-source I believe, and you can&#x27;t get it for free, so GitLab CE is really without peer. Since I don&#x27;t work in very large companies, GitLab EE is something I haven&#x27;t spent much time on, but I can see that even a serious small company might want to buy GitLab EE because having support is a major feature. If I wasn&#x27;t working at my current company, the level of Linux knowledge in house would take a major dive, and they&#x27;d probably want to buy a support contract to fix their GitLab if it went down, or help diagnose major issues.&lt;&#x2F;p&gt;

&lt;p&gt;Privately Hosted (on my computer or VM) + Free + OpenSource = Made of Win. I can&#x27;t see choosing anything else. I see GitHub as problematic, something I &lt;a href=&quot;http:&#x2F;&#x2F;linuxcodemonkey.blogspot.ca&#x2F;2016&#x2F;11&#x2F;gitlab-all-things.html&quot;&gt;blogged about&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;What is the main reason you would recommend GitLab to another dev?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Warren:&lt;&#x2F;strong&gt; Once the choice is made to use Git, to me, GitLab is a slam dunk decision. Software companies, whether small, medium, or large, and even single developers who are professionals who get paid, should be hosting their own in-house GitLab, and perhaps having that back up to some off-site repo (say Bitbucket or GitLab.com). Single developers could be quite happy with Bitbucket also. I happen to still love Bitbucket, but happen to distrust GitHub. I only use GitHub when I have to use it, which is to make MRs to projects that are on GitHub.&lt;&#x2F;p&gt;

&lt;p&gt;People who I have talked to, and I have even given presentations to people at user groups, are usually interested in GitLab because:&lt;&#x2F;p&gt;

&lt;ol&gt;
  &lt;li&gt;It lets you host your own private Git server.&lt;&#x2F;li&gt;
  &lt;li&gt;It has a pretty impressive set of features, issue tracking, merge request handling, and continuous integration server built in.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;

&lt;p&gt;I am working on a community blog post on switching a small healthcare software company from Jenkins to GitLab CI. So far, I have found that the only difficulty is in training team members. Moving ingrained practices and working against ingrained tendencies is the hardest thing. We previously had a single-branch trunk-based monorepo culture, and switching to Git, to me, was only sensible if we changed our practices to work how Git is meant to be used.&lt;&#x2F;p&gt;

&lt;p&gt;A pet peeve of mine can be summed up in the saying &quot;When all you have is a hammer, everything looks like a nail.&quot; In the world of Subversion and Git, what I see over and over is people who take a 10 - 50 GiB Subversion monorepo and then just &quot;import all 50 GiB, and all 500,000 svn commit revs into Git&quot;. They are seldom impressed with the results of this, and it seldom occurs to them to question their initial preconception that this was the right and obvious way to move from SVN to Git. I am not sure if there exists a comprehensive re-education plan for Subversion users, but I think perhaps I should write one. There was a start towards this when Joel Spolsky tried something called &quot;&lt;a href=&quot;http:&#x2F;&#x2F;hginit.com&#x2F;&quot;&gt;hginit.com&lt;&#x2F;a&gt;&quot;, retraining Subversion victims in how to work with Mercurial. A similar practice for corporate teams moving from Subversion to Git would be a great educational resource that I think GitLab could provide. Some pretty good material in that vein is already on the internet and is provided by Atlassian, as part of their Bitbucket docs.&lt;&#x2F;p&gt;

&lt;p&gt;In terms of companies and products that I consider to be almost &quot;peers&quot; of GitLab, perhaps Bitbucket is closest. I prefer GitLab because the product is open source, the people are great, and the growing community around GitLab is also great. Oh and the product is growing at a fantastic pace. Just watching it from mid 2015 to today, the pace of innovation has been boggling. I have also collaborated with GitLab community members to create add-ons and tools. One guy made a Python-based tool that uses the GitLab API to &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;JonathonReinhart&#x2F;gitlab-artifact-cleanup&quot;&gt;expire and delete old artifacts&lt;&#x2F;a&gt; &lt;em&gt;site-wide&lt;&#x2F;em&gt;. Another guy made a Go-based tool that copies Issues and Issue labels from one project to another. All great plugins from the community!&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;If your team uses GitLab and is interested in sharing your story, please fill out this &lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;a&#x2F;gitlab.com&#x2F;forms&#x2F;d&#x2F;1K8ZTS1QvSSPos6mVh1ol8ZyagInYctX3fb9eglzeK70&#x2F;edit&quot;&gt;form&lt;&#x2F;a&gt;  and we’ll get in touch!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;Follow Warren on &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;warrenpostma&quot;&gt;Twitter&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;Tweet &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;gitlab&quot;&gt;@GitLab&lt;&#x2F;a&gt; and check out our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;jobs&#x2F;&quot;&gt;job openings&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>GitLab adoption growing at CERN</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/23/gitlab-adoption-growing-at-cern/"/>
    <id>https://about.gitlab.com/2016/11/23/gitlab-adoption-growing-at-cern/</id>
    <published>2016-11-23T00:00:00+00:00</published>
    <updated>2016-11-23T00:00:00+00:00</updated>
    <author>
      <name>Emily von Hoffmann</name>
    </author>
    <content type="html">
&lt;p&gt;CERN, the European Organization for Nuclear Research, is the world&#x27;s largest particle physics lab. They are well known for creating &lt;a href=&quot;http:&#x2F;&#x2F;home.cern&#x2F;topics&#x2F;birth-web&quot;&gt;the world’s first website&lt;&#x2F;a&gt;, hosted on Tim Berners-Lee’s computer.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;a href=&quot;http:&#x2F;&#x2F;about.gitlab.com&quot;&gt;GitLab&lt;&#x2F;a&gt; is one of the platforms CERN uses to host software projects and code for configuration management. CERN has about 2500 active developers using GitLab. While most GitLab users at CERN are located in France and Switzerland around Geneva, they also have a community of scientists working from their home institutes in their various member states.&lt;&#x2F;p&gt;



&lt;p&gt;Key projects include the software frameworks and libraries for the experiments conducted at CERN. Some of them are hosted on CERN&#x27;s GitLab instance.
Public projects in this category include for instance &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.cern.ch&#x2F;gaudi&#x2F;Gaudi&quot;&gt;Gaudi&lt;&#x2F;a&gt; an open project for providing the necessary interfaces and services for building HEP experiment frameworks.
They are also using GitLab more and more for &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;gitlab-ci&#x2F;&quot;&gt;Continuous Integration&lt;&#x2F;a&gt; tasks.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;why-did-cern-choose-gitlab&quot;&gt;Why Did CERN Choose GitLab?&lt;&#x2F;h3&gt;

&lt;p&gt;Alexandre Lossent, Service Manager for the version control systems at CERN, explained that part of their user community has a preference for open source software; GitLab was also cheaper than other alternatives.&lt;&#x2F;p&gt;

&lt;p&gt;The most significant benefit is probably how easy GitLab makes it to create a project and start working. Lossent said, “We had more than 2,000 projects in a few months, a very fast adoption rate compared to our other code hosting platforms.”&lt;&#x2F;p&gt;

&lt;p&gt;He has also found that the internal adoption of GitLab is spreading throughout CERN. He said, “While we are not yet actively asking users to move their projects to GitLab, many are attracted by GitLab&#x27;s features and move proactively.”&lt;&#x2F;p&gt;

&lt;p&gt;Not only are they an active team of users, they have also offered contributions. Lossent contributed the SAML code they wrote for their own usage, and earned an &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;mvp&#x2F;&quot;&gt;MVP recognition&lt;&#x2F;a&gt; in June 2015. Thanks to their effort, GitLab can be configured to act as a &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;integration&#x2F;saml.html&quot;&gt;SAML&lt;&#x2F;a&gt; 2.0 Service Provider, &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;2015&#x2F;06&#x2F;22&#x2F;gitlab-7-12-released&#x2F;&quot;&gt;since release 7.12&lt;&#x2F;a&gt;. For this reason, the advantage of an open source code base management tool is clear.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;Tweet &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;gitlab&quot;&gt;@GitLab&lt;&#x2F;a&gt; and check out our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;jobs&#x2F;&quot;&gt;job openings&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Image: &quot;&lt;a href=&quot;http:&#x2F;&#x2F;cds.cern.ch&#x2F;record&#x2F;1211045?ln=en&quot;&gt;Views of the LHC tunnel sector 3-4 - CERN-AC-0910152-02&lt;&#x2F;a&gt;&quot; by &lt;a href=&quot;http:&#x2F;&#x2F;home.cern&#x2F;&quot;&gt;CERN&lt;&#x2F;a&gt; is licensed under &lt;a href=&quot;https:&#x2F;&#x2F;creativecommons.org&#x2F;licenses&#x2F;by-sa&#x2F;4.0&#x2F;&quot;&gt;CC BY-SA 4.0&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;cern.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>How to Build a Strong Developer Community</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/23/how-to-build-a-strong-dev-community/"/>
    <id>https://about.gitlab.com/2016/11/23/how-to-build-a-strong-dev-community/</id>
    <published>2016-11-23T00:00:00+00:00</published>
    <updated>2016-11-23T00:00:00+00:00</updated>
    <author>
      <name>Emily von Hoffmann</name>
    </author>
    <content type="html">
&lt;p&gt;After meeting at Web Summit 2016, GitLab developer advocate &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;AmbassadorAwsum&quot;&gt;Amanda Folson&lt;&#x2F;a&gt; sat down with Jasmine Anteunis of &lt;a href=&quot;https:&#x2F;&#x2F;recast.ai&#x2F;&quot;&gt;Recast.ai&lt;&#x2F;a&gt; to chat about how GitLab approaches community-building, including a deep dive on developer advocacy.&lt;&#x2F;p&gt;



&lt;p&gt;Some key takeaways include:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;Public speaking is only one facet of &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;handbook&#x2F;marketing&#x2F;developer-relations&#x2F;developer-advocacy&#x2F;&quot;&gt;dev advocacy&lt;&#x2F;a&gt;; nurturing communities is the most important thing.&lt;&#x2F;li&gt;
  &lt;li&gt;It’s important that dev advocates aren’t just additional sales people. They should seek to be genuinely helpful for developers’ education and experience.&lt;&#x2F;li&gt;
  &lt;li&gt;For people who happily use a competitor’s product, dev advocates should have a ready value proposition for whomever they’re speaking with (e.g. developer or manager).&lt;&#x2F;li&gt;
  &lt;li&gt;It’s tough to put metrics to events, but you can develop “fuzzy metrics” like event attendees or traffic to certain site pages over time.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Jasmine: What exactly do developer advocates do?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Amanda:&lt;&#x2F;strong&gt; It really depends on your product. The universal thing is finding out where the developers actually are, which is harder than it sounds sometimes. They may be hanging out in specific communities – we found out we have a lot of people in the JavaScript community, we’re starting to see more people in the PHP community, and we get a lot of attention in the devops space as well. I generally call ours the ‘spray and pray’ approach since developer relations is relatively new here. I’ll submit talks to a bunch of events, we’ll sponsor a few things, just to kind of see where we fit in and the kind of feedback we get. Public speaking is the most discussed facet of dev advocacy, but it’s only one of many. I spend a lot of time responding to people on Twitter – people ask me things or hit me up for stickers and our tanuki t-shirts.&lt;&#x2F;p&gt;

&lt;p&gt;Once you find developers, you want to work on nurturing those communities in any way you can, so we also do a lot of developer education stuff. I’m working with people in the PHP community to help solve their problems, but not necessarily in a way that means GitLab is the answer. I just gave a talk about scheduling on-call rotations to help prevent burnout, which has nothing to do with GitLab directly, but it provides a window to talk about things that are affecting developers.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Jasmine: So how does developer relations interact with the sales process?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Amanda:&lt;&#x2F;strong&gt; I don’t ever want to approach developers like I’m selling something to them. The focus instead is to educate them and add value on something else, because it helps build a good relationship. Developers don’t really respond well to traditional marketing and sales. My job is really developer happiness. That means that I’m rarely selling them on GitLab itself, I’m finding something else that might meet their needs, so I need to have an understanding of that competitive analysis and be willing to speak frankly with them about it. The product marketing and content teams do a lot of things to take care of the buzz and lead generation. That works pretty well, because it’s not coming from a developer but developers still pay attention to it. And at events, if I’m talking to someone who starts asking pre-sales questions, I find a sales team member and bring them over.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Jasmine: How do you talk to people in the community who already use a competitor of yours, especially if they seem happy with that competitor?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Amanda:&lt;&#x2F;strong&gt; We have value propositions that we give to explain why it’s better to use GitLab; this really depends on exactly whom you’re speaking with. If we’re talking to a manager then we talk to them about pricing and how GitLab might help their team perform better. We have a whole series of tools with messaging framed around each specific use case.&lt;&#x2F;p&gt;

&lt;p&gt;For developers, we talk about how we can help solve their problems. So, for example, GitHub has this issue where you kind of piece together your own experience. If you want to do testing, you have to bring in a secondary service like Jenkins or Circle CI or something. Or if you want to do issue tracking, previously they didn’t have any sort of issue board, and people had to bring in something like Trello. Because you had to go to all these secondary services to make GitHub work for you, our value proposition there is, “You don’t have to do that with GitLab.” We have all that stuff included; you need private repositories, great, GitLab.com is fine for you even if you want to run your unit tests and things like that.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Jasmine: If I talk to my CEO and have to make a plan for the next month for how to attract developers and keep them happy, how do I measure which actions are really impactful? For instance, how do I prove that networking with a few people at an event is worth the time spent?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Amanda:&lt;&#x2F;strong&gt; That’s actually the million dollar question in developer relations, because it’s really hard to attach dollars to individual actions. You can do a lot with what we call “fuzzy metrics” because you’re not going to figure out the ROI of something like chatting with people at an event, but you can get a better sense of how you’re doing overall. For example, we look at the number of people who attend an event or your talk at a bigger event. That’s a fuzzy metric but it tells you something about your reputation in a community. For example, if you’re at a 3,000 person event, and only two people show up to your talk, then maybe you need to work on building up your reputation in that community. But, if 500 people at that 3,000 person event show up for your talk, then you’re doing pretty well. Similarly, if you spent $5,000 sending people and setting up a booth, but you land a $250,000 account, that was a great event for you.&lt;&#x2F;p&gt;

&lt;p&gt;I like to put links to content in various places in my slides, and you can see how many people actually visit and click through. So for example, we had 50 people attend this talk and 70 people clicked this link, that means people probably shared it. We look a lot on social media as well – if we see a lot of unhappy people then we work on that; if we see a lot of happy people then that’s great feedback too. We also look at traffic over time to different things, like the forums or even different parts of the website. You might create a landing page for developers or some developer education topic, and you want to see that trend upward over time of course.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Jasmine: We are a small team, and our developers are also our support team and developer relations team. How does it work when support, developers, and dev relations are separate teams?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Amanda:&lt;&#x2F;strong&gt;  There are a few ways this can work. Our support team now primarily takes care of our enterprise customers. They became too busy to respond to questions on social media, and our developer advocates also had a hard time managing questions from the broader community because we travel all the time for events. I have a personal policy of not having my head down in my laptop constantly at events, because I want to be free to talk to people while I’m there.&lt;&#x2F;p&gt;

&lt;p&gt;So we created a &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;handbook&#x2F;marketing&#x2F;developer-relations&#x2F;community-advocacy&#x2F;&quot;&gt;community advocacy team&lt;&#x2F;a&gt;. They do a lot of community management things like responding to people on the forum and on social media. The &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;handbook&#x2F;hiring&#x2F;#sts=Interviewing&quot;&gt;interview process&lt;&#x2F;a&gt; for that is very similar to the process for support; they need to have experience with Ruby, they need to be pretty technical, we like them to have some development experience. It has been a learning experience, but that’s how we tackled it. (Check out our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;jobs&#x2F;community-advocate&#x2F;&quot;&gt;openings&lt;&#x2F;a&gt; for community advocates!)&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Jasmine: If you had to choose, would you say it’s more important to devote resources to online engagement or to attending and sponsoring “real” events?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Amanda:&lt;&#x2F;strong&gt;  The best approach is to do both, because one way is enterprise focused and the other is more grassroots focused. Enterprise includes large companies that might be willing to give you a lot of money, so you definitely want to be paying attention to them. The grassroots-focused events might be language specific, like PHP conferences and meetup groups. The enterprise group tends to respond more to the blog, press releases, and traditional marketing and sales stuff. Grassroots community members, on the other hand, appreciate the much more technical content; we’ve done a lot of posts on “Here’s how you use GitLab CI utility to run your tests and deploy your code.” The technical audience really responds to stuff like that, they also really like when someone is paying attention to them on the forum and online. If you had to pick one, you can get to both of those groups online. Ideally you would do both though, because it helps people to put a face to the name.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Jasmine: How do you recognize users who are influencers in your community? How do you identify them and make sure to keep them happy?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Amanda:&lt;&#x2F;strong&gt;  We’re working on making this a bigger part of our strategy in 2017, but right now we recognize people who contribute a lot. Contributions come in various forms, but we have a &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;mvp&#x2F;&quot;&gt;Hall of Fame&lt;&#x2F;a&gt; where we list the MVP from each release, along with people who contribute the most per month, for example. We actually tend to hire a lot of people who end up on that list, I think all of the top 20 now work at GitLab. We also pay attention to people who help out on the forum a lot, and people who don’t work for us but respond to questions on Stack Overflow and Twitter. We like rewarding people who boost the signal a little bit, we try to say thanks or send them swag, or we invite them to our Summit meeting. There’s no threshold for number of contributions, because it also depends on the nature of the contribution.&lt;&#x2F;p&gt;

&lt;p&gt;Ultimately we’ll create a group of ambassadors who want to talk about GitLab, at local meetup groups for example. We’re trying to create a system for sending them materials to help them get started. We’d like them to become developer advocates of a sort, in a way putting myself out of a job. We’re not paying them, they’re just doing it because they’re really passionate about the technology, which adds a bit of authenticity because they really care about what we’re doing.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Jasmine: What’s one last big tip you might give me?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Amanda:&lt;&#x2F;strong&gt; Keep tabs on what’s going on in the broader tech community - I look at Hacker News a lot, and Reddit and Twitter as well. Definitely keep track of what people are talking about; this helps you strike up conversations at events and gives you a little bit of developer cred as well. If you’re a developer at all, then keep those skills sharp. Over the past three years I stopped really shipping code and I feel like it’s been detrimental. One of my goals for 2017 is to write more code so I can stay in the weeds in conversations. You’ll get lots of language-specific questions across the whole spectrum, so ideally you’ll be somewhat familiar with Ruby, JavaScript, golang, and PHP, and at least be willing to go look for the answers when you get questions. That’s where it helps to have a great network of people – I know people in the community who I can poke when I don’t know the answer to something and ask for help. So keep those skills up and look out for the next trend in technology; that way you can be ready to predict where developers are headed next.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;Recast.AI is a french artificial intelligence startup focusing on conversational interfaces. Built on a strong language processing technology, Recast.AI allows developers to easily create their own bots through a collaborative platform and API.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;Follow &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;recastai&quot;&gt;Recast.ai&lt;&#x2F;a&gt; on Twitter.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;Tweet &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;gitlab&quot;&gt;@GitLab&lt;&#x2F;a&gt; and check out our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;jobs&#x2F;&quot;&gt;job openings&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>GitLab 8.14 Released with Time Tracking Beta and Chat Commands</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/22/gitlab-8-14-released/"/>
    <id>https://about.gitlab.com/2016/11/22/gitlab-8-14-released/</id>
    <published>2016-11-22T00:00:00+00:00</published>
    <updated>2016-11-22T00:00:00+00:00</updated>
    <author>
      <name>Job van der Voort</name>
    </author>
    <content type="html">
&lt;p&gt;You&#x27;re doing code review of a new feature and wonder how it&#x27;ll actually
feel, look and work when it&#x27;s live. Yesterday, you had to sacrifice your
local development environment&#x27;s state, checkout the remote branch, run
migrations, and then spin up the entire development environment.
Today, you can just go to GitLab and click the link in
the merge request to play with a fully functional, live environment.&lt;&#x2F;p&gt;



&lt;p&gt;Maybe you have some feedback on what you saw and start talking with your
colleague on chat. Rather than having to communicate on who moves the result to
issues, you just create an issue directly from chat.
You can immediately add a time estimate to the issue
and anyone peeking at the cycle analytics will see the new issue come by and
over time, move to production, giving you feedback on where things might get
stuck.&lt;&#x2F;p&gt;

&lt;p&gt;You can do all of the above and much more with GitLab 8.14, today. Time
tracking, Review Apps, Chat commands, Cycle Analytics improvements and much
more.&lt;&#x2F;p&gt;

&lt;p&gt;This month&#x27;s Most Valuable Person (&lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;mvp&#x2F;&quot;&gt;MVP&lt;&#x2F;a&gt;) is Toon Claes. Toon contributed the button to delete all merged branches,
a great addition to GitLab.
Thanks Toon Claes!&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-webcast&quot;&gt;&lt;i class=&quot;fa fa-gitlab&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;  
Tune in on Nov. 30 for our 8.14 release webcast with a live demo of Review Apps and Time Tracking for EE! &lt;a href=&quot;https:&#x2F;&#x2F;page.gitlab.com&#x2F;20161124_ReviewAppsWebcast_LandingPage.html&quot;&gt;Register here&lt;&#x2F;a&gt;!
  &lt;i class=&quot;fa fa-gitlab&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;time-tracking-beta-ee&quot;&gt;Time Tracking Beta (EE)&lt;&#x2F;h2&gt;

&lt;p&gt;Whether you&#x27;re a contractor that needs to keep track of their time,
or you&#x27;re managing time spent on issues and projects,
time tracking has traditionally been a painful experience: You have various
systems to keep track or log your time and these never seem to fit in your
day-to-day workflow.&lt;&#x2F;p&gt;

&lt;p&gt;You can now track your time right where you&#x27;re working, with Time Tracking
in GitLab.&lt;&#x2F;p&gt;

&lt;p&gt;With Time Tracking, you&#x27;re able to set estimates for how much time is necessary
for a particular issue. All you have to do is use a new slash command,
which can be entered in the issue description or a comment:&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;&#x2F;estimate 6h
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can adjust this at any time with the same command. Once you&#x27;ve spent time
on an issue, you can log this simply with:&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;&#x2F;spend 3h
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You&#x27;ll see this reflected in the interface.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;time.gif&quot; alt=&quot;Time Tracking Beta in GitLab 8.14&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Time Tracking is made available as trial to all our Enterprise Edition
customers during the beta period,
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;1264&quot;&gt;after which it becomes available as a paid Product&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;We&#x27;re interested in hearing how we can improve time tracking to fit your
workflow. Let us know by &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;new&quot;&gt;creating an issue&lt;&#x2F;a&gt; or below in the comments.&lt;&#x2F;p&gt;

&lt;p&gt;Some things we&#x27;re thinking about: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;1271&quot;&gt;reporting&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;1228&quot;&gt;an API&lt;&#x2F;a&gt;,
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;1265&quot;&gt;Time Tracking in Issue Boards&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues?label_name%5B%5D=time+tracking&quot;&gt;others&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;workflow&#x2F;time_tracking.html&quot;&gt;Read the docs on how to use Time Tracking in GitLab&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

&lt;h2 id=&quot;chat-commands-experimental&quot;&gt;Chat Commands (experimental)&lt;&#x2F;h2&gt;

&lt;p&gt;It seems like communication has moved from the conference room to the online
chatroom in the last few years. In particular, collaboration and idea generation
seem to happen here, and that&#x27;s an important part of the
&lt;a href=&quot;&#x2F;2016&#x2F;09&#x2F;13&#x2F;gitlab-master-plan&#x2F;#the-master-plan&quot;&gt;idea-to-production vision&lt;&#x2F;a&gt;
that we aim to capture with GitLab. With Chat Commands you can now bridge the
gap between chat and GitLab&#x27;s repositories, issue tracker, and CI&#x2F;CD pipelines
quickly and easily.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;chat1.gif&quot; alt=&quot;Chat Commands in GitLab 8.14 with Mattermost&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;With this first iteration, you can quickly create or view an issue, for
instance, using this to make an issue with the title and description already filled in:&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;&#x2F;gitlab issue create Even Better Issue Boards
Let&#x27;s make Issue boards _even_ better!
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can also embrace ChatOps and trigger deploys to production (using the
proper identity and permissions of the user):&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;&#x2F;gitlab deploy staging to production
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This iteration supports Mattermost, which ships with GitLab Omnibus. Slack
support is &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;22182&quot;&gt;coming soon&lt;&#x2F;a&gt;.
The command set is limited, but we&#x27;re &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;24768&quot;&gt;looking to add
more&lt;&#x2F;a&gt; soon and would love
your feedback.&lt;&#x2F;p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;project_services&#x2F;mattermost_slash_commands.html&quot;&gt;Read the documentation on Mattermost Slash Commands&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

&lt;h2 id=&quot;review-apps&quot;&gt;Review Apps&lt;&#x2F;h2&gt;

&lt;p&gt;Review Apps are the future of reviewing work. Rather than just looking at code,
Review Apps will serve you with a fully functioning environment in which your
app is running, ready for any kind of testing, trying or poking.&lt;&#x2F;p&gt;

&lt;p&gt;We initially offered experimental support for Review Apps in GitLab 8.12, and
improved it in the 8.13, but today we&#x27;re shipping the last bit to call it
&quot;complete&quot;.&lt;&#x2F;p&gt;

&lt;p&gt;Now with Review Apps properly set up, an app will spin up automatically
for each branch and be destroyed automatically when the branch is removed from
GitLab. We&#x27;re &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;www-gitlab-com&#x2F;blob&#x2F;master&#x2F;.gitlab-ci.yml#L33-71&quot;&gt;using it with this blog&lt;&#x2F;a&gt;, and it&#x27;s awesome. This feature is so exciting, there&#x27;s a whole other blog
post about it.&lt;&#x2F;p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;&#x2F;2016&#x2F;11&#x2F;22&#x2F;introducing-review-apps&#x2F;&quot;&gt;Read the blog post introducing review apps&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;ci&#x2F;review_apps&#x2F;&quot;&gt;Read the documentation on Review Apps&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

&lt;h2 id=&quot;cycle-analytics-events&quot;&gt;Cycle Analytics Events&lt;&#x2F;h2&gt;

&lt;p&gt;With Cycle Analytics you get actionable feedback on how fast your ideas are moving to product and where they might be getting stuck. This can seem a little abstract, so to make it more obvious what is happening, we&#x27;ll now show you the latest events in each stage.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;cycle_events.png&quot; alt=&quot;Improved Cycle Analytics in GitLab 8.14&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;This should make it easier to get an overview of what is happening in each
stage, but also to quickly jump in and see if you can move things forward
faster.&lt;&#x2F;p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;user&#x2F;project&#x2F;cycle_analytics.html&quot;&gt;Read the documentation on Cycle Analytics&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

&lt;h2 id=&quot;prevent-merge-until-review-is-done&quot;&gt;Prevent merge until Review is done&lt;&#x2F;h2&gt;

&lt;p&gt;You shouldn&#x27;t merge code before all tests have passed and review is done.
The first was enforceable for a while in GitLab, but the second not yet.&lt;&#x2F;p&gt;

&lt;p&gt;With GitLab 8.14, you can now prevent merges until all discussions on a merge
request have been resolved. This makes it impossible to miss those last
comments on the bottom of the page (even if we didn&#x27;t have that handy widget on
top) and make sure only code that has been checked and verified makes it to
production.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;dis1.png&quot; alt=&quot;Prevent merge until review is done in GitLab 8.14&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Enable this option in the project settings.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;dis2.png&quot; alt=&quot;Prevent merge until review is done in GitLab 8.14&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Thanks to Rodolfo Arruda for contributing this awesome feature!&lt;&#x2F;p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;merge_requests&#x2F;merge_request_discussion_resolution.html&quot;&gt;Read the documentation on merge request discussions&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

&lt;h2 id=&quot;delete-all-merged-branches&quot;&gt;Delete all Merged Branches&lt;&#x2F;h2&gt;

&lt;p&gt;Toon Claes contributed an amazingly obvious, yet dubiously missing feature: a
single button to quickly delete all merged branches in GitLab.&lt;&#x2F;p&gt;

&lt;p&gt;We&#x27;ll make sure to confirm your choice and then quickly set off a process to do
as requested. Find the button under your project&#x27;s &lt;strong&gt;Repository ➔ Branches&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;delete_mr.png&quot; alt=&quot;Quickly delete all merged branches in GitLab 8.14&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Deleting all merged branches will not delete any of your
protected branches.&lt;&#x2F;p&gt;

&lt;p&gt;Thanks Toon Claes!&lt;&#x2F;p&gt;

&lt;h2 id=&quot;subscribe-to-group-labels&quot;&gt;Subscribe to Group Labels&lt;&#x2F;h2&gt;

&lt;p&gt;We&#x27;ve introduced the convenient Group Labels in GitLab 8.13.
You can now finally subscribe to them, so you get notified on things that
matter to you, across entire groups. For instance, get notified whenever
a new issue is made with the &lt;code&gt;customer&lt;&#x2F;code&gt; label, so you&#x27;ll get a good overview
of customer issues across all projects in a group.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;better-pipeline-emails&quot;&gt;Better Pipeline emails&lt;&#x2F;h2&gt;

&lt;p&gt;Now when a pipeline fails, we&#x27;ll email you what went wrong, so you know whether
to simply retry a build, or call for all-hands-on-deck, without having to dive
into the logs immediately.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;emails.png&quot; alt=&quot;Better pipeline notifications in GitLab 8.14&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;jira-integration-improvements&quot;&gt;JIRA integration improvements&lt;&#x2F;h2&gt;

&lt;p&gt;We know many of you use JIRA intensively. We&#x27;re working very hard on
improving GitLab&#x27;s integration with it. Below are some of the improvements
we&#x27;ve made this release. We&#x27;re interested in hearing what else.&lt;&#x2F;p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;project_services&#x2F;jira.html&quot;&gt;Read the revamped documentation on JIRA integration&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

&lt;h3 id=&quot;remote-issue-links-to-jira&quot;&gt;Remote issue links to JIRA&lt;&#x2F;h3&gt;

&lt;p&gt;To make it super easy how a JIRA ticket relates to commits in GitLab, now
whenever you mention a JIRA ticket in a commit or merge request,
we&#x27;ll add it to the remote issue links in the ticket. You can write
that it &lt;code&gt;Fixes&lt;&#x2F;code&gt; a JIRA ticket or just mention it and we&#x27;ll make sure
it appears correctly.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;jira.png&quot; alt=&quot;Remote Issue Links to JIRA with GitLab 8.14&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Related MR: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7413&quot;&gt;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7413&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;h3 id=&quot;a-more-silent-gitlab-in-jira&quot;&gt;A more silent GitLab in JIRA&lt;&#x2F;h3&gt;

&lt;p&gt;When you setup the JIRA service within GitLab, by default, every commit and
merge request in GitLab that referenced a JIRA issue created a comment in this
issue in JIRA. Some people like having the complete details of what&#x27;s going on,
others prefer this to be more silent.&lt;&#x2F;p&gt;

&lt;p&gt;With GitLab 8.14, you can now disable the creation of comments when referencing
a JIRA issue in a commit or in a merge request.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;improved-looks&quot;&gt;Improved Looks!&lt;&#x2F;h2&gt;

&lt;p&gt;GitLab also got prettier and easier to use with 8.14, some highlights below:&lt;&#x2F;p&gt;

&lt;p&gt;You can now &lt;em&gt;see&lt;&#x2F;em&gt; who you are mentioning:&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;mention.png&quot; alt=&quot;&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Pipelines and the meta information are looking even better than they did:&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;pipes.png&quot; alt=&quot;&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;We now show you environment information on the build page:&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;env_info.png&quot; alt=&quot;&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Pipelines will now show whether specific builds are skipped:&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;pipes2.png&quot; alt=&quot;&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;And we made it easier to see what is left in the current pipeline:&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;8_14&#x2F;pipes3.png&quot; alt=&quot;&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;improved-accessibility&quot;&gt;Improved Accessibility&lt;&#x2F;h2&gt;

&lt;p&gt;Our amazing UX and frontend teams have been working hard on improving
the accessibility of GitLab. We&#x27;ve made a few changes worth highlighting this month:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;We&#x27;ve added a &#x27;Skip to Content&#x27; button when tabbing, This allows you
to reach the content faster and skip navigation items.&lt;&#x2F;li&gt;
  &lt;li&gt;All dropdowns, buttons and anchors now have focus states&lt;&#x2F;li&gt;
  &lt;li&gt;We&#x27;ve increased the contrast between background and anchors&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;We&#x27;re always interested in hearing how we can improve GitLab&#x27;s accessibility
further.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;gitlab-mattermost-35&quot;&gt;GitLab Mattermost 3.5&lt;&#x2F;h2&gt;

&lt;p&gt;GitLab 8.14 includes &lt;a href=&quot;https:&#x2F;&#x2F;about.mattermost.com&#x2F;mattermost-3-5&#x2F;&quot;&gt;Mattermost 3.5&lt;&#x2F;a&gt;,
an &lt;a href=&quot;https:&#x2F;&#x2F;about.mattermost.com&quot;&gt;open source Slack-alternative&lt;&#x2F;a&gt; whose newest
release offers improved performance on mobile and web through reduced loading
times, mobile UI improvements and faster server-side processing, Minio as a
self-hosted S3-alternative to local file storage, Russian language translation,
favorite channels and much more.&lt;&#x2F;p&gt;

&lt;p&gt;This version also includes &lt;a href=&quot;http:&#x2F;&#x2F;about.mattermost.com&#x2F;security-updates&#x2F;&quot;&gt;security updates&lt;&#x2F;a&gt;
and upgrade from earlier versions is recommended.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;gitlab-runner-18&quot;&gt;GitLab Runner 1.8&lt;&#x2F;h2&gt;

&lt;p&gt;We are also releasing GitLab Runner 1.8 today. Most interesting changes:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;Add initial Prometheus metrics server to runner manager &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ci-multi-runner&#x2F;merge_requests&#x2F;358&quot;&gt;!358&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Add support for docker registries on non standard ports &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ci-multi-runner&#x2F;merge_requests&#x2F;376&quot;&gt;!376&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Use correct constant for kubernetes resource limits. &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ci-multi-runner&#x2F;merge_requests&#x2F;367&quot;&gt;!367&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Add PullPolicy config option for kubernetes &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ci-multi-runner&#x2F;merge_requests&#x2F;335&quot;&gt;!335&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Fix&#x2F;unplug stalled endpoints &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ci-multi-runner&#x2F;merge_requests&#x2F;390&quot;&gt;!390&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Fix {Bash,Cmd,Ps}Writer.IfCmd to escape its arguments &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ci-multi-runner&#x2F;merge_requests&#x2F;364&quot;&gt;!364&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;support-for-private-container-registries-in-gitlab-ci-builds&quot;&gt;Support for private container registries in GitLab CI builds&lt;&#x2F;h2&gt;

&lt;p&gt;In GitLab 8.14 and GitLab Runner 1.8 we&#x27;ve improved support for private docker images.&lt;&#x2F;p&gt;

&lt;p&gt;From now on you can use private&#x2F;protected images stored in GitLab&#x27;s Container
Registry automatically, without any changes. GitLab will send registry
credentials with build data, and Runner will use them to authorize docker pull
requests.&lt;&#x2F;p&gt;

&lt;p&gt;You can also use &lt;code&gt;DOCKER_AUTH_CONFIG&lt;&#x2F;code&gt; Secure Variable to add credentials
for other private registries. Thanks to this you can use any image from any registry - public or private - which is accessible from build&#x27;s host, to be a base of your build or a service used by it.&lt;&#x2F;p&gt;

&lt;p&gt;Runner 1.8 fixes also the mechanism that is generating aliases from service
name, when registry is available on non standard port.&lt;&#x2F;p&gt;

&lt;p&gt;You can read more about private container registries support in &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;runner&#x2F;configuration&#x2F;advanced-configuration.html#using-a-private-container-registry&quot;&gt;GitLab Runner&#x27;s configuration&lt;&#x2F;a&gt; documentation.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;performance-improvements&quot;&gt;Performance Improvements&lt;&#x2F;h2&gt;

&lt;ul&gt;
  &lt;li&gt;Commits that are pushed are now processed in a separate Sidekiq worker: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;6802&quot;&gt;!6802&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;The authorised projects for a user are now stored in a dedicated database table. This list is updated whenever you are granted access to a new project, project access has been removed, etc: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;6839&quot;&gt;!6839&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Defer saving of project services to reduce database queries: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;6958&quot;&gt;!6958&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Getting the merge requests that close an issue now uses a cache: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;6996&quot;&gt;!6996&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Queries to get events have been optimised by removing the default ORDER BY where possible: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7130&quot;&gt;!7130&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;GitLab can now limit the amount of Sidekiq workers per queue to a certain percentage: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7292&quot;&gt;!7292&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;An index has been added for &lt;code&gt;project_import_data.project_id&lt;&#x2F;code&gt; to improve finding project import data: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7316&quot;&gt;!7316&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Certain database associations are now eager loaded on the merge requests and issues index pages: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7564&quot;&gt;!7564&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Refreshing of caches upon a push has been improved. Previously GitLab would refresh all caches, starting with 8.14 it will only refresh the caches of data that has been changed: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7360&quot;&gt;!7360&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;omnibus-gitlab-package-changes&quot;&gt;Omnibus GitLab package changes&lt;&#x2F;h2&gt;

&lt;h3 id=&quot;redis-in-ha-configuration&quot;&gt;Redis in HA configuration&lt;&#x2F;h3&gt;

&lt;p&gt;In GitLab 8.11 &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;2016&#x2F;08&#x2F;22&#x2F;gitlab-8-11-released&#x2F;#redis-sentinel-support&quot;&gt;we&#x27;ve announced&lt;&#x2F;a&gt;
experimental Redis Sentinel support.
We&#x27;ve improved this further and also introduced ways of configuring Redis HA, all within the package.&lt;&#x2F;p&gt;

&lt;p&gt;With Omnibus GitLab 8.14 Enterprise Edition package, you can fully configure
Redis in Highly Available configuration which also includes configuring
Redis Sentinel. This is a step forward in the direction of having a
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;77&quot;&gt;fully HA ready Enterprise Edition package&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;When using the Community Edition package, Redis Sentinel needs to be
installed and configured manually separately.&lt;&#x2F;p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;administration&#x2F;high_availability&#x2F;redis.html&quot;&gt;Read more about Redis HA setup in our docs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

&lt;h3 id=&quot;omnibus-gitlab-packages-on-opensuse&quot;&gt;Omnibus GitLab packages on OpenSUSE&lt;&#x2F;h3&gt;

&lt;p&gt;With GitLab 8.14 we are introducing omnibus-gitlab packages for OpenSUSE 13.2 and 42.1.
The packages are served through zypper repositories from our package server.&lt;&#x2F;p&gt;

&lt;p&gt;Go to &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;downloads&#x2F;&quot;&gt;our download page&lt;&#x2F;a&gt; for installation
details.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;package-repositories-for-oracle-linux-and-scientific-linux&quot;&gt;Package repositories for Oracle Linux and Scientific Linux&lt;&#x2F;h3&gt;

&lt;p&gt;Omnibus GitLab packages for Oracle Linux and Scientific Linux have been supported
for a long time however, they required a manual change in the yum repo list.
Starting with GitLab 8.14, this is no longer necessary and you can use the directions
from &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;downloads&#x2F;&quot;&gt;our download page&lt;&#x2F;a&gt; without any alterations.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;further-omnibus-package-changes&quot;&gt;Further Omnibus Package changes&lt;&#x2F;h3&gt;

&lt;ul&gt;
  &lt;li&gt;Packaged NGINX is upgraded to 1.10.2&lt;&#x2F;li&gt;
  &lt;li&gt;Packaged Redis is upgraded to 3.2.5&lt;&#x2F;li&gt;
  &lt;li&gt;Multiple configuration options got introduced in the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;omnibus-gitlab&#x2F;compare&#x2F;8-13-stable...8-14-stable#diff-25&quot;&gt;gitlab.rb&lt;&#x2F;a&gt; file&lt;&#x2F;li&gt;
  &lt;li&gt;See omnibus-gitlab &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;omnibus-gitlab&#x2F;blob&#x2F;8-14-stable&#x2F;CHANGELOG.md&quot;&gt;Changelog&lt;&#x2F;a&gt; for more details&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;other-changes&quot;&gt;Other changes&lt;&#x2F;h2&gt;

&lt;p&gt;This release has more improvements, including security fixes. Please check out
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;blob&#x2F;master&#x2F;CHANGELOG.md&quot;&gt;the changelog&lt;&#x2F;a&gt; to see all the named changes.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;upgrade-barometer&quot;&gt;Upgrade barometer&lt;&#x2F;h2&gt;

&lt;p&gt;To upgrade to GitLab 8.14, about 15 to 30 minutes downtime is required depending
on the size of your instance. See below for details.&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;The column &lt;code&gt;application_settings.repository_storage&lt;&#x2F;code&gt; has been renamed, this requires downtime but takes very little time&lt;&#x2F;li&gt;
  &lt;li&gt;Some indexes with stricter constraints are being added and they require corresponding code changes to be deployed, this requires downtime&lt;&#x2F;li&gt;
  &lt;li&gt;The subscriptions data is being migrated in a way that can&#x27;t be done online, this process may take a few minutes&lt;&#x2F;li&gt;
  &lt;li&gt;Project records with invalid visibility level are fixed, this can take a few minutes and requires downtime&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h3 id=&quot;note&quot;&gt;Note&lt;&#x2F;h3&gt;

&lt;p&gt;We assume you are upgrading from the latest version. If not, then also consult the upgrade barometers of any intermediate versions you are skipping.
If you are upgrading from a GitLab version prior to 8.0 &lt;em&gt;and&lt;&#x2F;em&gt; you have CI enabled, you have to upgrade to GitLab 8.0 &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;2015&#x2F;09&#x2F;22&#x2F;gitlab-8-0-released&#x2F;&quot;&gt;first&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;Please be aware that by default the Omnibus packages will stop, run migrations,
and start again, no matter how “big” or “small” the upgrade is. This behavior
can be changed by adding a &lt;a href=&quot;http:&#x2F;&#x2F;doc.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;&lt;code&gt;&#x2F;etc&#x2F;gitlab&#x2F;skip-auto-migrations&lt;&#x2F;code&gt;
file&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;hr &#x2F;&gt;

&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;&#x2F;h2&gt;

&lt;p&gt;If you are setting up a new GitLab installation please see the
&lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;installation&#x2F;&quot;&gt;download GitLab page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;

&lt;p&gt;Check out our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;update&#x2F;&quot;&gt;update page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;enterprise-edition&quot;&gt;Enterprise Edition&lt;&#x2F;h2&gt;

&lt;p&gt;The mentioned EE only features and things like LDAP group support can be found in GitLab Enterprise Edition.
For a complete overview please have a look at the &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;features&#x2F;#enterprise&quot;&gt;feature list of GitLab EE&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;Access to GitLab Enterprise Edition is included with a
&lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;pricing&#x2F;&quot;&gt;subscription&lt;&#x2F;a&gt;.
No time to upgrade GitLab yourself?
A subscription also entitles you to our upgrade and installation services.&lt;&#x2F;p&gt;

&lt;hr &#x2F;&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;8_14&#x2F;pic.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>Data Startup Cognitive Logic Talks Migrating to GitLab</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/22/cognitive-logic-talks-migrating-to-gitlab/"/>
    <id>https://about.gitlab.com/2016/11/22/cognitive-logic-talks-migrating-to-gitlab/</id>
    <published>2016-11-22T00:00:00+00:00</published>
    <updated>2016-11-22T00:00:00+00:00</updated>
    <author>
      <name>Emily von Hoffmann</name>
    </author>
    <content type="html">
&lt;p&gt;Data analytics startup &lt;a href=&quot;http:&#x2F;&#x2F;www.cognitivelogic.com&#x2F;&quot;&gt;Cognitive Logic&lt;&#x2F;a&gt; helps companies store, share, and examine consumer information without compromising security. I sat down with engineer Johan Brandhorst to learn more about his team, their work, and how GitLab helps.&lt;&#x2F;p&gt;

&lt;p&gt;Three of our offerings in particular drove Cognitive Logic&#x27;s decision to switch to GitLab:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;Validated Merge Requests&lt;&#x2F;li&gt;
  &lt;li&gt;Easily Configurable CI&lt;&#x2F;li&gt;
  &lt;li&gt;Easy migration from GitHub&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;



&lt;p&gt;Johan also told me that his team&#x27;s biggest challenge with GitLab is that it can be difficult to orchestrate CI between repositories; he says they&#x27;re looking forward to being able to chain testing between repositories. A fix is in the works - in typical fashion, minutes after I posted his query on Slack our Head of Product, &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;MarkPundsack&quot;&gt;Mark Pundsack&lt;&#x2F;a&gt;, wrote back that we have &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;ci&#x2F;triggers&#x2F;&quot;&gt;existing functionality&lt;&#x2F;a&gt; that allows one pipeline to trigger another pipeline in a different project. There are also several &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;933&quot;&gt;issues&lt;&#x2F;a&gt; open to make this better.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Could you please explain for our readers what the dev team at Cognitive Logic does? What kinds of projects do you work on?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Johan:&lt;&#x2F;strong&gt; We’re working on connecting large datasets while maintaining customer privacy. Our platform is built on docker and golang microservices with a React&#x2F;node.js frontend. We use gRPC for communications between services and protobuffers for backwards compatible messages. We maintain a container for our build environment and compile static binaries which can be run in a minimal docker container. The whole system runs on a cloud service provider.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;You currently have 10 devs using GitLab — could you elaborate on the makeup of the team, and what your workflow is like?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Johan:&lt;&#x2F;strong&gt; We have a high focus on engineering; engineers have control over what they want to work on and what they consider the most important to work on at the time. As an engineer, it’s a very liberating and enjoyable experience. We maintain a startup culture with a pool table, a couple of consoles in the meeting room with a 4K TV, board games and company events every now and then. It’s a great place to work (we’re hiring!).&lt;&#x2F;p&gt;

&lt;p&gt;We try to raise issues when features or bugs arise, then triage in a branch, submit a merge request, have it approved by another engineer before being merged back into master. Validated merge requests means we’re not afraid of merging straight into master as we try to do as much testing and validation as possible at merge request time. In the future we are going to try to set up staging environments and merge request environments for complete system validation at merge request time.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Which features or capabilities of GitLab has your team used the most? Is there anything you feel you can do with GitLab that you can&#x27;t accomplish with other tools?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Johan:&lt;&#x2F;strong&gt; Definitely the validated merge request system. It has helped us ensure consistently passing tests and linting tools to maintain the quality of the codebase. The GitLab docker registry has also been very useful for storing the output of our builds and provide a central point from which to fetch those builds.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;What were the major problems you were trying to solve with your previous version control system, if you used one?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Johan:&lt;&#x2F;strong&gt; We were using Github for VCS before moving to GitLab earlier this year. I came from a company where we had rolled our own CI solution while running our own VCS server and I knew how much time it takes to run a system like that reliably, so when I started at Cognitive Logic I was conscious about trying to make good choices for VCS early on. This lead me to look at GitLab as I wanted something with easy CI and validated merge request capabilities to ensure maintained code quality. GitLab was perfect in this regard and we made the switch from Github.com to GitLab.com about 6 months ago. The major difference between GitLab and Github was the easily configurable CI.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;How have developers responded to migrating to GitLab? Have there been any unforeseen challenges or obstacles?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Johan:&lt;&#x2F;strong&gt; We started the migration process quite early so there wasn’t much work to be done. I used the “import from Github” tool to get our repositories up and running on GitLab, and it imported all our issues and merge requests without problems. For the developers it took a little getting used to, but being able to sign up with your Google or Github account helped. There hasn’t been any real problems with our transition to GitLab, I’d consider the features of GitLab to be a superset of those available on GitHub, so it was all positive. The currently biggest problem with GitLab to us is that it can be difficult to orchestrate CI between repositories. We would like to be able to chain testing between repositories so that a change in one repo can automatically trigger a merge request in another repo (complete with testing). I know this kind of solution is being worked on and we’re eager to see what the team can deliver.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;If your team uses GitLab and is interested in sharing your story, please fill out this &lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;a&#x2F;gitlab.com&#x2F;forms&#x2F;d&#x2F;1K8ZTS1QvSSPos6mVh1ol8ZyagInYctX3fb9eglzeK70&#x2F;edit&quot;&gt;form&lt;&#x2F;a&gt;  and we’ll get in touch!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;Read more about &lt;a href=&quot;http:&#x2F;&#x2F;www.cognitivelogic.com&#x2F;&quot;&gt;Cognitive Logic&lt;&#x2F;a&gt;, and follow them on &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;cognitivelogic&quot;&gt;Twitter&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;Tweet &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;gitlab&quot;&gt;@GitLab&lt;&#x2F;a&gt; and check out our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;jobs&#x2F;&quot;&gt;job openings&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;team_gitlab.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>Introducing Review Apps</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/22/introducing-review-apps/"/>
    <id>https://about.gitlab.com/2016/11/22/introducing-review-apps/</id>
    <published>2016-11-22T00:00:00+00:00</published>
    <updated>2016-11-22T00:00:00+00:00</updated>
    <author>
      <name>Mark Pundsack</name>
    </author>
    <content type="html">

&lt;p&gt;Let&#x27;s talk about deploys. When a developer starts out with a new idea for an application, they&#x27;ll typically start working locally, where running the app is as simple as typing &lt;code&gt;rails server&lt;&#x2F;code&gt; or &lt;code&gt;npm start&lt;&#x2F;code&gt;. But at some point, you need to deploy that app somewhere so that other people, hopefully paying customers, can use it. An easy place to start is to deploy to Heroku or maybe you&#x27;re using a massive Kubernetes cluster, but really, there are tons of options out there. This post is not about those options. It&#x27;s about deployment strategy.&lt;&#x2F;p&gt;



&lt;h2 id=&quot;baby-steps&quot;&gt;Baby steps&lt;&#x2F;h2&gt;

&lt;p&gt;When you start, you have no users so there&#x27;s very little risk in deploying directly to production. If you&#x27;re still pitching your ideas to VCs, for example, you want your changes pushed up right away, usually right before a big meeting, so you push directly whenever you&#x27;re ready. Nobody uses the app when you&#x27;re not showing it to them, so who cares about &quot;production downtime&quot; or pushing untested code with bugs; nobody is using it! So you&#x27;ll go ahead and create a production app named the same as your project:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;tanuki&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;But of course, you really hope things don&#x27;t stop there. You push some code, test it out, then get some real users, and eventually you realize you should have a separate app for testing that doesn&#x27;t affect your real users. So you create a &lt;code&gt;staging&lt;&#x2F;code&gt; version, configured as much like production as possible including a production database, memcache or Redis, New Relic, Papertrail, and everything else you have added to your production app, but maybe scaled down so it doesn&#x27;t cost as much. :) And if you&#x27;re using GitLab, you&#x27;ll probably embrace &lt;a href=&quot;&#x2F;2016&#x2F;08&#x2F;05&#x2F;continuous-integration-delivery-and-deployment-with-gitlab&#x2F;#continuous-delivery&quot;&gt;continuous delivery&lt;&#x2F;a&gt; and set it up to automatically deploy to &lt;code&gt;staging&lt;&#x2F;code&gt; any time &lt;code&gt;master&lt;&#x2F;code&gt; is updated (but still require a manual deploy to go all the way to production):&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;tanuki&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-staging&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;But what about testing out changes earlier on in development? Say you&#x27;ve got a merge request that you want your coworker to check out to see if you&#x27;re going in the right direction? Ever tried to review a merge request involving CSS just by looking at the code? Yeah, it&#x27;s not fun. You really need to see it running to know if it&#x27;s OK or not. So, you start out by asking your team members to pull down your topic branch (you did create a topic branch for your change, right?) and then run the code locally to see how it looks.&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;git pull origin
git checkout topic-branch
bundle install
rails server # or npm start or whatever
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;p&gt;That works for a while, especially while your entire company is full of developers, but what happens as you grow and you&#x27;ve got product managers, QA testers, and designers that may not have their development environment set up, or are just too busy to bother pulling down your branch just to see your code run. So you create a new &lt;code&gt;dev&lt;&#x2F;code&gt; app to show off your code on a running server:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;tanuki&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-dev&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-staging&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;Then your team grows and one day you&#x27;re running your topic branch on the dev server and someone else pushes a different branch to test their thing, not realizing you were already using the server. Now you realize you need a separate app for each developer on your team:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;tanuki&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-grzegorz&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-kamil&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-mark&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;…&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-staging&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;This lets developers show off their work to their manager or product manager without getting overwritten by another developer. But at some point, in any fast-moving company, a single developer might have multiple features under development and want to demo them at any time, without having to micromanage their single &lt;code&gt;dev&lt;&#x2F;code&gt; app. So, you start creating new apps dedicated to big features.&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;…&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-new-interface&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-refactor-signup&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;…&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;But apps should be easy to create and destroy, so why not create a new one for every branch?&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;tanuki&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-6-update-logo&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-7-refactor-backend&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;…&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-328-fix-typo&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-grzegorz&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-kamil&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-mark&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;tanuki-staging&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;As you can see, this gets complicated pretty quickly and boy, would that be a lot to manage manually.&lt;&#x2F;p&gt;

&lt;p&gt;Over the last few releases, and culminating in 8.14, GitLab has been working to make this easier.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;introducing-review-apps&quot;&gt;Introducing Review Apps&lt;&#x2F;h2&gt;

&lt;p&gt;Review Apps are ephemeral app environments that are created dynamically every time you push a new branch up to GitLab, and they&#x27;re automatically deleted when the branch is deleted. This sounds nice and all, but what good is it? Well, rather than having a single &lt;code&gt;dev&lt;&#x2F;code&gt; environment for a project, or even separate &lt;code&gt;dev&lt;&#x2F;code&gt; apps for each developer, you get a new app for every topic branch, automatically. This let&#x27;s you test and demo new features without having to ask in chat &quot;hey, can I deploy to &lt;code&gt;dev&lt;&#x2F;code&gt;?&quot; It&#x27;s even better for the people on the periphery. Product managers can check out exactly what a merge request is going to look like without having to download and run a topic branch. QA and other users can take a look without having a development environment installed on their laptop at all.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;review-app-environments.png&quot; alt=&quot;Environments&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Once you embrace review apps, you&#x27;ll find it hard to go back. You&#x27;ll get rid of all your &lt;code&gt;dev&lt;&#x2F;code&gt; apps. You might even move on to full &lt;a href=&quot;&#x2F;2016&#x2F;08&#x2F;05&#x2F;continuous-integration-delivery-and-deployment-with-gitlab&#x2F;#continuous-deployment&quot;&gt;continuous deployment&lt;&#x2F;a&gt; and get rid of your &lt;code&gt;staging&lt;&#x2F;code&gt; app. After all, the feature will have gone through full automated CI testing, and with high fidelity feature-level testing on a review app, &lt;code&gt;staging&lt;&#x2F;code&gt; becomes an unnecessary speed bump on your way to full-speed productivity. Once a merge request is approved and merged, have it automatically deployed to &lt;code&gt;production&lt;&#x2F;code&gt;!&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;deploy_review_apps.png&quot; alt=&quot;Deploy Flow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Review Apps aren&#x27;t just for large teams; they&#x27;re great even for solo developers. Review Apps mean you have an environment running that contains only the code changes of one merge request. This solves four problems:&lt;&#x2F;p&gt;

&lt;ol&gt;
  &lt;li&gt;Having each change go through multiple stages (development, staging and QA stages).&lt;&#x2F;li&gt;
  &lt;li&gt;Finding a problem in staging or QA and having to research what merge request caused it.&lt;&#x2F;li&gt;
  &lt;li&gt;Having to add screenshots and videos to your merge request.&lt;&#x2F;li&gt;
  &lt;li&gt;Looking at a merge request and not being able to test the UX and edge cases.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;

&lt;p&gt;To &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;ci&#x2F;review_apps&#x2F;&quot;&gt;get started with Review Apps&lt;&#x2F;a&gt;, you&#x27;ll need to figure how to create and deploy a new app using shell scripts, then put that into your &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt; in a special job.&lt;&#x2F;p&gt;

&lt;p&gt;You might use NGINX with subdirectories, like &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;www-gitlab-com&#x2F;blob&#x2F;master&#x2F;.gitlab-ci.yml#L33-70&quot;&gt;we do for about.gitlab.com&lt;&#x2F;a&gt;. Or use the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-examples&#x2F;review-apps-openshift&#x2F;blob&#x2F;master&#x2F;.gitlab-ci.yml&quot;&gt;Openshift client to create and build new apps&lt;&#x2F;a&gt;. Either way, you&#x27;re in full control, creating and deploying temporary review apps on your own private infrastructure. Need them behind a firewall on dedicated PCs? No problem. Want them deployed in the cloud using the latest Docker technology? No problem. If you can script it, we can run it with GitLab CI.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;a-simple-example&quot;&gt;A simple example&lt;&#x2F;h2&gt;

&lt;p&gt;The &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt; syntax is somewhat complex because we prefer being explicit over hiding magic. This example shows two jobs, one to start&#x2F;update a review app, and the other to stop it. The key is in the declaration of an &lt;code&gt;environment&lt;&#x2F;code&gt; that has both its &lt;code&gt;name&lt;&#x2F;code&gt; and &lt;code&gt;url&lt;&#x2F;code&gt; be dynamic, based on the Git branch name. You can name the environment anything you like, but if you follow the convention of starting it with &lt;code&gt;review&#x2F;&lt;&#x2F;code&gt;, the GitLab UI will group the apps in a &lt;code&gt;review&lt;&#x2F;code&gt; folder. The &lt;code&gt;start_review&lt;&#x2F;code&gt; job then points to the &lt;code&gt;stop_review&lt;&#x2F;code&gt; job using the &lt;code&gt;on_stop&lt;&#x2F;code&gt; keyword, which helps signal to GitLab to show the option to &quot;stop&quot; or delete the environment in several places in the GitLab interface. Setting the &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;ci&#x2F;yaml&#x2F;README.html#git-strategy&quot;&gt;&lt;code&gt;GIT_STRATEGY&lt;&#x2F;code&gt; to &lt;code&gt;none&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; is necessary on the &lt;code&gt;stop_review&lt;&#x2F;code&gt; job so that the &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;runner&quot;&gt;GitLab Runner&lt;&#x2F;a&gt; won&#x27;t try to checkout the code after the branch is deleted. And of course both jobs only run on branches other than &lt;code&gt;master&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;start_review&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;stage&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;review&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;rsync -av --delete public &#x2F;srv&#x2F;nginx&#x2F;pages&#x2F;$CI_BUILD_REF_NAME&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;environment&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;review&#x2F;$CI_BUILD_REF_NAME&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;url&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;http:&#x2F;&#x2F;$CI_BUILD_REF_NAME.$APPS_DOMAIN&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;on_stop&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;stop_review&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;only&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;branches&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;except&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;master&lt;&#x2F;span&gt;

&lt;span class=&quot;na&quot;&gt;stop_review&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;stage&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;review&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;variables&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;GIT_STRATEGY&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;none&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;rm -rf public &#x2F;srv&#x2F;nginx&#x2F;pages&#x2F;$CI_BUILD_REF_NAME&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;when&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;manual&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;environment&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;review&#x2F;$CI_BUILD_REF_NAME&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;action&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;stop&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;only&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;branches&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;except&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;master&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;

&lt;p&gt;Review Apps are about improving the fidelity and speed of review; bringing everyone (product managers, QA, designers, etc.) into the conversation earlier, with higher quality information, so you move faster from idea to production. After you embrace them, you&#x27;ll look back and wonder how you ever lived without them.&lt;&#x2F;p&gt;

&lt;p&gt;Dynamic environments were first introduced with experimental support in 8.12 and the ability to manually stop dynamic environments was introduced in 8.13. 8.14 adds automatic stopping of environments on branch deletion, as well as environment folders in the UI. With that, Review Apps are no longer considered experimental. Review apps are available now, for free, in GitLab CE, GitLab EE, and on GitLab.com.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;further-reading&quot;&gt;Further reading&lt;&#x2F;h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;ci&#x2F;review_apps&#x2F;&quot;&gt;Review Apps documentation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;ci&#x2F;environments.html&quot;&gt;Environments documentation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-examples&#x2F;review-apps-nginx&quot;&gt;Review Apps with NGINX example project&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-examples&#x2F;review-apps-openshift&quot;&gt;Review Apps with Openshift example project&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;hr &#x2F;&gt;

&lt;p class=&quot;alert alert-webcast&quot;&gt;&lt;i class=&quot;fa fa-gitlab&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;  
Don&#x27;t miss our upcoming Release Webcast: &lt;strong&gt;GitLab 8.14 with Review Apps and Time Tracking&lt;&#x2F;strong&gt; on November 30. We&#x27;ll live demo Review Apps and Time Tracking for EE. &lt;a href=&quot;https:&#x2F;&#x2F;page.gitlab.com&#x2F;20161124_ReviewAppsWebcast_LandingPage.html&quot;&gt;Register here&lt;&#x2F;a&gt;!
  &lt;i class=&quot;fa fa-gitlab&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;review_apps_cover.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>When Software Eats Software, Plus Our Recap from Web Summit 2016</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/17/web-summit-summary/"/>
    <id>https://about.gitlab.com/2016/11/17/web-summit-summary/</id>
    <published>2016-11-17T00:00:00+00:00</published>
    <updated>2016-11-17T00:00:00+00:00</updated>
    <author>
      <name>Emily von Hoffmann</name>
    </author>
    <content type="html">
&lt;p&gt;&lt;em&gt;Watch our CEO &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;sytses&quot;&gt;Sytse Sijbrandij&lt;&#x2F;a&gt; give a talk at Web Summit&#x27;s Centre Stage, and listen in on our team recap of the event.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;



&lt;h2 id=&quot;when-software-eats-software&quot;&gt;When Software Eats Software&lt;&#x2F;h2&gt;

&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https:&#x2F;&#x2F;www.facebook.com&#x2F;plugins&#x2F;video.php?href=https%3A%2F%2Fwww.facebook.com%2FWebSummitHQ%2Fvideos%2F1202553769810665%2F&amp;amp;show_text=0&amp;amp;width=560&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;&#x2F;iframe&gt;

&lt;p&gt;&lt;br &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;team-recap&quot;&gt;Team Recap&lt;&#x2F;h2&gt;

&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;HUsOHIgzzfY&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;p&gt;&lt;br &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;Thoughts? Comments? Tweet at us &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;gitlab?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor&quot;&gt;@GitLab&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;web-summit-recap.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>GitLab 8.13.6 released</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/17/gitlab-8-dot-13-dot-6-released/"/>
    <id>https://about.gitlab.com/2016/11/17/gitlab-8-dot-13-dot-6-released/</id>
    <published>2016-11-17T00:00:00+00:00</published>
    <updated>2016-11-17T00:00:00+00:00</updated>
    <author>
      <name>Rémy Coutable</name>
    </author>
    <content type="html">
&lt;p&gt;Today we are releasing version 8.13.6 for GitLab Community Edition (CE) and
Enterprise Edition (EE).&lt;&#x2F;p&gt;

&lt;p&gt;This version resolves a number of regressions and bugs in the &lt;a href=&quot;&#x2F;2016&#x2F;10&#x2F;22&#x2F;gitlab-8-13-released&quot;&gt;recent 8.13
release&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;Please read on for more details.&lt;&#x2F;p&gt;



&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Omniauth auto link LDAP user falls back to find by DN when user cannot be found by UID. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7002&quot;&gt;!7002&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix Milestone dropdown not stay selected for &lt;code&gt;Upcoming&lt;&#x2F;code&gt; and &lt;code&gt;No Milestone&lt;&#x2F;code&gt; option. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7117&quot;&gt;!7117&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix relative links in Markdown wiki when displayed in &quot;Project&quot; tab. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7218&quot;&gt;!7218&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix project &quot;Visibility Level&quot; selector not using default values. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7264&quot;&gt;!7264&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix no &quot;Register&quot; tab if LDAP auth is enabled. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7274&quot;&gt;!7274&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Clicking &quot;force remove source branch&quot; label now toggles the checkbox again. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7356&quot;&gt;!7356&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix cache for commit status in commits list to respect branches. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7372&quot;&gt;!7372&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix issue causing labels not to appear in sidebar on MR page. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7416&quot;&gt;!7416&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Limit labels returned for a specific project as an administrator. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7496&quot;&gt;!7496&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Allow commit note to be visible if repo is visible. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7504&quot;&gt;!7504&lt;&#x2F;a&gt;)&lt;&#x2F;p&gt;
  &lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EE:&lt;&#x2F;strong&gt; Disable retries for remote mirror update worker. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;848&quot;&gt;!848&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EE:&lt;&#x2F;strong&gt; Geo: Fix cache clearing on secondary Geo nodes. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;869&quot;&gt;!869&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EE:&lt;&#x2F;strong&gt; Geo: Fix a problem that prevented git cloning from secondary node. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;873&quot;&gt;!873&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;upgrade-barometer&quot;&gt;Upgrade barometer&lt;&#x2F;h2&gt;

&lt;p&gt;This version has no migrations and should not require any downtime.&lt;&#x2F;p&gt;

&lt;p&gt;Please be aware that by default the Omnibus packages will stop, run migrations,
and start again, no matter how “big” or “small” the upgrade is. This behavior
can be changed by adding a &lt;a href=&quot;http:&#x2F;&#x2F;doc.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;&lt;code&gt;&#x2F;etc&#x2F;gitlab&#x2F;skip-auto-migrations&lt;&#x2F;code&gt;
file&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;

&lt;p&gt;To update, check out our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;update&#x2F;&quot;&gt;update page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;enterprise-edition&quot;&gt;Enterprise Edition&lt;&#x2F;h2&gt;

&lt;p&gt;Interested in GitLab Enterprise Edition? Check out the &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;features&#x2F;#enterprise&quot;&gt;features exclusive to
EE&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;Access to GitLab Enterprise Edition is included with a &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;pricing&#x2F;&quot;&gt;subscription&lt;&#x2F;a&gt;.
No time to upgrade GitLab yourself? Subscribers receive upgrade and installation
services.&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>In 13 minutes from Kubernetes to a complete application development tool</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/14/idea-to-production/"/>
    <id>https://about.gitlab.com/2016/11/14/idea-to-production/</id>
    <published>2016-11-14T00:00:00+00:00</published>
    <updated>2016-11-14T00:00:00+00:00</updated>
    <author>
      <name>Job van der Voort</name>
    </author>
    <content type="html">

&lt;p&gt;&lt;strong&gt;We promised to implement our master plan before the end of the year&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;When we raised our B-round this September we revealed our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;2016&#x2F;09&#x2F;14&#x2F;gitlab-live-event-recap&#x2F;&quot;&gt;Master Plan&lt;&#x2F;a&gt;:
the ambition to help the world go faster from idea to production with GitLab.
We showed a &lt;a href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;ZRcWCWatdas&quot;&gt;faked demo montage&lt;&#x2F;a&gt; of how that
would work. We promised to release this before the end of the year. Today I
want to show you our progress to date.&lt;&#x2F;p&gt;



&lt;h2 id=&quot;the-13-minute-demo-of-what-would-normally-take-days&quot;&gt;The 13 minute demo of what would normally take days&lt;&#x2F;h2&gt;

&lt;p&gt;In the video below I will install GitLab and deploy a simple application from
idea to production in less than 13 minutes.
The demo video consists of the following steps:&lt;&#x2F;p&gt;

&lt;ol&gt;
  &lt;li&gt;Install GitLab, Mattermost and auto-scaling GitLab CI on Openshift &lt;em&gt;from scratch&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Set up a project to use GitLab CI and deploy to Kubernetes&lt;&#x2F;li&gt;
  &lt;li&gt;Create an issue from Mattermost chat&lt;&#x2F;li&gt;
  &lt;li&gt;Plan this issue using Issue Boards&lt;&#x2F;li&gt;
  &lt;li&gt;Use the built-in terminal in GitLab to access the container&lt;&#x2F;li&gt;
  &lt;li&gt;Commit changes to a new branch and create a merge request&lt;&#x2F;li&gt;
  &lt;li&gt;Review these changes before merging them into master&lt;&#x2F;li&gt;
  &lt;li&gt;See the proposed changes live in a Review App&lt;&#x2F;li&gt;
  &lt;li&gt;Merge the changes into master and see them deployed on staging&lt;&#x2F;li&gt;
  &lt;li&gt;Deploy staging to production from chat&lt;&#x2F;li&gt;
  &lt;li&gt;Review the cycle time with Cycle Analytics&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;

&lt;p&gt;Below is the unedited, continuous video over which I recorded audio:&lt;&#x2F;p&gt;

&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;a7OIQfOJO-0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;&#x2F;iframe&gt;

&lt;p&gt;&lt;br &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;More than half of the demo is spent on the first two steps of installing GitLab
and setting up the project. If you want to skip right to the idea to production
cycle &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=a7OIQfOJO-0&amp;amp;t=6m30s&quot;&gt;go to 6:30 in the video&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;advantages-of-an-integrated-setup&quot;&gt;Advantages of an integrated setup&lt;&#x2F;h2&gt;

&lt;p&gt;If you need to set up self-hosted tools to do autoscaling CI, chatops,
a container registry, and review apps on Kubernetes without GitLab you&#x27;re
likely spending days to install and connect the tools and script.
GitLab comes with everything to bring your ideas to production out of the box.
This means you:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;Can install and integrate everything in minutes&lt;&#x2F;li&gt;
  &lt;li&gt;No longer need to maintain separate apps and all their integrations&lt;&#x2F;li&gt;
  &lt;li&gt;Have less time spent managing authentications and authorizations,
for example between CI and the private container registry&lt;&#x2F;li&gt;
  &lt;li&gt;Have everything in one interface&lt;&#x2F;li&gt;
  &lt;li&gt;Have a complete overview from idea to production that allows you to improve your cycle time&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;replicating-the-demo&quot;&gt;Replicating the demo&lt;&#x2F;h2&gt;

&lt;p&gt;To replicate the demo you need a private Openshift origin environment. 
The &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;handbook&#x2F;sales&#x2F;idea-to-production-demo&#x2F;&quot;&gt;demo script&lt;&#x2F;a&gt;
is public (along with the version numbers of OpenShift and Kubernetes we&#x27;re using!) and the RedHat OpenShift template is linked from our
&lt;a href=&quot;&#x2F;installation&#x2F;&quot;&gt;installation page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;We believe container schedulers such as Kubernetes are the future of
application lifecycle management and are working on Mesosphere support.
We would love it if people would contribute support for other container
schedulers such as Docker Swarm and for other Kubernetes providers such as
Tectonic.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;move-to-the-left&quot;&gt;Move to the left&lt;&#x2F;h2&gt;

&lt;p&gt;If you visualize the flow from development to production as something from left
to right there is a trend to &#x27;move to the left&#x27;.
This means that what was standard practice later in the flow becomes the new
practice earlier. For example CI used to be run on the machine of the
developer, now most CI is run elsewhere.
We think that developer environments will start to resemble production
environments in that they run on the container scheduler.
GitLab will make sure that we allow easy access to them from
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;22864&quot;&gt;a terminal&lt;&#x2F;a&gt; and a
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;22876&quot;&gt;local editor&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;christmas-is-coming&quot;&gt;Christmas is coming&lt;&#x2F;h2&gt;

&lt;p&gt;Most functionality shown in the video such as review apps will be available with GitLab 8.14, due Nov. 22nd.&lt;&#x2F;p&gt;

&lt;p&gt;We have a lot we still want to build and improve, see our TODO&#x27;s in our &lt;a href=&quot;&#x2F;handbook&#x2F;sales&#x2F;idea-to-production-demo&#x2F;&quot;&gt;demo script&lt;&#x2F;a&gt; and the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;groups&#x2F;gitlab-org&#x2F;issues?scope=all&amp;amp;state=opened&amp;amp;utf8=%E2%9C%93&amp;amp;label_name%5B%5D=idea-to-production&quot;&gt;issues for them&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;We plan to ship everything including terminal access in GitLab 8.15, due just
before Christmas.
Let&#x27;s end the year with a bang.&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-webcast&quot;&gt;&lt;i class=&quot;fa fa-gitlab&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;  
Have more questions? Join me live on November 23 10am PST&#x2F;6pm GMT for open office hours. &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=njP8Wvp45o0&quot;&gt;Watch the live stream&lt;&#x2F;a&gt;!
  &lt;i class=&quot;fa fa-gitlab&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>How We Knew It Was Time to Leave the Cloud</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/10/why-choose-bare-metal/"/>
    <id>https://about.gitlab.com/2016/11/10/why-choose-bare-metal/</id>
    <published>2016-11-10T00:00:00+00:00</published>
    <updated>2016-11-10T00:00:00+00:00</updated>
    <author>
      <name>Pablo Carranza</name>
    </author>
    <content type="html">
&lt;p&gt;In my last &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;2016&#x2F;09&#x2F;26&#x2F;infrastructure-update&#x2F;&quot;&gt;infrastructure update&lt;&#x2F;a&gt;, I documented our challenges with
storage as GitLab scales. We built a CephFS cluster to tackle both the capacity
and performance issues of NFS and decided to replace PostgreSQL standard Vacuum
with the pg_repack extension. Now, we&#x27;re feeling the pain of running a high
performance distributed filesystem on the cloud.&lt;&#x2F;p&gt;

&lt;p&gt;Over the past month, we loaded a lot of projects, users, and CI artifacts onto
CephFS. We chose CephFS because it&#x27;s a reliable distributed file system that can
grow capacity to the petabyte, making it virtually infinite, and we needed
storage. By going with CephFS, we could push the solution into the infrastructure
instead of creating a complicated application. The problem with CephFS is that
in order to work, it needs to have a really performant underlaying infrastructure
because it needs to read and write a lot of things really fast.
If one of the hosts delays writing to the journal, then the rest of the fleet is
waiting for that operation alone, and the whole file system is blocked. When this happens,
all of the hosts halt, and you have a locked file system; no one can read or
write anything and that basically takes everything down.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;osd-journal-latency.png&quot; alt=&quot;osd-journal-latency&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;What we learned is that when you get into the consistency, accessibility, and
partition tolerance (CAP) of CephFS, it will just give away availability in
exchange for consistency. We also learned that when you put a lot of pressure on
the system, it will generate hot spots. For example, in specific places in the
cluster of machines hosting the GitLab CE repo, all the reads and
writes end up being on the same spot during high load times. This problem is
amplified because we hosted the system in the cloud where there is not a minimum
SLA for IO latency.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;performance-issues-on-the-cloud&quot;&gt;Performance Issues on the Cloud&lt;&#x2F;h2&gt;

&lt;p&gt;By choosing to use the cloud, we are by default sharing infrastructure with a
lot of other people. The cloud is timesharing, i.e. you share the
machine with others on the providers resources. As such, the provider has to
ensure that everyone gets a fair slice of the time share. To do this, providers
place performance limits and thresholds on the services they provide.&lt;&#x2F;p&gt;

&lt;p&gt;On our server, GitLab can only perform 20,000 IOPS but the low limit is 0.
With this performance capacity, we became the &quot;noisy neighbors&quot; on the shared
machines, using all of the resources. We became the neighbor who plays their
music loud and really late. So, we were punished with latencies. Providers don&#x27;t
provide a minimum IOPS, so they can just drop you. If we wanted to make the disk
reach something, we would have to wait 100 ms latency.
&lt;a href=&quot;https:&#x2F;&#x2F;blog.codinghorror.com&#x2F;the-infinite-space-between-words&#x2F;&quot;&gt;That&#x27;s basically telling us to wait 8 years&lt;&#x2F;a&gt;. What we found
is that the cloud was not meant to provide the level of IOPS performance we needed
to run an agressive system like CephFS.&lt;&#x2F;p&gt;

&lt;p&gt;At a small scale, the cloud is cheaper and sufficient for many projects.
However, if you need to scale, it&#x27;s not so easy. It&#x27;s often sold as, &quot;If you
need to scale and add more machines, you can spawn them because the cloud is
&#x27;infinite&#x27;&quot;. What we discovered is that yes, you can keep spawning more
machines but there is a threshold in time, particulary when you&#x27;re adding heavy
IOPS, where it becomes less effective and very expensive. You&#x27;ll still have to
pay for bigger machines. The nature of the cloud is time sharing so you still
will not get the best performance. When it comes down to it, you&#x27;re paying a lot
of money to get a subpar level of service while still needing more performance.&lt;&#x2F;p&gt;

&lt;p&gt;So, what happens when the cloud is just not enough?&lt;&#x2F;p&gt;

&lt;h2 id=&quot;moving-to-bare-metal&quot;&gt;Moving to Bare Metal&lt;&#x2F;h2&gt;

&lt;p&gt;At this point, moving to dedicated hardware makes sense for us. From a cost
perspective, it is more economical and reliable because of how the culture of
the cloud works and the level of performance we need. Of course hardware comes
with it&#x27;s upfront costs: components will fail and need to be replaced. This
requires services and support that we currently don&#x27;t have today. You have to
know the hardware you are getting into and put a lot more effort into keeping it
alive. But in the long run, it will make GitLab more efficient, consistent,
and reliable as we will have more ownership of the entire infrastructure.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;how-we-proactively-uncover-issues&quot;&gt;How We Proactively Uncover Issues&lt;&#x2F;h2&gt;

&lt;p&gt;At GitLab, we are able to proactively uncover issues like this because we are
building an observable system as a way to understand how
our system behaves. The machine is doing a lot of things, most of which we are
not even aware of. To get a deeper look at what&#x27;s happening, we gather data and
metrics into Prometheus to build dashboards and observe trends.&lt;&#x2F;p&gt;

&lt;p&gt;These metrics are in the depth of the kernel and not readily visible to humans.
To see it, you need to build a system that allows you to pull, aggregate, and
graph this data in a way you can see it. Graphs are great because you can get a
lot of data in one screen and read it with a simple glance.&lt;&#x2F;p&gt;

&lt;p&gt;For example, our fleet overview dashboard shows how many different workers are
performing in one view:&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;workers-load.png&quot; alt=&quot;workers-load&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;workers-wait.png&quot; alt=&quot;workers-wait&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;h3 id=&quot;how-we-used-our-dashboard-to-understand-cephfs-in-the-cloud&quot;&gt;How we used our dashboard to understand CephFS in the cloud&lt;&#x2F;h3&gt;

&lt;p&gt;Below, you can see OSD Journal Latency. You can see how, over the last 7 days shown, we had a spike.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;osd-journal-latency-one-week.png&quot; alt=&quot;osd-journal-latency-one-week&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;This is how much time we spent trying to write to this journal disk. In general,
we roughly perform commit data to this journal within 2 to 12 seconds. You can
see where it jumps to 42 seconds to complete – that delay is where we are being
punished. The high spikes show GitLab.com is down.&lt;&#x2F;p&gt;

&lt;p&gt;What&#x27;s great about having this dashboard is that there is a lot of data available
quickly, in one place. Non-technical people can understand this. This is the
level of insight into your system you want to aim for. You can build on your own
with &lt;a href=&quot;https:&#x2F;&#x2F;prometheus.io&#x2F;&quot;&gt;Prometheus&lt;&#x2F;a&gt;. We have been building this for the last month, it&#x27;s close to the
end state. We&#x27;re still working on it but to add more things.&lt;&#x2F;p&gt;

&lt;p&gt;This is how we make informed decisions to understand as best as we can what is
going on with our infrastructure. What we tend to do is whenever we see
a service failing or performing in a way that is unexpected, we pull together a
dashboard to highlight the underlaying data to help us understand what&#x27;s happening,
and how things are being impacted on a larger scale. Usually monitoring is an afterthought
but we are changing this by shipping more and more detailed and comprehensive
monitoring with GitLab. Without detailed monitoring you are just guessing at
what is going on within your environment and systems.&lt;&#x2F;p&gt;

&lt;p&gt;The bottom line is that once you have moved beyond a handful of systems it is no
longer feasible to run one-off commands to try and understand what is happening
within your infrastructure. True insight can only be gained by having enough
data to make informed decisions with.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;recap-what-we-learned&quot;&gt;Recap: What We Learned&lt;&#x2F;h2&gt;

&lt;ol&gt;
  &lt;li&gt;CephFS gives us more scalability and ostensibly performance but did not work well in the cloud on shared resources, despite tweaking and tuning it to try to make it work.&lt;&#x2F;li&gt;
  &lt;li&gt;There is a threshold of performance on the cloud and if you need more, you will have to pay a lot more, be punished with latencies, or leave the cloud.&lt;&#x2F;li&gt;
  &lt;li&gt;Moving to dedicated hardware is more economical and reliable for the scale and performance of our application.&lt;&#x2F;li&gt;
  &lt;li&gt;Building an observable system by pulling and aggregating performance data into understandable dashboards helps us spot non-obvious trends and correlations, leading to addressing issues faster.&lt;&#x2F;li&gt;
  &lt;li&gt;Monitoring some things can be really application specific which is why we are &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;omnibus-gitlab&#x2F;issues&#x2F;1481&quot;&gt;building our own gitlab-monitor Prometheus exporter&lt;&#x2F;a&gt;. We plan to ship this with GitLab CE soon.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;

&lt;!-- identifiers --&gt;

&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;unsplash&#x2F;data.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>GitLab 8.13.5, 8.12.9, and 8.11.11 Released</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/09/gitlab-8-dot-13-dot-5-released/"/>
    <id>https://about.gitlab.com/2016/11/09/gitlab-8-dot-13-dot-5-released/</id>
    <published>2016-11-09T10:30:00+00:00</published>
    <updated>2016-11-09T10:30:00+00:00</updated>
    <author>
      <name>Brian Neel</name>
    </author>
    <content type="html">
&lt;p&gt;Today we are releasing versions 8.13.5, 8.12.9, and 8.11.11 for GitLab
Community Edition (CE) and Enterprise Edition (EE).&lt;&#x2F;p&gt;

&lt;p&gt;These versions contain several security fixes, including a fix for a
persistent cross-site scripting vulnerability and fixes for several
information disclosure vulnerabilities. In addition, version 8.13.5 resolves a
number of regressions and bugs. We recommend that all GitLab installations be
upgraded to one of these versions.&lt;&#x2F;p&gt;

&lt;p&gt;If you&#x27;re wondering what happened to 8.13.4, good eye! That version introduced
a CI issue that we had to fix in 8.13.5.&lt;&#x2F;p&gt;

&lt;p&gt;Please read on for more details.&lt;&#x2F;p&gt;



&lt;h2 id=&quot;8135-8129-and-81111-security-fixes&quot;&gt;8.13.5, 8.12.9, and 8.11.11 Security Fixes&lt;&#x2F;h2&gt;

&lt;h3 id=&quot;persistent-cross-site-scripting-vulnerability-in-autolink-feature&quot;&gt;Persistent Cross-site Scripting Vulnerability in Autolink Feature&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.facebook.com&#x2F;PSX0S404&quot;&gt;Mohamed Ebrahem&lt;&#x2F;a&gt; via &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;&quot;&gt;HackerOne&lt;&#x2F;a&gt; reported a Cross-site Scripting (XSS)
vulnerability in the autolinking feature of our description fields. Autolinking
is used to automatically turn words or phrases into their HTML equivalent links.
The autolinking code did not properly filter dangerous URL protocols and was
therefore vulnerable to persistent script injection. Please see &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;23153&quot;&gt;#23153&lt;&#x2F;a&gt; for more details.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;8135-security-fixes&quot;&gt;8.13.5 Security Fixes&lt;&#x2F;h2&gt;

&lt;p&gt;The following security issues were fixed ONLY in 8.13.5:&lt;&#x2F;p&gt;

&lt;h3 id=&quot;private-issue-disclosure-from-group-page-of-public-repositories&quot;&gt;Private Issue Disclosure from Group Page of Public Repositories&lt;&#x2F;h3&gt;

&lt;p&gt;Gustav Bylund reported an information disclosure vulnerability that allowed
confidential issues inside public repositories to be viewed by anyone viewing
the group page. Please see &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;22481&quot;&gt;#22481&lt;&#x2F;a&gt; for more details.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;private-merge-request-disclosure-in-related-merge-requests-feature&quot;&gt;Private Merge Request Disclosure in Related Merge Requests Feature&lt;&#x2F;h3&gt;

&lt;p&gt;Patrick Fiedler reported an issue where private merge requests in public
projects could be disclosed by creating related merge requests in the same
project. Please see &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;23548&quot;&gt;#23548&lt;&#x2F;a&gt; for more details.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;disabled-public-repositories-could-still-be-cloned&quot;&gt;Disabled Public Repositories Could Still Be Cloned&lt;&#x2F;h3&gt;

&lt;p&gt;An internal code review disclosed that when a public repository is disabled or
restricted to team members only it could still be cloned by the public. Please
see &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;23788&quot;&gt;#23788&lt;&#x2F;a&gt; for more details.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;team-only-merge-requests-and-issues-still-visible-in-public-activity-feed&quot;&gt;Team-Only Merge Requests and Issues Still Visible in Public Activity Feed&lt;&#x2F;h3&gt;

&lt;p&gt;An internal code review disclosed that when a public repository has merge
requests and issues disabled for non-team members these merge requests and
issues were still visible in the public activity feed. Please see &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;23403&quot;&gt;#23403&lt;&#x2F;a&gt; for
more details.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;regressions-fixed-in-8135&quot;&gt;Regressions fixed in 8.13.5&lt;&#x2F;h2&gt;

&lt;p&gt;The following regressions were fixed in 8.13.5:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix showing pipeline status for a given commit from correct branch. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7034&quot;&gt;!7034&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Only skip group when it&#x27;s actually a group in the &quot;Share with group&quot; select. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7262&quot;&gt;!7262&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Introduce round-robin project creation to spread load over multiple shards. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7266&quot;&gt;!7266&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Ensure merge request&#x27;s &quot;remove branch&quot; accessors return booleans. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7267&quot;&gt;!7267&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix lightweight tags not processed correctly by GitTagPushService. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;6532&quot;&gt;!6532&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Allow owners to fetch source code in CI builds. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;6943&quot;&gt;!6943&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Return conflict error in label API when title is taken by group label. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7014&quot;&gt;!7014&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Reduce the overhead to calculate number of open&#x2F;closed issues and merge requests within the group or project. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7123&quot;&gt;!7123&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix builds tab visibility. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7178&quot;&gt;!7178&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;CE&#x2F;EE:&lt;&#x2F;strong&gt; Fix project features default values. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7181&quot;&gt;!7181&lt;&#x2F;a&gt;)&lt;&#x2F;p&gt;
  &lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EE:&lt;&#x2F;strong&gt; Weight dropdown in issue filter form does not stay selected. (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlabee&#x2F;merge_requests&#x2F;826&quot;&gt;!826&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;upgrade-barometer&quot;&gt;Upgrade barometer&lt;&#x2F;h2&gt;

&lt;p&gt;These versions &lt;strong&gt;do&lt;&#x2F;strong&gt; include new migrations, and will require brief downtime.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;

&lt;p&gt;To update, check out our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;update&quot;&gt;update page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;enterprise-edition&quot;&gt;Enterprise Edition&lt;&#x2F;h2&gt;

&lt;p&gt;Interested in GitLab Enterprise Edition? Check out the &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;features&#x2F;#enterprise&quot;&gt;features exclusive to
EE&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;Access to GitLab Enterprise Edition is included with a
&lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;pricing&#x2F;&quot;&gt;subscription&lt;&#x2F;a&gt;. No time to upgrade GitLab
yourself? Subscribers receive upgrade and installation services.&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>Publish Code Coverage Report with GitLab Pages</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/03/publish-code-coverage-report-with-gitlab-pages/"/>
    <id>https://about.gitlab.com/2016/11/03/publish-code-coverage-report-with-gitlab-pages/</id>
    <published>2016-11-03T00:00:00+00:00</published>
    <updated>2016-11-03T00:00:00+00:00</updated>
    <author>
      <name>Grzegorz Bizon</name>
    </author>
    <content type="html">
&lt;p&gt;At GitLab, we believe that everyone can contribute. We also use automated
testing extensively to make contributing to GitLab easier. Using automated
testing is a great way to improve confidence when someone needs to change
the code, which actually is the case in the majority of contributions to
software projects.&lt;&#x2F;p&gt;

&lt;p&gt;But how do we ensure that our test suite covers enough to aid the confidence
in changing behavior of the software, and what can we do to keep on improving
it?&lt;&#x2F;p&gt;



&lt;h2 id=&quot;what-is-code-coverage&quot;&gt;What is code coverage?&lt;&#x2F;h2&gt;

&lt;p&gt;Using the &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Code_coverage&quot;&gt;code coverage&lt;&#x2F;a&gt; metric is a
technique that helps to improve the test suite and the software itself.&lt;&#x2F;p&gt;

&lt;p&gt;Tools used to measure the code coverage usually extend the test harness
environment and make it possible to map the application execution process
back to the source code while automated tests are being executed. With that
approach, you can not only learn how much of your code is covered by tests,
but it is also possible to find out what exact parts of the codebase are not
covered well enough.&lt;&#x2F;p&gt;

&lt;p&gt;Some tools also make it possible to generate code coverage reports in HTML
format that you can then view in your browser. It makes it much easier to
inspect the areas of code that are missing tests and are likely to need some
improvements as well.&lt;&#x2F;p&gt;

&lt;p&gt;You can take a look at the Ruby &lt;a href=&quot;http:&#x2F;&#x2F;gitlab-org.gitlab.io&#x2F;gitlab-ce&#x2F;coverage-ruby&#x2F;&quot;&gt;code coverage report for GitLab&lt;&#x2F;a&gt;
that is hosted on &lt;a href=&quot;https:&#x2F;&#x2F;pages.gitlab.io&quot;&gt;GitLab Pages&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;publish-code-coverage-report-with-gitlab-pages&#x2F;code-coverage-report-file-summary.png&quot; alt=&quot;Code coverage report summary&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;how-to-generate-a-code-coverage-report&quot;&gt;How to generate a code coverage report?&lt;&#x2F;h2&gt;

&lt;p&gt;There are a lot of code coverage tools available for many different languages,
and you will need to find appropriate tool for your particular needs. At GitLab, with
projects using Ruby, we often use &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;colszowka&#x2F;simplecov&quot;&gt;SimpleCov&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;You will need to check the documentation for your tool of choice to learn how to
generate the code coverage report. Once you are able to do this locally,
check out the rest of this tutorial to learn how to publish the report with
&lt;a href=&quot;https:&#x2F;&#x2F;pages.gitlab.io&quot;&gt;GitLab Pages&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;

&lt;p&gt;For the sake of this example, we will assume that you are using Ruby with RSpec
and SimpleCov.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;configure-your-tools&quot;&gt;Configure your tools&lt;&#x2F;h3&gt;

&lt;p&gt;Configuring SimpleCov can be as simple as extending your &lt;code&gt;spec_helper.rb&lt;&#x2F;code&gt; with:&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;&#x2F;span&gt; &lt;span class=&quot;s1&quot;&gt;&#x27;simplecov&#x27;&lt;&#x2F;span&gt;
&lt;span class=&quot;no&quot;&gt;SimpleCov&lt;&#x2F;span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;nf&quot;&gt;start&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;When you run the &lt;code&gt;rspec&lt;&#x2F;code&gt; command, you will notice the code coverage report being
generated when tests are completed. The RSpec example below comes from a very simple
code that contains a single test for the single class that is there:&lt;&#x2F;p&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-file-code-o&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;
&lt;code&gt;spec&#x2F;dog_spec.rb&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;describe&lt;&#x2F;span&gt; &lt;span class=&quot;no&quot;&gt;Dog&lt;&#x2F;span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;&#x2F;span&gt;
  &lt;span class=&quot;n&quot;&gt;it&lt;&#x2F;span&gt; &lt;span class=&quot;s1&quot;&gt;&#x27;barks&#x27;&lt;&#x2F;span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;&#x2F;span&gt;
    &lt;span class=&quot;n&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;n&quot;&gt;subject&lt;&#x2F;span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;nf&quot;&gt;bark&lt;&#x2F;span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;&#x2F;span&gt;&lt;span class=&quot;nf&quot;&gt;to&lt;&#x2F;span&gt; &lt;span class=&quot;n&quot;&gt;eq&lt;&#x2F;span&gt; &lt;span class=&quot;s1&quot;&gt;&#x27;Woof, woof!&#x27;&lt;&#x2F;span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;&#x2F;span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;i class=&quot;fa fa-file-code-o&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;
&lt;code&gt;dog.rb&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;&#x2F;span&gt; &lt;span class=&quot;nc&quot;&gt;Dog&lt;&#x2F;span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;&#x2F;span&gt; &lt;span class=&quot;nf&quot;&gt;bark&lt;&#x2F;span&gt;
    &lt;span class=&quot;s1&quot;&gt;&#x27;Woof, woof!&#x27;&lt;&#x2F;span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;&#x2F;span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And the RSpec test harness output is:&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;Dog
  barks

Finished in 0.00058 seconds (files took 0.08804 seconds to load)
1 example, 0 failures

Coverage report generated for RSpec to &#x2F;tmp&#x2F;coverage_example&#x2F;coverage. 6 &#x2F; 6 LOC (100.0%) covered.
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;At the end of the output, you can see that code coverage report was generated
to the &lt;code&gt;coverage&#x2F;&lt;&#x2F;code&gt; directory whose contents look like:&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;&#x2F;span&gt;ls coverage&#x2F;
assets&#x2F; index.html
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Yes! This is an HTML code coverage report that we can publish with GitLab Pages!&lt;&#x2F;p&gt;

&lt;h3 id=&quot;gitlab-ci-configuration&quot;&gt;GitLab CI configuration&lt;&#x2F;h3&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;i class=&quot;fa fa-info-circle&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;
Take a look at &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;ci&#x2F;yaml&#x2F;README.html&quot;&gt;our documentation&lt;&#x2F;a&gt;
to learn more about how to use &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;The GitLab CI configuration can be defined in &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt; file. Let&#x27;s go
through the configuration that is necessary to publish coverage report with
GitLab Pages.&lt;&#x2F;p&gt;

&lt;hr &#x2F;&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-arrow-circle-right&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;
&lt;strong&gt;1. Run the RSpec test suite first&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;The most simple approach is to execute all tests within a single job in the
CI pipeline:&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;image&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;ruby:2.3&lt;&#x2F;span&gt;

&lt;span class=&quot;na&quot;&gt;rspec&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;bundle install&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;rspec&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;i class=&quot;fa fa-arrow-circle-right&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;
&lt;strong&gt;2. Store the result as build artifacts&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;image&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;ruby:2.3&lt;&#x2F;span&gt;

&lt;span class=&quot;na&quot;&gt;rspec&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;bundle install&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;rspec&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;artifacts&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;paths&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;coverage&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Let&#x27;s see if artifacts were stored correctly using build artifacts browser
that is available from the build sidebar. It is there!&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;publish-code-coverage-report-with-gitlab-pages&#x2F;coverage-report-artifacts-browser.png&quot; alt=&quot;code coverage report artifacts&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-arrow-circle-right&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;
&lt;strong&gt;3. Finally, publish with GitLab Pages&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;i class=&quot;fa fa-info-circle&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;
Follow the documentation about how to &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;pages&#x2F;README.html&quot;&gt;use GitLab Pages&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;image&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;ruby:2.3&lt;&#x2F;span&gt;

&lt;span class=&quot;na&quot;&gt;rspec&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;stage&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;test&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;bundle install&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;rspec&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;artifacts&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;paths&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;coverage&#x2F;&lt;&#x2F;span&gt;

&lt;span class=&quot;na&quot;&gt;pages&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;stage&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;deploy&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;dependencies&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;rspec&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;mv coverage&#x2F; public&#x2F;&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;artifacts&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;paths&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;public&lt;&#x2F;span&gt;
    &lt;span class=&quot;na&quot;&gt;expire_in&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;30 days&lt;&#x2F;span&gt;
  &lt;span class=&quot;na&quot;&gt;only&lt;&#x2F;span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;&#x2F;span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;s&quot;&gt;master&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A job that is meant to publish your code coverage report with GitLab Pages has
to be placed in the separate stage. Stages &lt;code&gt;test&lt;&#x2F;code&gt;, &lt;code&gt;build&lt;&#x2F;code&gt; and &lt;code&gt;deploy&lt;&#x2F;code&gt; are
specified by default, but you can change that if needed. Note that you also
need to use &lt;code&gt;pages&lt;&#x2F;code&gt; as a job name.&lt;&#x2F;p&gt;

&lt;p&gt;Using the &lt;code&gt;dependencies&lt;&#x2F;code&gt; keyword, we tell GitLab to download the artifacts stored
as part of the &lt;code&gt;rspec&lt;&#x2F;code&gt; job. You also need to rename the directory from &lt;code&gt;coverage&#x2F;&lt;&#x2F;code&gt;
to &lt;code&gt;public&#x2F;&lt;&#x2F;code&gt; because this is the directory that GitLab Pages expects to find
static website in.&lt;&#x2F;p&gt;

&lt;p&gt;It makes sense to deploy a new coverage report page only when the CI pipeline
runs on &lt;code&gt;master&lt;&#x2F;code&gt; branch, so we added the &lt;code&gt;only&lt;&#x2F;code&gt; keyword at the end of the
configuration file. This will also expire artifacts after 30 days, what does
not affect coverage report that has already been published.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;parallel-tests&quot;&gt;Parallel tests&lt;&#x2F;h3&gt;

&lt;p&gt;Things get a little more complicated when you want to parallelize your test
suite.&lt;&#x2F;p&gt;

&lt;p&gt;GitLab is capable of running tests jobs in parallel and you can use this technique
to decrease wall-clock elapsed time that is needed to execute all tests &#x2F;
builds in the CI pipeline significantly.&lt;&#x2F;p&gt;

&lt;p&gt;Numerous approaches are available, the most simple being to split test manually,
whereas the more sophisticated is to use tools or plugins that do distribute
the tests jobs evenly in the automated fashion.&lt;&#x2F;p&gt;

&lt;p&gt;Should you decide to parallelize your test suite, you will need to generate a partial
code coverage report in each parallel job and store it as a build artifact.
Then, you will need another stage in the pipeline with a job that merges the partial
code coverage metrics into the previous one and generates a single report that takes all
results (generated during parallel jobs) into account.&lt;&#x2F;p&gt;

&lt;p&gt;At GitLab, we parallelize our test suite heavily, and we do use additional
tools to distribute the test jobs evenly. SimpleCov does not support merging
result sets out-of-the-box, so we had to &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;blob&#x2F;master&#x2F;scripts&#x2F;merge-simplecov&quot;&gt;write a patch for it&lt;&#x2F;a&gt;.
There is an issue about &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;23717&quot;&gt;contributing this change back to the SimpleCov&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;deploy-coverage-report-as-gitlab-pages&quot;&gt;Deploy coverage report as GitLab Pages&lt;&#x2F;h3&gt;

&lt;p&gt;When you push your changes in &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt; to GitLab for the first
time, you will see new jobs in the CI pipeline.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;publish-code-coverage-report-with-gitlab-pages&#x2F;coverage-report-pages-deploy-job.png&quot; alt=&quot;coverage-report-deploy-job&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;If the &lt;code&gt;pages:deploy&lt;&#x2F;code&gt; job has been successful, the status icon for it is green.
This means that you can access you coverage report page using a URL like
&lt;code&gt;http:&#x2F;&#x2F;group-path.gitlab.io&#x2F;project-path&lt;&#x2F;code&gt;, for example
&lt;code&gt;https:&#x2F;&#x2F;gitlab-org.gitlab.io&#x2F;gitlab-ce&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;That way, a new coverage report will be published each time you push new code
to GitLab!&lt;&#x2F;p&gt;

&lt;h2 id=&quot;using-the-code-coverage-report-badge&quot;&gt;Using the code coverage report badge&lt;&#x2F;h2&gt;

&lt;p&gt;Once you have the code coverage report published with GitLab Pages, you may want to
put a link to it somewhere. We recommend using the code coverage badge that you
can add to your &lt;code&gt;README.md&lt;&#x2F;code&gt; file for that purpose.&lt;&#x2F;p&gt;

&lt;p&gt;This is how it looks in &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;blob&#x2F;master&#x2F;README.md&quot;&gt;our README.md&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;publish-code-coverage-report-with-gitlab-pages&#x2F;code-coverage-badge-gitlab.png&quot; alt=&quot;coverage-badge-gitlab&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;When someone clicks coverage badge, the code coverage report page will be opened.
The Markdown source is as follows:&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;nv&quot;&gt;![Coverage report&lt;&#x2F;span&gt;&lt;span class=&quot;p&quot;&gt;](&lt;&#x2F;span&gt;&lt;span class=&quot;sx&quot;&gt;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;badges&#x2F;master&#x2F;coverage.svg?job=coverage&lt;&#x2F;span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;&#x2F;span&gt;](http:&#x2F;&#x2F;gitlab-org.gitlab.io&#x2F;gitlab-ce&#x2F;coverage-ruby)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p class=&quot;alert alert-info&quot;&gt;&lt;i class=&quot;fa fa-info-circle&quot; style=&quot;color:rgb(107,79,187); font-size:.85em&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;i&gt;
You can find more info about report badges in &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;user&#x2F;project&#x2F;pipelines&#x2F;settings.html#badges&quot;&gt;our documentation&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;&#x2F;h2&gt;

&lt;p&gt;Although the code coverage technique is great for revealing untested code and
improving overall coverage, it is not a great metric to tell how good
the tests are, but it helps people to contribute.&lt;&#x2F;p&gt;

&lt;p&gt;With GitLab, you can create simple software that it is easy to contribute to!&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;publish-code-coverage-report-with-gitlab-pages&#x2F;code-coverage-report-stats.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>Track your time in the same tool you do your work</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/03/track-your-time-in-the-same-tool-you-do-your-work/"/>
    <id>https://about.gitlab.com/2016/11/03/track-your-time-in-the-same-tool-you-do-your-work/</id>
    <published>2016-11-03T00:00:00+00:00</published>
    <updated>2016-11-03T00:00:00+00:00</updated>
    <author>
      <name>Regis Freyd</name>
    </author>
    <content type="html">
&lt;p&gt;In 8.14 we are adding Time Tracking to GitLab Enterprise Edition as a Product to allow teams to stack their project estimates against their time spent. At GitLab, our goal is to build everything software development teams need to collaborate efficiently into one product. With each new release we reduce the number of external tools you need, allowing you to complete the full software development lifecycle within GitLab. Lets take a look at how Time Tracking works.&lt;&#x2F;p&gt;



&lt;p&gt;Most teams use external tools to track time, but we wanted to give them a more natural and distraction free way to do this in the same tool they already use for the rest of the the software development lifecycle. Like the rest of GitLab, Time Tracking is simple, efficient and out of the way. All you need is two new Time Tracking &lt;strong&gt;slash commands&lt;&#x2F;strong&gt; accessible from the body of an issue and merge request and in a comment field:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;The &lt;code&gt;&#x2F;spend&lt;&#x2F;code&gt; command will let you record the time you spent working on a task e.g. &lt;code&gt;&#x2F;spend 10h 45m&lt;&#x2F;code&gt;. Multiple spend commands add to the total time spent, visible in the sidebar.&lt;&#x2F;li&gt;
  &lt;li&gt;The &lt;code&gt;&#x2F;estimate&lt;&#x2F;code&gt; command will let you enter a time estimate. Contrary to the &lt;code&gt;&#x2F;spend&lt;&#x2F;code&gt; command, the last &lt;code&gt;&#x2F;estimate&lt;&#x2F;code&gt; entry overrides any previous.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;The &lt;code&gt;&#x2F;spend&lt;&#x2F;code&gt; and &lt;code&gt;&#x2F;estimate&lt;&#x2F;code&gt; commands can also be used independently of each other e.g tracking time without a formal estimation stage. With these two simple commands, you and your team have everything you need to get started estimating and track your time, all from within GitLab. You can read more about the exact specification in the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;issues&#x2F;985&quot;&gt;corresponding issue&lt;&#x2F;a&gt;, or in the &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;features&#x2F;time-tracking&#x2F;&quot;&gt;landing page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;track-your-time-in-the-same-tool-you-do-your-work&#x2F;time_tracking.png&quot; alt=&quot;time tracking example&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Time tracking will be available with GitLab 8.14 as a Product for GitLab Enterprise Edition customers. Time tracking will be free while it is still in beta. It will also be offered as usual for free to anyone on GitLab.com. We can’t wait to see what you will do with it!&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
  <entry>
    <title>Working at GitLab - 30 days later</title>
    <link rel="alternate" href="https://about.gitlab.com/2016/11/03/working-at-gitlab-30-days-later/"/>
    <id>https://about.gitlab.com/2016/11/03/working-at-gitlab-30-days-later/</id>
    <published>2016-11-03T00:00:00+00:00</published>
    <updated>2016-11-03T00:00:00+00:00</updated>
    <author>
      <name>Clement Ho</name>
    </author>
    <content type="html">
&lt;p&gt;Much like &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;emvonhoffmann&quot;&gt;Emily von Hoffmann&lt;&#x2F;a&gt;, I too recently finished my first month at GitLab. I started contributing regularly to GitLab in July, so although I&#x27;ve only been employed for a month, I feel like I&#x27;ve been here for several months. Most of my takeaways after this first month is primarily based on the company culture since I already had prior exposure to the product.&lt;&#x2F;p&gt;



&lt;h2 id=&quot;the-wow-factor&quot;&gt;The Wow Factor&lt;&#x2F;h2&gt;

&lt;p&gt;One of the most impressive part of the GitLab culture is it&#x27;s efficiency. Although it is listed as a value, I did not expect it to be so pronuounced. Monthly releases for GitLab CE and EE is just the tip of the iceberg of how much this team can accomplish in a short amount of time. I was amazed at how everything was ready for me before my first day of work. My GitLab email, my slack account, my swag codes and many onboarding items were all setup a few days after I signed my offer letter. I even had my business cards before I started my first day and got to hand them out to my coworkers before I left my previous company!&lt;&#x2F;p&gt;

&lt;p&gt;The efficiency of the team paired with the fact that everyone is so talented at what they do, truly creates an incredibly productive environment. I cannot agree more with &lt;a href=&quot;&#x2F;handbook&#x2F;#general-guidelines&quot;&gt;general guideline #1&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Working at GitLab Inc. is cooperating with the most talented people you&#x27;ve ever worked with, being the most productive you&#x27;ll ever be, and creating software that is helping the most people you&#x27;ve ever reached.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

&lt;p&gt;In less than a week of me working at GitLab, I collaborated with other team members and shipped the first iteration of a new feature, the &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;jobs&#x2F;developer&#x2F;#compensation&quot;&gt;compensation calculator&lt;&#x2F;a&gt; (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;www-gitlab-com&#x2F;merge_requests&#x2F;3418&quot;&gt;!3418&lt;&#x2F;a&gt;). That&#x27;s the fastest progress I&#x27;ve ever encountered in all the companies and internships I&#x27;ve experienced.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;work-life-balance&quot;&gt;Work-Life Balance&lt;&#x2F;h2&gt;

&lt;p&gt;Unfortunately this wow factor also cultivates a dark side. In a startup culture that is so focused, moving so fast and rewards results (all of which are good), it can be easy for me to continue working through lunch or after work. I enjoy working at and on GitLab which makes this all the more difficult (also a good thing). From time to time, it gets very tempting for me to put in extra work during my spare time. Although I know that working continually is only appealing in the short run and unsustainable in the long run, I&#x27;ve had to take extra steps to be more disciplined in this area.&lt;&#x2F;p&gt;

&lt;p&gt;As of a few weeks ago, I&#x27;ve started to block off my lunch time on my calendar. I tend not to prioritize what I need to do until it is on my schedule, so this helps me discipline my time. This may not work for everyone, it definitely keeps me in check.&lt;&#x2F;p&gt;

&lt;p&gt;In light of all this, it is reliving that the team at GitLab is very supportive of a &lt;a href=&quot;&#x2F;handbook&#x2F;#working-remotely&quot;&gt;healthy work life balance&lt;&#x2F;a&gt; and will do all they can to make sure everyone is well taken care of. After all, why else would they ask you to take a &lt;a href=&quot;&#x2F;handbook&#x2F;#paid-time-off&quot;&gt;minimum of 2 weeks off&lt;&#x2F;a&gt; a year for vacation.&lt;&#x2F;p&gt;

&lt;p&gt;Overall, this first month working at GitLab has been a blast. Working on something that impacts many organizations and has a clear &lt;a href=&quot;&#x2F;strategy&quot;&gt;strategic vision&lt;&#x2F;a&gt; is an absolute thrill. If you think you have what it takes to be a GitLabber, check out our &lt;a href=&quot;&#x2F;jobs&quot;&gt;job openings&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;default-blog-image.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;    </content>
  </entry>
</feed>
