<?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>2018-02-20T00:00:00+00:00</updated>
<author>
<name>The GitLab Team</name>
</author>
<entry>
<title>3 things that are wrong with DevOps today</title>
<link href='https://about.gitlab.com/2018/02/20/whats-wrong-with-devops/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/20/whats-wrong-with-devops/</id>
<published>2018-02-20T00:00:00+00:00</published>
<updated>2018-02-20T00:00:00+00:00</updated>
<author>
<name>Joel Krooswyk</name>
</author>
<content type='html'>&lt;p&gt;I’m continually impressed by the benefits achieved by modern ways of working. Lean processes, &lt;a href=&quot;http:&#x2F;&#x2F;conversationaldevelopment.com&#x2F;&quot;&gt;Conversational Development&lt;&#x2F;a&gt;, and automation have helped us ship more value, faster. Those achievements have led customers to expect a lot more from their service providers. DevOps has been critical to those gains, but we’ve got more work to do – DevOps still has its problems.&lt;&#x2F;p&gt;



&lt;p&gt;I have the privilege of talking with GitLab users every day. We celebrate impressive technical achievements, work through complex problems with CI&#x2F;CD, or discuss new needs for their organization. The needs and problems seem to align themselves to one of three different areas:&lt;&#x2F;p&gt;

&lt;h2 id=&quot;1-the-wall-still-stands&quot;&gt;1. The wall still stands&lt;&#x2F;h2&gt;

&lt;p&gt;Dev and Ops are still at war in some environments. In just the past couple of weeks I’ve heard the lack of collaboration between these groups called “the wall,” a “chasm,” and a “joke” by people in both areas! We’re simply not communicating well enough yet. We’re disappointed that after this much investment, there’s still so much room for improvement. Development and Operations continue to use different tools and to follow different rules.&lt;&#x2F;p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It&#x27;s like we&#x27;re really doing DevSecBizPerfOps&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

&lt;p&gt;But it doesn&#x27;t end there. Now we&#x27;ve got more people in the mix analyzing concerns like security, performance, and business metrics. It&#x27;s like we&#x27;re really doing DevSecBizPerfOps or some such thing, and so our flow continues to be interrupted. Silos continue to exist, if not multiply. It also feels like Ops hasn’t gotten enough love, which is why GitLab is working toward better Operations views as part of our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;2017&#x2F;10&#x2F;04&#x2F;devops-strategy&#x2F;&quot;&gt;product vision&lt;&#x2F;a&gt; for 2018.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;2-administration-costs-are-still-too-high&quot;&gt;2. Administration costs are still too high&lt;&#x2F;h2&gt;

&lt;p&gt;As we continue to shift left with build, test, and security, admin costs continue to rise. Developers are often being empowered at the cost of their own productivity. Administration efforts can actually consume &lt;a href=&quot;https:&#x2F;&#x2F;www.infoworld.com&#x2F;article&#x2F;2613762&#x2F;application-development&#x2F;software-engineers-spend-lots-of-time-not-building-software.html&quot;&gt;half a developer’s time&lt;&#x2F;a&gt; each week! Unfortunately, this is a growing form of waste. A core DevOps goal is to reduce administration time, but the admin costs of DevOps tools can be some of the highest in the the software development lifecycle ecosystem due to extensive plug-in architectures, support of quickly evolving environments, and asynchronous vendor update woes. We continually increase complexity and add requirements to existing stacks without looking for more modern solutions. Despite all the loss of time, I still hear commonly that there&#x27;s no way to visualize the flow of the code from requirement to production, especially once code is committed to a repository.&lt;&#x2F;p&gt;

&lt;p&gt;The good news is that more of us are taking the time to re-examine our ecosystems because they&#x27;ve become bloated with a wide variety of tools from a wide variety of vendors for very specific purposes. I wouldn&#x27;t consider the current trend to be a tooling consolidation so much as a streamlining or simplification of toolsets. Questions I hear most often tend to focus on optimizing our efficiency and reliability while minimizing administration of laborious plug-in and trigger-driven architectures. We&#x27;re trending in the right direction.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;3-were-holding-onto-the-past&quot;&gt;3. We&#x27;re holding onto the past&lt;&#x2F;h2&gt;

&lt;p&gt;We’ve spent and continue to spend billions on software tools annually. Tooling can be extremely costly! Sometimes we’ve invested so much money in old tooling that we simply can’t let it go. Too often we hold onto tools and processes just because we spent a lot of time and money on them while newer, time-saving products are available for less than the cost of the renewal of the old beasts. And so we hold onto the past as we try to implement new technologies. It’s no surprise that shoving new technology into old tools can generate enormous friction and unique problems.&lt;&#x2F;p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It’s no surprise that shoving new technology into old tools can generate enormous friction and unique problems.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

&lt;p&gt;Perhaps we bought best-in-breed tools. Those products commonly require excessive coding efforts to integrate and maintain because &quot;best in breed&quot; typically means we bought from a number of vendors. Interconnectivity of those tools typically doesn’t come out of the box. And of course, once the API is mentioned as a solution, the admin and maintenance burden increases once again. We spend a lot of money on specific solutions but inevitably end up with holes in our end-to-end process, too often as it relates to security or performance.&lt;&#x2F;p&gt;

&lt;p&gt;But this way of looking at tooling is beginning to change! I&#x27;m hearing more frequently that dramatic price increases, as well as the outsourcing of product maintenance and support, are triggering enterprises to reconsider the past. When we&#x27;ve invested all that time and money into a product, but that product then gets sold to three different parent companies within a decade, our ROI calculations lose their luster. Outsourcings and vendor-level product sales are being viewed as indicators of a potentially declining market. Enterprises are using that as a trigger to seek out updated tools for the years ahead, reducing cost and enabling modern workflows.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;it-all-impacts-delivery-efficiency&quot;&gt;It all impacts delivery efficiency&lt;&#x2F;h2&gt;

&lt;p&gt;No matter whether we’re talking about disappointment in collaboration, shift-left waste, or tooling admin costs, it comes down to this: it all negatively impacts our ability to deliver securely with speed and efficiency. If we truly want to meet and exceed the expectations of our customers, we’ll need to continually hone and improve our DevOps processes and tools to reflect modern ways of working.&lt;&#x2F;p&gt;

&lt;p class=&quot;note&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;suaBxarUnyo?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Photo&lt;&#x2F;a&gt; by Caleb George on &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;search&#x2F;photos&#x2F;wall?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;what-is-wrong-with-devops.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>GitLab&#x27;s Functional Group Updates: February 1st - 16th</title>
<link href='https://about.gitlab.com/2018/02/16/functional-group-updates/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/16/functional-group-updates/</id>
<published>2018-02-16T00:00:00+00:00</published>
<updated>2018-02-16T00:00:00+00:00</updated>
<author>
<name>Chloe Whitestone</name>
</author>
<content type='html'>&lt;!-- beginning of the intro - leave it as is --&gt;

&lt;p&gt;Every day from Monday to Friday, right before our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;handbook&#x2F;#team-call&quot;&gt;GitLab Team call&lt;&#x2F;a&gt;, a different Functional Group gives an &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;handbook&#x2F;people-operations&#x2F;functional-group-updates&#x2F;&quot;&gt;update&lt;&#x2F;a&gt; to our team.&lt;&#x2F;p&gt;

&lt;p&gt;The format of these calls is simple and short where they can either give a presentation or quickly walk the team through their agenda.&lt;&#x2F;p&gt;



&lt;!-- end of the intro --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;support-team&quot;&gt;Support Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;a&#x2F;gitlab.com&#x2F;presentation&#x2F;d&#x2F;1fccSNBOFCUCatckO4zBevnApHNsk2OTO8QPSgeIGI_4&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;CCvmGUpqTtk&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;infrastructure-team&quot;&gt;Infrastructure Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;1aOas1wBOmgSqUV36bc6jJ1Vn40QZrzdzWK4IJPXNmlE&#x2F;edit#slide=id.g1f84ee8ce6_0_41&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;WAJn2h6M_fk&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;engineering-team&quot;&gt;Engineering Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;1zcKJzHOL3i-AywhHB132w4Jl9NT6-645tpqFIgaBNAM&#x2F;edit&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;BNwx-QslzjI&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;people-ops-team&quot;&gt;People Ops Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;1Z0RuvmNsjL3dJwMTXBAPziurPLTyYPrOuAx9_5OGbwA&#x2F;edit#slide=id.g156008d958_0_18&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;qbdvWzLY1Ww&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;prometheus-team&quot;&gt;Prometheus Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;1Ij2MvbCC9eoEm0jp3Cv192lLDD57XESDa_USAnhkJ6I&#x2F;edit#slide=id.g156008d958_0_18&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;W0dihB1Qh7w&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;edge-team&quot;&gt;Edge Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;1uCyGlUF_rDKvN1ZqENDrpuZFCxYjh1fLp3Fso1Y7S4A&#x2F;edit&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;8EhG1cceSCs&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;discussion-team&quot;&gt;Discussion Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;http:&#x2F;&#x2F;gitlab-org.gitlab.io&#x2F;functional-group-updates&#x2F;backend-discussion&#x2F;2018-02-15&#x2F;#1&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;JIz6VnJosnE&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;customer-success-team&quot;&gt;Customer Success Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;1lOIZmjF277uKYcb-k3l21tjMkeCnY4hYEOJliS40Rew&#x2F;edit#slide=id.g156008d958_0_18&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;NyQH_X3LsCk&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;p&gt;Questions? Leave a comment below or tweet &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;gitlab&quot;&gt;@GitLab&lt;&#x2F;a&gt;! Would you like to join us? 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;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;functional-group-update-blog-cover.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>GitLab Patch Release: 10.4.4</title>
<link href='https://about.gitlab.com/2018/02/16/gitlab-10-dot-4-dot-4-released/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/16/gitlab-10-dot-4-dot-4-released/</id>
<published>2018-02-16T00:00:00+00:00</published>
<updated>2018-02-16T00:00:00+00:00</updated>
<author>
<name>Robert Speicher</name>
</author>
<content type='html'>&lt;p&gt;Today we are releasing GitLab version 10.4.4.&lt;&#x2F;p&gt;

&lt;p&gt;This version resolves a number of regressions and bugs in &lt;a href=&quot;&#x2F;2018&#x2F;01&#x2F;22&#x2F;gitlab-10-4-released&#x2F;&quot;&gt;this month&#x27;s 10.4
release&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;



&lt;h2 id=&quot;bug-fixes-for-community-and-enterprise-editions&quot;&gt;Bug fixes for Community and Enterprise Editions&lt;&#x2F;h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16795&quot;&gt;Fix 500 error when loading a merge request with an invalid comment.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16854&quot;&gt;Cleanup new branch&#x2F;merge request form in issues.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16877&quot;&gt;Fix GitLab import leaving group_id on ProjectLabel.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16881&quot;&gt;Fix forking projects when no restricted visibility levels are defined application-wide.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;17019&quot;&gt;Resolve PrepareUntrackedUploads PostgreSQL syntax error.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;17054&quot;&gt;Fixed error 500 when removing an identity with synced attributes and visiting the profile page.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;Validate user namespace before saving so that errors persist on model.&lt;&#x2F;li&gt;
  &lt;li&gt;LDAP Person no longer throws exception on invalid entry.&lt;&#x2F;li&gt;
  &lt;li&gt;Fix JIRA not working when a trailing slash is included.&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16807&quot;&gt;Update Nokogiri to 1.8.2.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;bug-fixes-for-enterprise-editions&quot;&gt;Bug fixes for Enterprise Editions&lt;&#x2F;h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;EES&#x2F;EEP&#x2F;EEU:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4206&quot;&gt;Handle empty event timestamp and larger memory units.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EES&#x2F;EEP&#x2F;EEU:&lt;&#x2F;strong&gt; Allow project to be set up to push to and pull from same mirror.&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EEP&#x2F;EEU:&lt;&#x2F;strong&gt; Geo: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4144&quot;&gt;Fix log cursor failing to process a CI job artifact event&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EEP&#x2F;EEU:&lt;&#x2F;strong&gt; Geo: Reset force_redownload flag after successful sync.&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EEP&#x2F;EEU:&lt;&#x2F;strong&gt; Geo: Fix redownload repository recovery when there is no local repository.&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 includes one new migration, 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;docs.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;&lt;&#x2F;a&gt; file,
which is only used for &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;updates&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-editions&quot;&gt;Enterprise Editions&lt;&#x2F;h2&gt;

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

&lt;p&gt;Access to GitLab Enterprise Editions is granted by a &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;products&#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>If you do business in Europe, you need to know about GDPR</title>
<link href='https://about.gitlab.com/2018/02/16/european-general-data-protection-regulation-law/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/16/european-general-data-protection-regulation-law/</id>
<published>2018-02-16T00:00:00+00:00</published>
<updated>2018-02-16T00:00:00+00:00</updated>
<author>
<name>Aricka Flowers</name>
</author>
<content type='html'>&lt;p&gt;An explainer on the European Union’s General Data Protection Regulation, which is set to take effect in May 2018.&lt;&#x2F;p&gt;



&lt;p&gt;If your company does business involving the personal data of EU residents through the offering of services and goods or otherwise, there&#x27;s a good chance that your firm may need to be compliant with the European Union’s General Data Protection Regulation (GDPR).&lt;&#x2F;p&gt;

&lt;p&gt;The law will go into effect on May 25 and replaces the EU’s 1995 Data Protection Directive. It’s meant to give EU residents more control over their personal data, specifically in how it is collected, controlled, and processed. As a result, companies that control and&#x2F;or process the personal information of EU residents for their own company’s purposes, or on behalf of another business, will be required to adhere to GDPR standards.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;faqs&quot;&gt;FAQs&lt;&#x2F;h2&gt;

&lt;h3 id=&quot;what-counts-as-personal-data&quot;&gt;What counts as personal data?&lt;&#x2F;h3&gt;

&lt;p&gt;Personal data includes a vast range of information including social security numbers, gender, location, ethnicity, online identifiers, and genetic or biometric markers, such as fingerprints and facial recognition.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;what-are-data-controllers&quot;&gt;What are data controllers?&lt;&#x2F;h3&gt;

&lt;p&gt;Controllers are a company or organization that determines the purpose for and manner in which personal data is processed.&lt;&#x2F;p&gt;

&lt;p&gt;Controllers can also be processors.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;what-are-data-processors&quot;&gt;What are data processors?&lt;&#x2F;h3&gt;

&lt;p&gt;Data processors take the information controllers have accumulated and process the personal information.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;what-do-companies-need-to-do-to-be-compliant&quot;&gt;What do companies need to do to be compliant?&lt;&#x2F;h3&gt;

&lt;ul&gt;
  &lt;li&gt;Have a legal basis for data collection and processing&lt;&#x2F;li&gt;
  &lt;li&gt;Be transparent about how the data is collected and used&lt;&#x2F;li&gt;
  &lt;li&gt;Provide prompt notification of security breaches&lt;&#x2F;li&gt;
  &lt;li&gt;Put data protection safeguards in place early in the development process and as the default setting in their products and services&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;It is recommended that companies conduct data discovery activities like data mapping and a gap analysis in order to get a true handle on the amount and nature of the personal data they control and process. A recent report from Forrester warned against approaching GDPR readiness from a fragmented framework that relies heavily on IT for specific compliance requirements – like focusing on data breach notifications, stating that such tactics are “short-sighted, and most likely will need radical revision after the enforcement of GDPR rules start in May.”&lt;&#x2F;p&gt;

&lt;p&gt;Failure to comply with the GDPR requirements could result in serious penalties, with the worst case scenario being a fine of €20 million or 4 percent of the company’s previous year’s total global revenue, whichever is greater.&lt;&#x2F;p&gt;

&lt;p&gt;For a more detailed look at the law and how organizations can ensure they’re compliant, check out &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;gdpr&quot;&gt;GitLab’s GDPR page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p class=&quot;note&quot;&gt;Cover image licensed under &lt;a href=&quot;https:&#x2F;&#x2F;creativecommons.org&#x2F;publicdomain&#x2F;zero&#x2F;1.0&#x2F;deed.en&quot;&gt;CC0 1.0&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;gdpr-european-parliament.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>Join GitLab&#x27;s March Issue Bash</title>
<link href='https://about.gitlab.com/2018/02/15/gitlab-issue-bash-march-2018/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/15/gitlab-issue-bash-march-2018/</id>
<published>2018-02-15T00:00:00+00:00</published>
<updated>2018-02-15T00:00:00+00:00</updated>
<author>
<name>Mark Fletcher</name>
</author>
<content type='html'>&lt;p&gt;This March we&#x27;ll be holding another of our quarterly issue bashes to allow the community to get involved in helping to squash some issues in the GitLab Community Edition issue tracker. We have over 1,900
&lt;a href=&quot;http:&#x2F;&#x2F;contributors.gitlab.com&#x2F;&quot;&gt;GitLab contributors&lt;&#x2F;a&gt;,
and we are always looking for more people to join in and contribute to the project in any way that they can.&lt;&#x2F;p&gt;



&lt;p&gt;Of course, some lucky contributors will be rewarded with awesome swag! 🙌&lt;&#x2F;p&gt;

&lt;p&gt;We now have &lt;a href=&quot;&#x2F;community&#x2F;issue-bash&#x2F;&quot;&gt;the issue bash landing page&lt;&#x2F;a&gt; with all the information about how exactly the Issue Bash works. Please take a look there and provide any feedback to our &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;issue-bash&#x2F;feedback&quot;&gt;feedback project&lt;&#x2F;a&gt; or propose changes directly &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;www-gitlab-com&#x2F;blob&#x2F;master&#x2F;source&#x2F;community&#x2F;issue-bash&#x2F;index.html.haml&quot;&gt;here&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;

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

&lt;p&gt;We&#x27;ll kick it off at 00:01 UTC on Saturday, &lt;strong&gt;March 3rd&lt;&#x2F;strong&gt;
and will keep it up until 23:59 UTC on Sunday, &lt;strong&gt;March 4th&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;who-can-contribute&quot;&gt;Who can contribute?&lt;&#x2F;h2&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;
  
&lt;strong&gt;At GitLab, everyone can contribute!&lt;&#x2F;strong&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;p&gt;This is your chance to get involved! Most of the tasks don&#x27;t require
technical expertise, therefore, non-technical community
members are definitely welcome and prize worthy!&lt;&#x2F;p&gt;

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

&lt;p&gt;Please see &lt;a href=&quot;&#x2F;community&#x2F;issue-bash&#x2F;#bash-q-a&quot;&gt;the FAQ on the Issue Bash landing page&lt;&#x2F;a&gt; to learn more about how to get involved.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;prizes&quot;&gt;Prizes&lt;&#x2F;h2&gt;

&lt;p&gt;As prizes, we have some awesome swag available:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;14 T-shirts&lt;&#x2F;li&gt;
  &lt;li&gt;1 T-shirt and Hoodie for a lucky contributor&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;Users making any contributions to the project,
between the start and end times of the event, will be entered into the random draw
to win a prize. The contributions will be collated after the end of the event and
prize winners, drawn at random, will be contacted in the weeks that follow.&lt;&#x2F;p&gt;

&lt;p&gt;To see how we draw winners at random please take a look at the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;issue-bash&#x2F;prize-winner-calculator&quot;&gt;prize winner calculator project&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

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

&lt;p&gt;&lt;a href=&quot;&#x2F;team&#x2F;&quot;&gt;GitLab team&lt;&#x2F;a&gt; and &lt;a href=&quot;&#x2F;core-team&#x2F;&quot;&gt;GitLab core team&lt;&#x2F;a&gt; members will be on hand to answer questions and close issues. Please mention them if you need any help or need attention on an issue&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;markglenfletcher&quot;&gt;@markglenfletcher&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;tnir&quot;&gt;@tnir&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;gitlab-issue-bash-june-2017-cover.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 href='https://about.gitlab.com/2018/02/14/setting-up-gitlab-ci-for-android-projects/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/14/setting-up-gitlab-ci-for-android-projects/</id>
<published>2018-02-14T00:00:00+00:00</published>
<updated>2018-02-14T00:00:00+00:00</updated>
<author>
<name>Stojan Anastasov</name>
</author>
<content type='html'>&lt;p&gt;My first experience with continuous integration was using Bitbucket in combination with &lt;a href=&quot;https:&#x2F;&#x2F;jenkins.io&#x2F;&quot;&gt;Jenkins&lt;&#x2F;a&gt;. I was pretty happy with my setup. Jenkins would run on every commit: making sure my code compiles, run Android Lint and run my unit tests. I also set up continuous deployment using &lt;a href=&quot;https:&#x2F;&#x2F;get.fabric.io&#x2F;&quot;&gt;Fabric&lt;&#x2F;a&gt;. Now, at work, we use GitLab as a code repository. GitLab also offers &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;features&#x2F;gitlab-ci-cd&#x2F;&quot;&gt;continuous integration&lt;&#x2F;a&gt;. When we decided to start using continuous integration at work we decided to give GitLab a chance.&lt;&#x2F;p&gt;



&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;cicd_pipeline_infograph.png&quot; alt=&quot;CI&#x2F;CD pipeline infograph&quot; style=&quot;width: 700px;&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;It was already integrated with GitLab and to use it we just needed to install a &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;runner&#x2F;&quot;&gt;runner&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;Using CI with GitLab is simple, after you install a runner you need to add a &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt; file at the root of the repository. GitLab even offers template &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt; files for various languages and frameworks. The Android template is based on &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;2016&#x2F;11&#x2F;30&#x2F;setting-up-gitlab-ci-for-android-projects&#x2F;&quot;&gt;this blog post&lt;&#x2F;a&gt; from 2016. It is a great guide but unfortunately today it doesn’t work. Google introduced a few changes in the command line tools.&lt;&#x2F;p&gt;

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

&lt;p&gt;To install the Android SDK on a CI we need to install the &lt;a href=&quot;https:&#x2F;&#x2F;developer.android.com&#x2F;studio&#x2F;index.html#downloads&quot;&gt;command line tools&lt;&#x2F;a&gt; (scroll to the bottom to get just the command line tools). The command line tools include the &lt;a href=&quot;https:&#x2F;&#x2F;developer.android.com&#x2F;studio&#x2F;command-line&#x2F;sdkmanager.html&quot;&gt;sdkmanager&lt;&#x2F;a&gt; – a command line tool that allows you to view, install, update, and uninstall packages for the Android SDK. So instead of&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&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
- tar --extract --gzip --file=android-sdk.tgz
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;p&gt;we can use&lt;&#x2F;p&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;- wget --quiet --output-document=android-sdk.zip https:&#x2F;&#x2F;dl.google.com&#x2F;android&#x2F;repository&#x2F;sdk-tools-linux-3859397.zip
- unzip -q android-sdk.zip -d android-sdk-linux
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;to download and install the Android SDK tools.&lt;&#x2F;p&gt;

&lt;p&gt;There is also an improvement in accepting licenses for the Android SDK. After you accept the licenses on your development machine the tools will generate a licenses folder in the Android SDK root directory. You can accept the licences for all Android SDK components by running &lt;code&gt;sdkmanager --licenses&lt;&#x2F;code&gt; on your development machine. You can transfer the licenses from your development machine to your CI server. To accept the licenses on the CI server you can use:&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;- mkdir android-sdk-linux&#x2F;licenses
- printf &quot;8933bad161af4178b1185d1a37fbf41ea5269c55\nd56f5187479451eabf01fb78af6dfcb131a6481e&quot; &amp;gt; android-sdk-linux&#x2F;licenses&#x2F;android-sdk-license
- printf &quot;84831b9409646a918e30573bab4c9c91346d8abd&quot; &amp;gt; android-sdk-linux&#x2F;licenses&#x2F;android-sdk-preview-license
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This will create a folder licenses with two files inside. The values written in the files are from my local machine. Depending on which components you use there might be other files on your machine like license for Google TV or Google Glass. Once the licenses are accepted we can install packages:&lt;&#x2F;p&gt;

&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;- android-sdk-linux&#x2F;tools&#x2F;bin&#x2F;sdkmanager --update &amp;gt; update.log
- android-sdk-linux&#x2F;tools&#x2F;bin&#x2F;sdkmanager &quot;platforms;android-${ANDROID_COMPILE_SDK}&quot; &quot;build-tools;${ANDROID_BUILD_TOOLS}&quot; &quot;extras;google;m2repository&quot; &quot;extras;android;m2repository&quot; &amp;gt; installPlatform.log
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A sample project based on the &lt;a href=&quot;https:&#x2F;&#x2F;codelabs.developers.google.com&#x2F;codelabs&#x2F;android-testing&#x2F;index.html#0&quot;&gt;Android Testing codelab&lt;&#x2F;a&gt; with the full &lt;code&gt;.gitlab-ci.yaml&lt;&#x2F;code&gt; file can be found &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;stolea&#x2F;android-gitlab-ci&quot;&gt;here&lt;&#x2F;a&gt;. The rest of the script for building and unit testing is the same as the original post. The latest x86 emulator requires hardware acceleration to run so I’ll skip the functional tests for now.&lt;&#x2F;p&gt;

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

&lt;p&gt;Stojan Anastasov is a pragmatic developer with four years&#x27; experience in building native apps for Android. Now working at &lt;a href=&quot;http:&#x2F;&#x2F;www.cosmicdevelopment.com&#x2F;&quot;&gt;Cosmic Development&lt;&#x2F;a&gt;, he previously worked on the Claxi app at Bransys. You can find him on &lt;a href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;&quot;&gt;Stack Overflow&lt;&#x2F;a&gt; in the &lt;code&gt;android&lt;&#x2F;code&gt; and &lt;code&gt;rxjava&lt;&#x2F;code&gt; tags.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https:&#x2F;&#x2F;dev.to&#x2F;s_anastasov&#x2F;setting-up-gitlab-ci-for-android-projects-a6o&quot;&gt;Setting up GitLab CI for Android projects&lt;&#x2F;a&gt; was originally published on dev.to.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p class=&quot;note&quot;&gt;Cover image by &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;uf4oyaimWwg&quot;&gt;Jamison McAndie&lt;&#x2F;a&gt; on &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;search&#x2F;photos&#x2F;pipeline&quot;&gt;Unsplash&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;ci-for-android.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>How eslint-plugin-vue improved our code reviews</title>
<link href='https://about.gitlab.com/2018/02/13/how-we-added-eslint-into-vue/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/13/how-we-added-eslint-into-vue/</id>
<published>2018-02-13T00:00:00+00:00</published>
<updated>2018-02-13T00:00:00+00:00</updated>
<author>
<name>Filipa Lacerda</name>
</author>
<content type='html'>&lt;p&gt;We&#x27;ve (finally) integrated &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vuejs&#x2F;eslint-plugin-vue&quot;&gt;eslint-plugin-vue&lt;&#x2F;a&gt; successfully into our codebase!&lt;&#x2F;p&gt;



&lt;p&gt;When we &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;5845&quot;&gt;added Vue&lt;&#x2F;a&gt; to our codebase back in April 2016, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vuejs&#x2F;eslint-plugin-vue&quot;&gt;eslint-plugin-vue&lt;&#x2F;a&gt; did not yet &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vuejs&#x2F;eslint-plugin-vue&#x2F;commit&#x2F;6a3a6db540e823b51af1e02950896ac9c2b49219&quot;&gt;exist&lt;&#x2F;a&gt; and we had not yet started using &lt;a href=&quot;https:&#x2F;&#x2F;eslint.org&#x2F;&quot;&gt;eslint&lt;&#x2F;a&gt; at all.&lt;&#x2F;p&gt;

&lt;p&gt;One of the things I love the most about GitLab being an open source tool is that anyone can contribute! &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;winh&quot;&gt;Winnie Hellmann&lt;&#x2F;a&gt;, who has since joined the team, did this amazing work &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;5445&quot;&gt;adding eslint&lt;&#x2F;a&gt; as a community contribution. Thanks Winnie! 🙇‍&lt;&#x2F;p&gt;

&lt;h2 id=&quot;the-start-of-a-style-guide&quot;&gt;The start of a style guide&lt;&#x2F;h2&gt;

&lt;p&gt;As our Vue codebase grew from a few features to quite a large usage (&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;5554&quot;&gt;issue boards&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;8954&quot;&gt;environments&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;7366&quot;&gt;cycle analytics&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;10878&quot;&gt;pipelines&lt;&#x2F;a&gt;) we noticed that each of our Vue apps followed a different style. At that time we felt the need to &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;8866&quot;&gt;document how to architecture a Vue application&lt;&#x2F;a&gt; to ensure a consistent codebase. Once we defined and documented how to use the component system and Flux architecture &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;development&#x2F;fe_guide&#x2F;vue.html#vue-architecture&quot;&gt;with our codebase&lt;&#x2F;a&gt;, we noticed that our Vue code also differed in very small things, such as indentation or the order we declared the methods. These inconsistencies, although small, increased the complexity of the review process and for maintaining a healthy codebase.&lt;&#x2F;p&gt;

&lt;p&gt;With the goal of decreasing the time we spent reviewing Vue code and debating on each of these aspects, and because at the time there wasn&#x27;t an official Vue style guide, &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;commit&#x2F;8c3bdc853a5237a3bef6e26fcf22132db7e8bd9c&quot;&gt;we started our own&lt;&#x2F;a&gt;! You can check out our documentation &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;e%20e&#x2F;development&#x2F;fe_guide&#x2F;style_guide_js.html#vue-js&quot;&gt;here&lt;&#x2F;a&gt;. As the Vue community grew, the need for an official style guide and for an eslint plugin for Vue grew with it. Thanks to the wonderful team &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;michalsnik&quot;&gt;Michał Sajnóg&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mysticatea&quot;&gt;Toru Nagashima&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;armano2&quot;&gt;Armano&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;chrisvfritz&quot;&gt;Chris Fritz&lt;&#x2F;a&gt; leading the development of such a tool, we are now able to use it in production! And we even got to act as source of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vuejs&#x2F;eslint-plugin-vue&#x2F;issues&#x2F;77#issuecomment-315834845&quot;&gt;inspiration for the official one&lt;&#x2F;a&gt; ❤&lt;&#x2F;p&gt;

&lt;h2 id=&quot;adding-eslint-vue-plugin&quot;&gt;Adding eslint-vue-plugin&lt;&#x2F;h2&gt;

&lt;p&gt;After &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;34312&quot;&gt;waiting a couple of months&lt;&#x2F;a&gt; for a stable version of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vuejs&#x2F;eslint-plugin-vue&quot;&gt;eslint-plugin-vue&lt;&#x2F;a&gt;, we finally gave it a try once version &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vuejs&#x2F;eslint-plugin-vue&#x2F;releases&#x2F;tag&#x2F;v4.0.0&quot;&gt;4.0.0&lt;&#x2F;a&gt; was released.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;eslint-vue-plugin&#x2F;eslint-conflicts-team-help.png&quot; alt=&quot;EE Conflicts&quot; title=&quot;EE Conflicts&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;&lt;small&gt;Frontend team working together to resolve all the vue eslint problems&lt;&#x2F;small&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;It took a couple of days to fix all the problems eslint identified in our code, but we were able to successfully add it and thanks to a huge team effort, the second row of conflicts was solved very quickly. Thanks again Luke, Eric, Kushal and José!&lt;&#x2F;p&gt;

&lt;p&gt;Now our review process is even faster, we don&#x27;t have to manually check for the style guide rules anymore! 🎉&lt;&#x2F;p&gt;

&lt;p class=&quot;note&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pixabay.com&#x2F;en&#x2F;computer-computer-code-screen-1209641&#x2F;&quot;&gt;Cover image&lt;&#x2F;a&gt; by &lt;a href=&quot;https:&#x2F;&#x2F;pixabay.com&#x2F;en&#x2F;users&#x2F;Free-Photos-242387&#x2F;&quot;&gt;Free-Photos&lt;&#x2F;a&gt; is licensed under &lt;a href=&quot;https:&#x2F;&#x2F;creativecommons.org&#x2F;publicdomain&#x2F;zero&#x2F;1.0&#x2F;&quot;&gt;CC0 1.0&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;eslint-vue-plugin&#x2F;code_cover_image.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>Have your say: Which AWS integration do you want?</title>
<link href='https://about.gitlab.com/2018/02/12/call-for-votes-aws-integrations/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/12/call-for-votes-aws-integrations/</id>
<published>2018-02-12T00:00:00+00:00</published>
<updated>2018-02-12T00:00:00+00:00</updated>
<author>
<name>Eliran Mesika</name>
</author>
<content type='html'>&lt;p&gt;We want your input: which AWS tool combined with GitLab would make your life easier?&lt;&#x2F;p&gt;



&lt;p&gt;We recently met with the developer tools team at AWS to talk tools and integrations. AWS is asking the GitLab community which integrations with AWS tools you&#x27;re interested in seeing developed. We’re calling for votes for the respective issues below:&lt;&#x2F;p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;36178&quot;&gt;AWS CodeDeploy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;36175&quot;&gt;AWS CodeBuild&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;36176&quot;&gt;AWS CodePipeline&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;p&gt;You can read more about each of the integrations in the issues mentioned above. Let us know which is your idea of developer nirvana by voting in our Twitter poll below. Cast your votes away!&lt;&#x2F;p&gt;

&lt;div class=&quot;center&quot;&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;.&lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;awscloud?ref_src=twsrc%5Etfw&quot;&gt;@awscloud&lt;&#x2F;a&gt; wants you to help decide which integrations with GitLab to develop next! 💥 Let us know: which tool combined with GitLab would make your life easier?&lt;&#x2F;p&gt;&amp;mdash; GitLab (@gitlab) &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;gitlab&#x2F;status&#x2F;963096997828767744?ref_src=twsrc%5Etfw&quot;&gt;February 12, 2018&lt;&#x2F;a&gt;&lt;&#x2F;blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https:&#x2F;&#x2F;platform.twitter.com&#x2F;widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;&#x2F;script&gt;

&lt;&#x2F;div&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;gitlab-aws-cover.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>Using GitLab to project manage home renovation priorities</title>
<link href='https://about.gitlab.com/2018/02/08/using-gitlab-to-manage-house-renovation-priorities/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/08/using-gitlab-to-manage-house-renovation-priorities/</id>
<published>2018-02-08T00:00:00+00:00</published>
<updated>2018-02-08T00:00:00+00:00</updated>
<author>
<name>Brendan O&#x27;Leary</name>
</author>
<content type='html'>&lt;p&gt;Last summer my wife and I bought a new house for our ever-growing family. Before we moved in, we had a couple of improvements made – wood floors to replace the aging carpet in the master bedroom, some required structural fixes. However, when we bought the house, we knew there would be a lot more we wanted to do over the years. When it came to organizing those ideas into things that need to happen sooner rather than later and those that could wait, however, we found ourselves struggling to keep all of the plans in order.&lt;&#x2F;p&gt;



&lt;h2 id=&quot;trying-to-get-organized&quot;&gt;Trying to get organized&lt;&#x2F;h2&gt;

&lt;p&gt;I&#x27;ve been able to complete a few other projects since we moved in – but most were small in scale. A built-in shelf wall for my wife&#x27;s office, painting and staining the new deck, and of course a DIY standing desk to use in my new office kitchen (which is also the house&#x27;s kitchen… &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;culture&#x2F;remote-only&#x2F;&quot;&gt;working from home for the win!&lt;&#x2F;a&gt;). These projects were great, but we needed a way to organize and prioritize larger renovation projects.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;home-improvement-examples.png&quot; alt=&quot;Home improvement examples&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;&lt;small&gt;Clockwise, from left: built-in shelf wall, painted and stained deck, DIY standing desk&lt;&#x2F;small&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;I was a GitLab user for years before I even became a GitLabber. I&#x27;ve always hosted my side-project code in GitLab.com since GitLab offers &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;gitlab-com&#x2F;&quot;&gt;unlimited private repositories&lt;&#x2F;a&gt; for free. For project management in my &quot;day job&quot; I&#x27;ve used dozens of other tools outside of GitLab, so when I joined it was the first time I saw the full breadth of what GitLab offers in issue management.&lt;&#x2F;p&gt;

&lt;p&gt;In thinking about the other tools I&#x27;ve used in the past, they didn&#x27;t seem to meet the full bar of what I was looking for to solve our problem. As a mother of four young children, my wife is always on the go… but I&#x27;m on a computer all day long. So we needed something that worked seamlessly between platforms. We also needed to be able to easily re-arrange and re-prioritize items. Also, I fancy myself a bit of a DIY-er, so I wanted to be able to label some items as at least &lt;em&gt;possible&lt;&#x2F;em&gt; for me to maybe complete myself. All of these requirements had me wondering what tool would be best for my wife and me to collaborate on.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;enter-gitlab-issue-boards&quot;&gt;Enter GitLab Issue Boards&lt;&#x2F;h2&gt;

&lt;p&gt;With these requirements, and my newfound GitLab knowledge, I was able to come up with a novel solution to the problem we were having: why not use a &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;features&#x2F;issueboard&#x2F;&quot;&gt;GitLab Issue Board&lt;&#x2F;a&gt; to manage our ever-changing home renovation priorities?&lt;&#x2F;p&gt;

&lt;p&gt;With Issue Boards, we would have a fantastic solution for mobile and desktop (shout out to the &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;development&#x2F;ux_guide&#x2F;&quot;&gt;GitLab UX team&lt;&#x2F;a&gt;!). With &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;labels.html&quot;&gt;labels&lt;&#x2F;a&gt;, I could organize and group issues however we wanted. And the customizable columns would allow us to prioritize, track and manage the various issues and ideas.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;how-the-board-works&quot;&gt;How the board works&lt;&#x2F;h2&gt;

&lt;p&gt;To start, I &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;groups&#x2F;new&quot;&gt;created a new group on GitLab.com&lt;&#x2F;a&gt; to house (pun intended) everything for our family. I made a project in that group called &lt;code&gt;priorities&lt;&#x2F;code&gt; to be the central place to collect all the renovation ideas we had. In the future, I may have a project for a specific renovation, managing purchases, and contractors, etc.&lt;&#x2F;p&gt;

&lt;p&gt;As with every GitLab project, issues and issue boards were baked right in. I started adding issues right away – beginning with those that were at the top of mind, like the water heater that is at the end of its usable life, repairs to our front entryway, and window replacement.  My wife didn&#x27;t have a GitLab.com account yet, but it was easy to add her to the project as a member just by putting her email address in on the member&#x27;s page, allowing her to sign up and get access to the project in one step.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;invite-member-by-email.png&quot; alt=&quot;Invite member by e-mail&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;To get organized, I created a few labels: &lt;code&gt;P1&lt;&#x2F;code&gt; for top priority items, &lt;code&gt;DIY Possibility&lt;&#x2F;code&gt; for those I might be able to tackle on my own, and &lt;code&gt;Furniture&lt;&#x2F;code&gt; for those that involved furnishing various rooms. The labels will help filter issues so that if I find a free weekend, I can search for &lt;code&gt;DIY Possibility&lt;&#x2F;code&gt; issues to maybe get started on. Or if we go to a furniture store, we could filter to those issues to get an idea of cost while we are there.&lt;&#x2F;p&gt;

&lt;p&gt;For the board columns, I decided to use &lt;code&gt;P1&lt;&#x2F;code&gt; as the first column after Backlog to highlight those issues. From there, it&#x27;s a matter of agreeing on an organization of priority 😃&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;home-improvement-issue-board.png&quot; alt=&quot;Home improvement issue board&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;&#x2F;h2&gt;

&lt;p&gt;Now it&#x27;s time to execute! One thing we didn&#x27;t account for in the first iteration was the scope of issues. Some things were relatively minor regarding time and investment. Others (like replacing all 27 windows!) are larger projects for which we need to budget. For this, we will be using &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;workflow&#x2F;issue_weight.html&quot;&gt;issue weight&lt;&#x2F;a&gt; to understand how different projects align with budget and time investment to pull off.&lt;&#x2F;p&gt;

&lt;p&gt;It&#x27;s been an exciting experience using GitLab Issue Boards for something outside of the development space. We&#x27;d love to hear from you too about &quot;non-standard&quot; uses for GitLab&#x27;s features. Feel free to comment on this post or tweet us &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;gitlab&quot;&gt;@GitLab&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p class=&quot;note&quot;&gt;&lt;em&gt;Cover photo by &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;d0yNnTEjEWY?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;George Pastushok&lt;&#x2F;a&gt; on &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;&quot;&gt;Unsplash&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;home-improvement.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>GitLab Security Release: 10.4.3, 10.3.7, and 10.2.8</title>
<link href='https://about.gitlab.com/2018/02/07/gitlab-security-10-4-3-plus-10-3-7-plus-10-2-8-blog/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/07/gitlab-security-10-4-3-plus-10-3-7-plus-10-2-8-blog/</id>
<published>2018-02-07T00:00:00+00:00</published>
<updated>2018-02-07T00:00:00+00:00</updated>
<author>
<name>James Ritchey</name>
</author>
<content type='html'>&lt;p&gt;Today we are releasing versions 10.4.3, 10.3.7, and 10.2.8 for GitLab Community Edition (CE) and Enterprise Edition (EE).&lt;&#x2F;p&gt;

&lt;p&gt;These versions contain a number of important security fixes, and we strongly recommend that all GitLab installations be upgraded to one of these versions immediately.&lt;&#x2F;p&gt;

&lt;p&gt;This security release blog post is the first part of two. The second blog will be posted in approximately 30 days, and it will detail the vulnerability findings.&lt;&#x2F;p&gt;

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



&lt;h2 id=&quot;snippetfinder-information-disclosure&quot;&gt;SnippetFinder information disclosure&lt;&#x2F;h2&gt;

&lt;p&gt;The GitLab SnippetFinder component contained an information disclosure which allowed access to snippets restricted to &lt;code&gt;Only team members&lt;&#x2F;code&gt; or configured as &lt;code&gt;disabled&lt;&#x2F;code&gt;. The issue is now resolved in the latest version.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;versions-affected&quot;&gt;Versions affected&lt;&#x2F;h3&gt;

&lt;ul&gt;
  &lt;li&gt;GitLab CE and EE 7.4.0 and up&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h3 id=&quot;remediation&quot;&gt;Remediation&lt;&#x2F;h3&gt;

&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;ldap-api-authorization-issue&quot;&gt;LDAP API authorization issue&lt;&#x2F;h2&gt;

&lt;p&gt;An LDAP API endpoint contained an authorization vulnerability which unintentionally disclosed bulk LDAP groups data. This issue is now fixed in the latest release.&lt;&#x2F;p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;jobertabma&quot;&gt;Jobert Abma&lt;&#x2F;a&gt; of &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;jobert&quot;&gt;HackerOne&lt;&#x2F;a&gt; for responsibly disclosing this issue to us.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;versions-affected-1&quot;&gt;Versions affected&lt;&#x2F;h3&gt;

&lt;ul&gt;
  &lt;li&gt;GitLab CE and EE 6.1.0 and up&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h3 id=&quot;remediation-1&quot;&gt;Remediation&lt;&#x2F;h3&gt;

&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;persistent-xss-mermaid-markdown&quot;&gt;Persistent XSS mermaid markdown&lt;&#x2F;h2&gt;

&lt;p&gt;The mermaid markdown feature contained a persistent XSS issue that is now resolved in the latest release.&lt;&#x2F;p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;totally_unknown&quot;&gt;Nils Juenemann&lt;&#x2F;a&gt; for responsibly disclosing this issue to us.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;versions-affected-2&quot;&gt;Versions affected&lt;&#x2F;h3&gt;

&lt;ul&gt;
  &lt;li&gt;GitLab CE and EE 10.3 and up&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h3 id=&quot;remediation-2&quot;&gt;Remediation&lt;&#x2F;h3&gt;

&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;insecure-direct-object-reference-todo-api&quot;&gt;Insecure direct object reference Todo API&lt;&#x2F;h2&gt;

&lt;p&gt;The Todo API was vulnerable to an insecure direct object reference issue which resulted in an information disclosure of confidential data.&lt;&#x2F;p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;jobertabma&quot;&gt;Jobert Abma&lt;&#x2F;a&gt; of &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;jobert&quot;&gt;HackerOne&lt;&#x2F;a&gt; for responsibly disclosing this issue to us.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;versions-affected-3&quot;&gt;Versions Affected&lt;&#x2F;h3&gt;

&lt;ul&gt;
  &lt;li&gt;GitLab CE and EE 9.5 and up&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h3 id=&quot;remediation-3&quot;&gt;Remediation&lt;&#x2F;h3&gt;

&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;github-import-access-control-issue&quot;&gt;GitHub import access control issue&lt;&#x2F;h2&gt;

&lt;p&gt;An improper access control weakness issue was discovered in the GitHub import feature. The issue allowed an attacker to create projects under other accounts which they shouldn&#x27;t have access to. The issue is now resolved in the latest version.&lt;&#x2F;p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;jobertabma&quot;&gt;Jobert Abma&lt;&#x2F;a&gt; of &lt;a href=&quot;https:&#x2F;&#x2F;hackerone.com&#x2F;jobert&quot;&gt;HackerOne&lt;&#x2F;a&gt; for responsibly disclosing this issue to us.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;versions-affected-4&quot;&gt;Versions affected&lt;&#x2F;h3&gt;

&lt;ul&gt;
  &lt;li&gt;GitLab CE and EE 9.1 and up&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h3 id=&quot;remediation-4&quot;&gt;Remediation&lt;&#x2F;h3&gt;

&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;protected-variables-information-disclosure&quot;&gt;Protected variables information disclosure&lt;&#x2F;h2&gt;

&lt;p&gt;The CI jobs protected tag feature contained a vulnerability which resulted in an information disclosure of protected variables. The issue is now resolved in the latest release.&lt;&#x2F;p&gt;

&lt;p&gt;Thanks to Wes Cossick of &lt;a href=&quot;https:&#x2F;&#x2F;www.sparksuite.com&#x2F;&quot;&gt;Sparksuite&lt;&#x2F;a&gt; for responsibly disclosing this issue to us.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;versions-affected-5&quot;&gt;Versions affected&lt;&#x2F;h3&gt;

&lt;ul&gt;
  &lt;li&gt;GitLab CE and EE 9.1 and up&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h3 id=&quot;remediation-5&quot;&gt;Remediation&lt;&#x2F;h3&gt;

&lt;p&gt;We &lt;strong&gt;strongly recommend&lt;&#x2F;strong&gt; that all installations running an affected version above to be upgraded to the latest version as soon as possible.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;upgrade-barometer&quot;&gt;Upgrade barometer&lt;&#x2F;h2&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&quot;&gt;update page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;cve-ids&quot;&gt;CVE IDs&lt;&#x2F;h3&gt;

&lt;p&gt;We are working on obtaining CVE numbers for these vulnerabilities and will update the blog post accordingly when we&#x27;ve obtained that information.&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>Automate your localization with GitLab + Crowdin</title>
<link href='https://about.gitlab.com/2018/02/06/crowdin-localization-for-agile-projects/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/06/crowdin-localization-for-agile-projects/</id>
<published>2018-02-06T00:00:00+00:00</published>
<updated>2018-02-06T00:00:00+00:00</updated>
<author>
<name>Khrystyna Humenna</name>
</author>
<content type='html'>&lt;p&gt;When developing products like web apps, games, and alike, you have to face the fact that you enter the international market the moment your product is first mentioned on the web. Once you decide to promote your product internationally and expand its reach, you should add localization to your workflow. Crowdin&#x27;s integration with GitLab means you can seamlessly automate your localization process.&lt;&#x2F;p&gt;



&lt;p&gt;A developer needs roughly 15 minutes to add some new texts. If a product is to be translated into, let’s say, 10 languages, the deployment is delayed for at least a week, as after the code is built, translators need time to make the translations. If several developers work on the product updates simultaneously, translations for those would delay each deployment even more. In this scenario, any team is quite unlikely to stay Agile.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;do-localization-in-an-agile-way-with-the-gitlab--crowdin-integration&quot;&gt;Do localization in an Agile way with the GitLab + Crowdin integration&lt;&#x2F;h2&gt;

&lt;p&gt;To be able to constantly ship minimum viable changes, localization should be a part of the development process. Crowdin is a localization management platform that completes your workflow by synchronizing translatable and translated files between your GitLab repository and your Crowdin localization project. This way multiple translators and developers can work simultaneously to deliver great results in less time.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;integrate-crowdin-with-your-repository&quot;&gt;Integrate Crowdin with your repository&lt;&#x2F;h3&gt;

&lt;p&gt;First of all, log into &lt;a href=&quot;https:&#x2F;&#x2F;crowdin.com&#x2F;&quot;&gt;crowdin.com&lt;&#x2F;a&gt; (you can use your GitLab account for this as well), then create a localization project or integrate an existing one. In the Crowdin project settings, you will be able to set up this integration and define whether the translatable texts should be uploaded to Crowdin from the master branch or from the development branches.&lt;&#x2F;p&gt;

&lt;p&gt;Then select the file path for translations, as once they are made in Crowdin, they will be automatically added to your GitLab repository in a merge request. Each time the automatic file sync is completed the merge request in GitLab will be updated with new translations, or a new merge request will be created if the previous one was already merged.&lt;&#x2F;p&gt;

&lt;p&gt;This allows you to review translations before merging them to master and receive up-to-date translations in a few minutes after they are made, as the file sync is completed automatically. Read more details on &lt;a href=&quot;https:&#x2F;&#x2F;support.crowdin.com&#x2F;gitlab-integration&#x2F;&quot;&gt;how to set up the GitLab + Crowdin integration&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;gitlab_crowdin_integration.png&quot; alt=&quot;GitLab Crowdin integration&quot; style=&quot;width: 700px;&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;&lt;small&gt;A view of the integration with GitLab in Crowdin during automated synchronization.&lt;&#x2F;small&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;h3 id=&quot;work-with-agile-translators&quot;&gt;Work with Agile translators&lt;&#x2F;h3&gt;

&lt;p&gt;Whether you decide to translate your project with the help of in-house translators or a translation agency, they should be Agile so they can make translations of different scope at any time, not just one project at a time.&lt;&#x2F;p&gt;

&lt;p&gt;Crowdin project notification settings allow you to notify translators and other project members every time new texts are added to the project. This way they’ll be able to start making translations once new texts are synchronized with a project in Crowdin. You in your turn will be able to keep an eye on their contributions and overall project activity using Crowdin project reports.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;crowdin_project_reports.png&quot; alt=&quot;Crowdin project reports&quot; style=&quot;width: 700px;&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;&lt;small&gt;Use project reports in Crowdin to easily track the main activities such as translations and approvals.&lt;&#x2F;small&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;key-points-to-remember-about-localization&quot;&gt;Key points to remember about localization&lt;&#x2F;h2&gt;

&lt;h3 id=&quot;localization-is-a-continuous-process&quot;&gt;Localization is a continuous process&lt;&#x2F;h3&gt;

&lt;p&gt;If your product changes and evolves often you should keep the localized versions up to date as well. Each time you add some new functionality, scheduled update, or a small change, the new texts should be localized as well.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;the-products-ui-should-be-flexible&quot;&gt;The product’s UI should be flexible&lt;&#x2F;h3&gt;

&lt;p&gt;Make sure to use responsive design, as the same phrase in different languages might take up more or less space than the primary language of your product.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;consistency-is-important&quot;&gt;Consistency is important&lt;&#x2F;h3&gt;

&lt;p&gt;Creating a style guide, glossary, and using a Translation Memory is a great idea if you want to speed up the translation process and receive consistent translations at the same time.&lt;&#x2F;p&gt;

&lt;p&gt;Crowdin comes with a free 10-day trial and is free of charge for open source projects. &lt;a href=&quot;https:&#x2F;&#x2F;crowdin.com&#x2F;join&quot;&gt;Give it a try!&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;gitlab-crowdin-cover.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>GitLab Pages Security Issue Notification</title>
<link href='https://about.gitlab.com/2018/02/05/gitlab-pages-custom-domain-validation/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/05/gitlab-pages-custom-domain-validation/</id>
<published>2018-02-05T00:00:00+00:00</published>
<updated>2018-02-05T00:00:00+00:00</updated>
<author>
<name>James Ritchey</name>
</author>
<content type='html'>&lt;h2 id=&quot;issue-summary&quot;&gt;Issue Summary&lt;&#x2F;h2&gt;

&lt;p&gt;When a user adds a &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;user&#x2F;project&#x2F;pages&#x2F;getting_started_part_three.html#adding-your-custom-domain-to-gitlab-pages&quot;&gt;custom domain&lt;&#x2F;a&gt; to their Pages site, no validation was being performed to ensure the domain was owned by that user. This issue allows an attacker to discover DNS records already pointing to the GitLab Page IP address which haven&#x27;t been claimed and potentially hijack them. This issue impacts all users who have created and then deleted custom domains using GitLab Pages, but still have the DNS records active.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;customer-remediation-steps&quot;&gt;Customer Remediation Steps&lt;&#x2F;h2&gt;

&lt;p&gt;Our customers should check if they are using the GitLab Pages service with a custom domain and review their DNS records which point to the GitLab Pages IP &lt;code&gt;52.167.214.135&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;If you notice any of your DNS records pointing to that IP address and you&#x27;re no longer using or intending to use the Gitlab Pages service, please remove those specific DNS records.&lt;&#x2F;p&gt;

&lt;p&gt;If you are intending to use the GitLab Pages service and notice that your custom domain has already been claimed or &quot;hijacked&quot;, please contact us at security@gitlab.com.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;gitlab-remediation-strategy&quot;&gt;GitLab Remediation Strategy&lt;&#x2F;h2&gt;

&lt;p&gt;We&#x27;ve currently disabled the feature to add custom domains until we&#x27;ve deployed the patch. In the meantime, the GitLab team is working to provide a more complete &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;29497&quot;&gt;validation&lt;&#x2F;a&gt; of custom domains in the GitLab Pages service as soon as possible.&lt;&#x2F;p&gt;

&lt;p&gt;Our mitigation strategy will consist of implementing domain verification mechanisms on all new and existing GitLab Pages domains, utilizing checks on customer DNS TXT records. This mechanism will be detailed in GitLab Pages documentation when implemented.&lt;&#x2F;p&gt;

&lt;p&gt;There will be a transition plan for current customers once the domain verification mechanisms are active. Stay tuned for further details.&lt;&#x2F;p&gt;

&lt;h4 id=&quot;update-2018-02-07-1000pm-utc&quot;&gt;Update (2018-02-07 10:00PM UTC)&lt;&#x2F;h4&gt;

&lt;p&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;issues&#x2F;29497&quot;&gt;issue&lt;&#x2F;a&gt; referenced above is currently confidential and will be made public after the fix is implemented in 10.5.&lt;&#x2F;p&gt;

&lt;h4 id=&quot;update-2018-02-14-700pm-utc&quot;&gt;Update (2018-02-14 7:00PM UTC)&lt;&#x2F;h4&gt;

&lt;p&gt;The domain verification mechanism will be deployed by the 20th of February in the 10.4 security release. The feature to add custom domains will be re-enabled, and once again users will be able to configure domains and update TLS certificates.&lt;&#x2F;p&gt;

&lt;h4 id=&quot;update-2018-02-21-1200am-utc&quot;&gt;Update (2018-02-21 12:00AM UTC)&lt;&#x2F;h4&gt;

&lt;p&gt;The domain verification mechanism rollout will be phased, starting with GitLab.com, beginning on 2&#x2F;21. We expect that rollout will be completed end of week 2&#x2F;26, based on current projections.&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>Test all the things in GitLab CI with Docker by example</title>
<link href='https://about.gitlab.com/2018/02/05/test-all-the-things-gitlab-ci-docker-examples/' rel='alternate' />
<id>https://about.gitlab.com/2018/02/05/test-all-the-things-gitlab-ci-docker-examples/</id>
<published>2018-02-05T00:00:00+00:00</published>
<updated>2018-02-05T00:00:00+00:00</updated>
<author>
<name>Gabriel Le Breton</name>
</author>
<content type='html'>&lt;p&gt;Do you write tests? Or do you skip them because it’s too complicated to run? Or maybe developers on your team just don’t care? You should take a few minutes and set up CI so you can enforce good practices. Good news, you can test &lt;a href=&quot;http:&#x2F;&#x2F;knowyourmeme.com&#x2F;memes&#x2F;all-the-things&quot;&gt;all the things&lt;&#x2F;a&gt; automagically in &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;features&#x2F;gitlab-ci-cd&#x2F;&quot;&gt;GitLab CI&#x2F;CD&lt;&#x2F;a&gt; with Docker and very little effort 🤘&lt;&#x2F;p&gt;



&lt;p&gt;I recently gave a presentation at the &lt;a href=&quot;http:&#x2F;&#x2F;saglac.io&#x2F;&quot;&gt;SagLacIO&lt;&#x2F;a&gt; about &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;features&#x2F;gitlab-ci-cd&#x2F;&quot;&gt;GitLab CI&#x2F;CD&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;getting-started&quot;&gt;Getting started&lt;&#x2F;h2&gt;

&lt;p&gt;First, you’ll need an account at &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;&quot;&gt;GitLab.com&lt;&#x2F;a&gt;. If you don’t already have one, you can open an account with no problem. &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;products&#x2F;&quot;&gt;GitLab’s free tier&lt;&#x2F;a&gt; gives you a ton of features, unlimited free hosted repositories, 2,000 CI build minutes per month, etc. You can even use your own task runners in case you bust that limit.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;useful-links&quot;&gt;Useful links&lt;&#x2F;h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;&quot;&gt;GitLab.com&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;README.html&quot;&gt;GitLab CI&#x2F;CD documentation&lt;&#x2F;a&gt; 📗&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;yaml&#x2F;README.html&quot;&gt;.gitlab-ci.yml documentation&lt;&#x2F;a&gt; 📕&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;ci&#x2F;lint&#x2F;&quot;&gt;.gitlab-ci.yml linter: gitlab.com&#x2F;ci&#x2F;lint&lt;&#x2F;a&gt; ✅&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gableroux&#x2F;gitlab-ci-example-nodejs&quot;&gt;gitlab-ci nodejs example project&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gableroux&#x2F;gitlab-ci-example-docker&quot;&gt;gitlab-ci Docker example project&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gableroux&#x2F;gitlab-ci-example-django&quot;&gt;gitlab-ci django example project&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gableroux&#x2F;unity3d&quot;&gt;Unity3D Docker project&lt;&#x2F;a&gt; running in gitlab-ci and published to &lt;a href=&quot;https:&#x2F;&#x2F;hub.docker.com&#x2F;r&#x2F;gableroux&#x2F;unity3d&#x2F;&quot;&gt;Docker Hub&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;45517733&#x2F;how-to-publish-docker-images-to-docker-hub-from-gitlab-ci&quot;&gt;How to publish Docker images to Docker Hub from gitlab-ci on Stack Overflow&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;here-go-the-slides&quot;&gt;Here go the slides&lt;&#x2F;h2&gt;

&lt;p&gt;Scroll through the slides from my presentation on GitLab CI&#x2F;CD at SagLacIO, you’ll have fun 🤘&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
&lt;iframe src=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;10835yig54EbR_OQcxSXURkPk_0zkhLxaWHdRdXb-yWw&#x2F;embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;1280&quot; height=&quot;749&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;p&gt;If you have suggestions, feel free to poke me or &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;GabLeRoux&#x2F;gableroux.github.io&#x2F;issues&quot;&gt;open an issue&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gableroux.com&#x2F;saglacio&#x2F;2018&#x2F;01&#x2F;16&#x2F;test-all-the-things-in-gitlab-ci-with-docker-by-example&#x2F;&quot;&gt;Test all the things in GitLab CI with Docker by example&lt;&#x2F;a&gt; was originally published on gableroux.com.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p class=&quot;note&quot;&gt;&lt;em&gt;Cover photo by &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;ahi73ZN5P0Y?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Federico Beccari&lt;&#x2F;a&gt; on &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;&quot;&gt;Unsplash&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;test-all-the-things-in-gitlab-ci-with-docker-by-example.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>GitLab&#x27;s Functional Group Updates: January 3rd - January 31st</title>
<link href='https://about.gitlab.com/2018/01/31/functional-group-updates/' rel='alternate' />
<id>https://about.gitlab.com/2018/01/31/functional-group-updates/</id>
<published>2018-01-31T00:00:00+00:00</published>
<updated>2018-01-31T00:00:00+00:00</updated>
<author>
<name>Chloe Whitestone</name>
</author>
<content type='html'>&lt;!-- beginning of the intro - leave it as is --&gt;

&lt;p&gt;Every day from Monday to Friday, right before our &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;handbook&#x2F;#team-call&quot;&gt;GitLab Team call&lt;&#x2F;a&gt;, a different Functional Group gives an &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;handbook&#x2F;people-operations&#x2F;functional-group-updates&#x2F;&quot;&gt;update&lt;&#x2F;a&gt; to our team.&lt;&#x2F;p&gt;

&lt;p&gt;The format of these calls is simple and short where they can either give a presentation or quickly walk the team through their agenda.&lt;&#x2F;p&gt;



&lt;!-- end of the intro --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;prometheus-team&quot;&gt;Prometheus Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;1VGIVnoBvEUPMyRYtQ21WrKL79PTC7fHhprkgFsMwGl4&#x2F;edit&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;ZVPIEQXl2CU&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;ux-team&quot;&gt;UX Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;16aPs_60brJFKYyJZJNMweQDOc2NsnfeWer9hPwBPJzo&#x2F;edit&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;rP69Qa4LGCg&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;edge-team&quot;&gt;Edge Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;http:&#x2F;&#x2F;gitlab-org.gitlab.io&#x2F;functional-group-updates&#x2F;edge&#x2F;2018-01-09&#x2F;#1&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;nUJu2dL1JHo&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;ux-research-team&quot;&gt;UX Research Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;1-E-Y-6-_C0sEUInf-bbek2DOwQM802aM-ZP1crMxkiU&#x2F;&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;_TAOmK-ypvA&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;discussion-team&quot;&gt;Discussion Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;http:&#x2F;&#x2F;gitlab-org.gitlab.io&#x2F;functional-group-updates&#x2F;backend-discussion&#x2F;&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;nT7fX4O6Urs&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;content-marketing-team&quot;&gt;Content Marketing Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;1qGK8oc9NcJ92fEVuvMrGOPNgjvCZ_UxzKTQZ61n_UtQ&#x2F;edit&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;pOplmf3WnvQ&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;platform-backend-team&quot;&gt;Platform Backend Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;1orvmzwWecUWxRmL0DTJzW4C24aKJCsjnL-PQtxIsUAA&#x2F;edit&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;20V0laoBE9c&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;ux-team-1&quot;&gt;UX Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;a&#x2F;gitlab.com&#x2F;presentation&#x2F;d&#x2F;1cT6lPbba81ckN04JW55gVU_TkuxWOlvH9-9-KPGSZPA&#x2F;edit?usp=drive_web&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;NOsMqyLVBww&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;h3 id=&quot;build-team&quot;&gt;Build Team&lt;&#x2F;h3&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.google.com&#x2F;presentation&#x2F;d&#x2F;1YLxJS4iic9nTGxWbaz8IMVkoWQfy2RVJ95fR2Jcze5c&#x2F;edit#slide=id.g2823c3f9ca_0_0&quot;&gt;Presentation slides&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;figure class=&quot;video_container&quot;&gt;
  &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;iWTIotCxTa4&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt; &lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;

&lt;!-- end of the FG block --&gt;

&lt;!-- beginning of the FG block - repeat as many times as necessary (copy and paste the entire block) --&gt;

&lt;hr &#x2F;&gt;

&lt;p&gt;Questions? Leave a comment below or tweet &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;gitlab&quot;&gt;@GitLab&lt;&#x2F;a&gt;! Would you like to join us? 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;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;functional-group-update-blog-cover.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>GitLab Patch Release: 10.4.2</title>
<link href='https://about.gitlab.com/2018/01/31/gitlab-10-dot-4-dot-2-released/' rel='alternate' />
<id>https://about.gitlab.com/2018/01/31/gitlab-10-dot-4-dot-2-released/</id>
<published>2018-01-31T00:00:00+00:00</published>
<updated>2018-01-31T00:00:00+00:00</updated>
<author>
<name>Mark Fletcher</name>
</author>
<content type='html'>&lt;p&gt;Today we are releasing GitLab version 10.4.2.&lt;&#x2F;p&gt;

&lt;p&gt;This version resolves a number of regressions and bugs in &lt;a href=&quot;&#x2F;2018&#x2F;01&#x2F;22&#x2F;gitlab-10-4-released&#x2F;&quot;&gt;this month&#x27;s 10.4
release&lt;&#x2F;a&gt; and prior versions.&lt;&#x2F;p&gt;



&lt;h2 id=&quot;bug-fixes-for-community-and-enterprise-editions&quot;&gt;Bug fixes for Community and Enterprise Editions&lt;&#x2F;h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;15804&quot;&gt;Fix bugs preventing copy&#x2F;paste on iOS&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16618&quot;&gt;Fix Gitlab::Database::Grant.create_and_execute_trigger? so it uses has_table_privilege() on PostgreSQL&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16637&quot;&gt;Fix bug for Gitaly::CommitService: Encoding::UndefinedConversionError&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16531&quot;&gt;Fix bug in security release with deploy keys migration&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16740&quot;&gt;Fix bug regarding cleaning runner cache on Windows&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16714&quot;&gt;Fix bug for project import failures&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16724&quot;&gt;Fix bug in webpack_helper&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16485&quot;&gt;Fix visibility of &quot;Allow users to request access&quot; option in public projects&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;bug-fixes-for-enterprise-editions&quot;&gt;Bug fixes for Enterprise Editions&lt;&#x2F;h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4082&quot;&gt;Fix cancelling of board settings modal&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4229&quot;&gt;Fix bugs when moving an issue&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4196&quot;&gt;Fix bugs with Admin Dashboard view&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4236&quot;&gt;Fix incorrect OPENSSH_EXPECTED_COMMAND on gitlab:geo:check task&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4249&quot;&gt;Fix high rate of config.lock file errors on Geo testbed&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EEU:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4278&quot;&gt;Fix bugs with issue ordering in Epics&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EEU:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4142&quot;&gt;Fix Epic issue item reordering to handle different scenarios&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 does not include any new 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;docs.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;&lt;&#x2F;a&gt; file,
which is only used for &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;updates&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-editions&quot;&gt;Enterprise Editions&lt;&#x2F;h2&gt;

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

&lt;p&gt;Access to GitLab Enterprise Editions is granted by a &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;products&#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>Gemnasium is joining the GitLab team</title>
<link href='https://about.gitlab.com/2018/01/30/gemnasium-acquired-by-gitlab/' rel='alternate' />
<id>https://about.gitlab.com/2018/01/30/gemnasium-acquired-by-gitlab/</id>
<published>2018-01-30T00:00:00+00:00</published>
<updated>2018-01-30T00:00:00+00:00</updated>
<author>
<name>Sid Sijbrandij</name>
</author>
<content type='html'>&lt;p&gt;Today we’re happy to share the news that GitLab has acquired &lt;a href=&quot;https:&#x2F;&#x2F;gemnasium.com&#x2F;&quot;&gt;Gemnasium&lt;&#x2F;a&gt;, the dependency monitoring solution.&lt;&#x2F;p&gt;



&lt;p&gt;The Gemnasium team have joined GitLab and are working on implementing robust security scanning functionality natively into GitLab’s CI&#x2F;CD pipelines, as part of our vision for delivering the complete DevOps lifecycle in a single application. For all the details, please check out the announcement on &lt;a href=&quot;https:&#x2F;&#x2F;gemnasium.com&#x2F;blog&#x2F;gemnasium-is-acquired-by-gitlab&#x2F;&quot;&gt;Gemnasium’s blog&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;gemnasium-gitlab-cover.png&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>GitLab Patch Release: 10.4.1</title>
<link href='https://about.gitlab.com/2018/01/26/gitlab-10-dot-4-dot-1-released/' rel='alternate' />
<id>https://about.gitlab.com/2018/01/26/gitlab-10-dot-4-dot-1-released/</id>
<published>2018-01-26T00:00:00+00:00</published>
<updated>2018-01-26T00:00:00+00:00</updated>
<author>
<name>Robert Speicher</name>
</author>
<content type='html'>&lt;p&gt;Today we are releasing GitLab version 10.4.1.&lt;&#x2F;p&gt;

&lt;p&gt;This version resolves a number of regressions and bugs in &lt;a href=&quot;&#x2F;2018&#x2F;01&#x2F;22&#x2F;gitlab-10-4-released&#x2F;&quot;&gt;this month&#x27;s 10.4
release&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;



&lt;h2 id=&quot;bug-fixes-for-community-and-enterprise-editions&quot;&gt;Bug fixes for Community and Enterprise Editions&lt;&#x2F;h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16242&quot;&gt;Ensure that users can reclaim a namespace or project path that is blocked by an orphaned route&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16560&quot;&gt;Correctly escape UTF-8 path elements for uploads&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16584&quot;&gt;Fix issues when rendering groups and their children&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16595&quot;&gt;Fix bug in which projects with forks could not change visibility settings from Private to Public&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16601&quot;&gt;Fix Error 500 when repository has no avatar&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16518&quot;&gt;Add a confirmation when navigating away from an unsaved inline edit&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16211&quot;&gt;Rework indexes on &lt;code&gt;redirect_routes&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16520&quot;&gt;Remove unnecessary query from labels dropdown&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;bug-fixes-for-enterprise-editions&quot;&gt;Bug fixes for Enterprise Editions&lt;&#x2F;h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;EEU:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4080&quot;&gt;Web IDE is now EEU-only&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4186&quot;&gt;Fix route for Geo &#x27;Repair authentication&#x27;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4202&quot;&gt;Fix failed LDAP logins when &lt;code&gt;sync_ssh_keys&lt;&#x2F;code&gt; is included in config&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;bug-fixes-for-omnibus-gitlab&quot;&gt;Bug fixes for Omnibus GitLab&lt;&#x2F;h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Omnibus:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;omnibus-gitlab&#x2F;merge_requests&#x2F;2233&quot;&gt;Update gitlab-monitor to 2.5.0&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;Omnibus:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;omnibus-gitlab&#x2F;merge_requests&#x2F;2232&quot;&gt;Add GitLab pages status page configuration&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 includes one new migration, and should &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;update&#x2F;README.html#upgrading-without-downtime&quot;&gt;not require any
downtime&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;docs.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;&lt;&#x2F;a&gt; file,
which is only used for &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;updates&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-editions&quot;&gt;Enterprise Editions&lt;&#x2F;h2&gt;

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

&lt;p&gt;Access to GitLab Enterprise Editions is granted by a &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;products&#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>Saas.CEO and Sid Sijbrandij talk key decisions, influential connections, and strategic vision when building a startup</title>
<link href='https://about.gitlab.com/2018/01/26/pick-your-brain-interview-vincent-jong/' rel='alternate' />
<id>https://about.gitlab.com/2018/01/26/pick-your-brain-interview-vincent-jong/</id>
<published>2018-01-26T00:00:00+00:00</published>
<updated>2018-01-26T00:00:00+00:00</updated>
<author>
<name>Vincent Jong</name>
</author>
<content type='html'>&lt;p&gt;&lt;em&gt;GitLab CEO Sid Sijbrandij occasionally sits down for a &#x27;&lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;handbook&#x2F;ceo&#x2F;#pick-your-brain-meetings&quot;&gt;pick your brain&lt;&#x2F;a&gt;&#x27; meeting with people seeking advice on open source, remote work, or discussion of other things related to GitLab.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;



&lt;p&gt;&lt;strong&gt;GitLab has become a leading provider in software development solutions, but it didn’t start out like that. Looking back, what were the one or two decisions that really made the company to the success it is today?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;The first one is the decision to build a company around it, because GitLab started as an open source project without a company. As such a project gets bigger, you will have to pay people to keep the quality high.&lt;&#x2F;p&gt;

&lt;p&gt;Another thing was my co-founder Dmitriy tweeting &quot;I want to work on GitLab full time,&quot; which led me to contact him and hire him, which was a great change.&lt;&#x2F;p&gt;

&lt;p&gt;This may be atypical advice on a SaaS CEO interview series, but one thing we did right was not to focus on SaaS. The demand for GitLab was coming from the self-hosted side much more than from the SaaS side, so we decided to focus on that first.&lt;&#x2F;p&gt;

&lt;p&gt;The final one was the decision to apply to Y Combinator. This changed our ambition level from just running the project to being a market leader.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Would you say that your focus on the self-hosted product also allowed you to focus on a different market segment than where players like GitHub were already capturing market share?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;When we started, GitHub and Atlassian were already there in that market and it should have been locked up. But they left an opening in the self-hosted market and at the bottom of the market.&lt;&#x2F;p&gt;

&lt;p&gt;In the beginning our software wasn’t very good, but we were able to rapidly make it better and grow upmarket. This is a great thing because I think today most of the revenue is coming from those large accounts.&lt;&#x2F;p&gt;

&lt;p&gt;The way I see it, source code management is one of the last things to leave self hosted for SaaS. Where this happened much earlier for CRM for example, I think source code for various reasons is transitioning later. We still see that for companies with more than 5,000 employees, 95 percent is still self hosted.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Alright. Looking at a more general perspective, what would you say you understand about building a (SaaS) company that is often overlooked or underestimated by other founders?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;What we do differently is that we write things down. We’re a remote-only company of 200 people working from 200 locations. We try to work as asynchronously as we can and we write down what we do. The output of that is a &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;handbook&#x2F;&quot;&gt;company handbook&lt;&#x2F;a&gt; with over 500 pages of our processes.&lt;&#x2F;p&gt;

&lt;p&gt;For a fast growing company, it is important that new people know the customs and values of the organization. Spending a lot of time to verbally communicate this is time consuming and dilutive, because you are never going to be able to tell person 100 as well as you’ve told the first. However, when you write it down, which is very painful in itself, person 100 will have an even more detailed version than person 1. So it gets better over time.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Then let’s talk about the people you’ve worked with. For startups, connecting with the right people can be a game-changer. One person can provide a connection that changes everything. If you look at people who are not employed at GitLab – which person provided essential additional value and how did you get in touch with this person?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Joining Y Combinator has been essential for us. It opened up lots of doors that would otherwise have been closed. For example, the seed round of investors we have with people like Ashton Kutcher and Michael Arrington. I don’t think they would have even looked at us if it wasn’t for Y Combinator.&lt;&#x2F;p&gt;

&lt;p&gt;Then your board members are just very important. We got lucky with our first board member, Bruce Armstrong, operating partner at Khosla Ventures, who was very thoughtful with us and very hardworking in helping us every step along the way. That felt very empowering and it’s not always the case with venture capitalists, so that was awesome.&lt;&#x2F;p&gt;

&lt;p&gt;Sometimes it’s just reaching out. Like Matt Mullenweg who joined our board. He is the CEO of Automattic, the makers of WordPress. I just sent him an email saying “Hey, can we talk?” If you show you’ve done your homework, like mentioning why you want to talk and reference a blog post or something they tweeted, people are more likely to respond.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;One of the things we do at &lt;a href=&quot;https:&#x2F;&#x2F;www.saas.ceo&#x2F;&quot;&gt;SaaS.CEO&lt;&#x2F;a&gt; is ask our audience beforehand if they have any questions for the CEO who is being interviewed. This time two questions came up. The first is coming from Michael Kamleiter, CEO of Swat.io and Walls.io. He asks &quot;How do you go about positioning towards other players like GitHub, especially when you were still a smaller company?&quot;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;I don’t think we’ve figured it out yet. Where our competition was sometimes more focused on the needs of open source projects, we focused on those large customers and their requirements. For example, our competition has two levels of authorization and we have five, because our customers need more granularity.&lt;&#x2F;p&gt;

&lt;p&gt;Positioning to me is mostly marketing and I think we have lagged in that regard. Actually, the last two days I have been in a workshop to figure out our positioning. What we’re going to do is articulate that GitLab is an end-to-end tool. Where all the other applications are about assembling a toolchain and orchestrating that toolchain, we want to be &quot;toolless.&quot;&lt;&#x2F;p&gt;

&lt;p&gt;If you have a toolchain, you end up having all these handoffs that create delays from working in serial. We want people with GitLab to be able to work in parallel. I think that that will be a big enabler of our future growth. But it’s a really hard thing to determine, to get everybody aligned on, and then to roll it out on all your channels, from product to sales to marketing.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;The second question we received is from Florian Dorfbauer, CEO of Usersnap. His question is: &quot;With the latest investment round, you&#x27;ve also revealed the bigger vision of GitLab: providing a complete DevOps experience. How much time do you spend on strategic vision building and what does the process look like to work on such strategies?&quot;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;I consider myself a Product CEO and spend most of my time on our product. The way I spend time on this is first of all by talking with customers. My call before this was with a potential customer, to answer their questions. It’s great to be able to talk directly with customers.&lt;&#x2F;p&gt;

&lt;p&gt;I also keep an eye on our issue tracker and &lt;a href=&quot;https:&#x2F;&#x2F;news.ycombinator.com&#x2F;&quot;&gt;Hacker News&lt;&#x2F;a&gt;, which are important channels for me. Apart from that I work a lot with our product managers where we try to get the best out of each other.&lt;&#x2F;p&gt;

&lt;p&gt;It’s all driven by what you know about where the market is – what are the trends, what are the analysts saying, what are customers saying, what are users saying. All these things come together and you reflect on it with each other and choose a direction.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;By sharing your experiences, you have given valuable input other to SaaS CEOs out there. Therefore, I want to give you the opportunity to ask something in return. Is there something our listeners can do for you?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;p&gt;I think it would be great that those who read this reach out to you to be interviewed so you will have more content and we can make this a bigger thing. Then when this becomes a famous podcast I can claim to be the first one ever to be interviewed.&lt;&#x2F;p&gt;

&lt;p&gt;Secondly, I would like to take the opportunity to say that GitLab.com is becoming a great product now, so I hope that in 2018 people will give it a shot and try it out.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;strong&gt;Sid, thank so much for sharing your insights. I’m very happy to have had you as our first interviewed CEO and we do hope many of the readers and listeners will follow your request.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;

&lt;h3 id=&quot;about-the-guest-author&quot;&gt;About the guest author&lt;&#x2F;h3&gt;

&lt;p&gt;Vincent is a Dutch serial entrepreneur excited about advanced technology and Software as a Service solutions. While building his company, he noticed how many founders are trying to get in touch with the same people: CEOs who have already walked the path they are going. Facing the same challenge, he founded &lt;a href=&quot;https:&#x2F;&#x2F;www.saas.ceo&#x2F;&quot;&gt;SaaS.CEO&lt;&#x2F;a&gt;, a platform to make successful SaaS founders more accessible. His own company &lt;a href=&quot;http:&#x2F;&#x2F;www.thrive.email&#x2F;&quot;&gt;Thrive for Email&lt;&#x2F;a&gt; is an AI-driven sales automation solution that helps sales reps increase their capacity by automatically entering all data into the CRM.&lt;&#x2F;p&gt;

&lt;p class=&quot;note&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;kRnkqSKZODQ&quot;&gt;Cover image&lt;&#x2F;a&gt; by &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;@federize&quot;&gt;Federico Beccari&lt;&#x2F;a&gt; on Unsplash&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;pick-your-brain-interview-thrive.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>How a fix in Go 1.9 sped up our Gitaly service by 30x</title>
<link href='https://about.gitlab.com/2018/01/23/how-a-fix-in-go-19-sped-up-our-gitaly-service-by-30x/' rel='alternate' />
<id>https://about.gitlab.com/2018/01/23/how-a-fix-in-go-19-sped-up-our-gitaly-service-by-30x/</id>
<published>2018-01-23T00:00:00+00:00</published>
<updated>2018-01-23T00:00:00+00:00</updated>
<author>
<name>Andrew Newdigate</name>
</author>
<content type='html'>&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitaly&quot;&gt;Gitaly&lt;&#x2F;a&gt; is a Git RPC service that we are currently rolling out
across GitLab.com, to replace our legacy NFS-based file-sharing solution. We expect it to be faster, more stable
and the basis for amazing new features in future.&lt;&#x2F;p&gt;

&lt;p&gt;We&#x27;re still in the process of porting Git operations to Gitaly, but the service has been
running in production on GitLab.com for about nine months, and currently peaks at about 1,000
&lt;a href=&quot;https:&#x2F;&#x2F;grpc.io&#x2F;&quot;&gt;gRPC&lt;&#x2F;a&gt; requests per second. We expect the migration effort to be completed
by the beginning of April at which point all Git operations in the GitLab application will
use the service and we&#x27;ll be able to decommission NFS infrastructure.&lt;&#x2F;p&gt;



&lt;h2 id=&quot;worrying-performance-improvements&quot;&gt;Worrying performance improvements&lt;&#x2F;h2&gt;

&lt;p&gt;The first time we realized that something might be wrong was shortly after we&#x27;d finished deploying a new release.&lt;&#x2F;p&gt;

&lt;p&gt;We were monitoring the performance of one of the gRPC endpoints for the Gitaly service and noticed that the
99th percentile performance of the endpoint had dropped from 400ms down to 100ms.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;how-a-fix-in-go-19-sped-up-our-gitaly-service-by-30x&#x2F;graph-01.png&quot; alt=&quot;400ms to 100ms latency drop&quot; class=&quot;shadow&quot; &#x2F;&gt;
&lt;em&gt;Latencies drop from 400ms to 100ms after a deploy, for no good reason&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;This should have been fantastic news, but it wasn&#x27;t. There were no changes that should have led to faster
response times. We hadn&#x27;t optimized anything in that release; we hadn&#x27;t changed the runtime and the new
release was using the same version of Git.&lt;&#x2F;p&gt;

&lt;p&gt;Everything &lt;em&gt;should have&lt;&#x2F;em&gt; been exactly the same.&lt;&#x2F;p&gt;

&lt;p&gt;We started digging into the data a little more and quickly realised that 400ms is a very high latency for
an operation that simply confirms the existence of a &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;book&#x2F;en&#x2F;v2&#x2F;Git-Internals-Git-References&quot;&gt;Git reference&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;How long had it been this way? Well it started about 24 hours after the previous deployment.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;how-a-fix-in-go-19-sped-up-our-gitaly-service-by-30x&#x2F;graph-02.png&quot; alt=&quot;100ms to 400ms latency hike&quot; class=&quot;shadow&quot; &#x2F;&gt;
&lt;em&gt;Latencies rising over a 24 hour period following a deployment, for no good reason&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;When browsing our Prometheus performance data, it quickly became apparent that this pattern was being repeated with each
deployment: things would start fast and gradually slow down. This was occurring across all endpoints. It had been this way for a while.&lt;&#x2F;p&gt;

&lt;p&gt;The first assumption was that there was some sort of resource leak in the application, causing the host to slow
down over time. Unfortunately the data didn&#x27;t back this up. CPU usage of the Gitaly service did increase, but the
hosts still had lots of capacity.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;how-a-fix-in-go-19-sped-up-our-gitaly-service-by-30x&#x2F;graph-03.png&quot; alt=&quot;Gitaly CPU charts&quot; class=&quot;shadow&quot; &#x2F;&gt;
&lt;em&gt;Gitaly CPU increasing with process age, but not enough to explain the problem&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;At this point, we still didn&#x27;t have any good leads as to the cause of the problem, so we decided to further
improve the observability of the application by adding &lt;a href=&quot;https:&#x2F;&#x2F;golang.org&#x2F;pkg&#x2F;net&#x2F;http&#x2F;pprof&#x2F;&quot;&gt;pprof profiling support&lt;&#x2F;a&gt;
and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;google&#x2F;cadvisor&quot;&gt;cAdvisor&lt;&#x2F;a&gt; metrics.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;profiling&quot;&gt;Profiling&lt;&#x2F;h2&gt;

&lt;p&gt;Adding pprof support to a Go process is &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitaly&#x2F;merge_requests&#x2F;442&quot;&gt;very easy&lt;&#x2F;a&gt;.
The process already has a Prometheus listener and we added a pprof handler on the same listener.&lt;&#x2F;p&gt;

&lt;p&gt;Since production teams would need to be able to perform the profiling without our assistance, we
also &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;runbooks&#x2F;blob&#x2F;master&#x2F;howto&#x2F;gitaly-profiling.md&quot;&gt;added a runbook&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;Go&#x27;s pprof support is easy to use and in our testing, we found that the overhead it
added to production workloads was negligible, meaning we could use it in production without concern
about the impact it would have on site performance.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;cadvisor&quot;&gt;cAdvisor&lt;&#x2F;h2&gt;

&lt;p&gt;The Gitaly service spawns Git child processes for many of its endpoints. Unfortunately these Git
child processes don&#x27;t have the same instrumentation as the parent process so it was
difficult to tell if they were contributing to the problem. (Note: we record &lt;a href=&quot;http:&#x2F;&#x2F;man7.org&#x2F;linux&#x2F;man-pages&#x2F;man2&#x2F;getrlimit.2.html&quot;&gt;&lt;code&gt;getrlimit(2)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; metrics for Git processes but cannot observe grandchild processes spawned by Git, which often do much of the heavy lifting)&lt;&#x2F;p&gt;

&lt;p&gt;On GitLab.com, Gitaly is managed through systemd, which will automatically create a cgroup for
each service it manages.&lt;&#x2F;p&gt;

&lt;p&gt;This means that Gitaly and its child processes are contained within a single cgroup, which we
could monitor with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;google&#x2F;cadvisor&quot;&gt;cAdvisor&lt;&#x2F;a&gt;, a Google monitoring tool
which supports cgroups and is compatible with Prometheus.&lt;&#x2F;p&gt;

&lt;p&gt;Although we didn&#x27;t have direct metrics to determine the behavior of the Git processes, we could
infer it using the cgroup metrics and the Gitaly process metrics: the difference between the
two would tell us the resources (CPU, memory, etc) being consumed by the Git child processes.&lt;&#x2F;p&gt;

&lt;p&gt;At our request, the production team &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;infrastructure&#x2F;issues&#x2F;3307&quot;&gt;added cAdvisor to the Gitaly servers&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;Having cAdvisor gives us the ability to know what the Gitaly service, including all its child
processes, is doing.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;how-a-fix-in-go-19-sped-up-our-gitaly-service-by-30x&#x2F;graph-04.png&quot; alt=&quot;cAdvisor graphs for the Gitaly cgroup&quot; class=&quot;shadow&quot; &#x2F;&gt;
&lt;em&gt;cAdvisor graphs of the Gitaly cgroup&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;from-bad-to-worse-much-much-worse&quot;&gt;From bad to worse. Much, much worse…&lt;&#x2F;h2&gt;

&lt;p&gt;In the meantime, &lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitaly&#x2F;issues&#x2F;823&quot;&gt;the situation had got far worse&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;.
 Instead of only seeing gradual latency increases over time, we were now seeing far more serious lockups.&lt;&#x2F;p&gt;

&lt;p&gt;Individual Gitaly server instances would grind to a halt, to the point where all new incoming TCP connections
were not being accepted. This proved to be a problem to using pprof: during the lockup the connection
would time out when attempting to profile the process. Since the reason we added pprof was to observe the
process under duress, that approach was a bust.&lt;&#x2F;p&gt;

&lt;p&gt;Interestingly, during a lock-up, CPU would actually decrease – the system was not overloaded, but actually
 &lt;em&gt;idled&lt;&#x2F;em&gt;. Iops, iowait and CPU would all drop way down.&lt;&#x2F;p&gt;

&lt;p&gt;Eventually, after a few minutes the service would recover and there would be a surge in backlogged
requests. Usually though, as soon as the state was detected, the production team would restart the
service manually.&lt;&#x2F;p&gt;

&lt;p&gt;The team spent a significant amount of time trying to recreate the problem locally, with little success.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;forking-locks&quot;&gt;Forking locks&lt;&#x2F;h2&gt;

&lt;p&gt;Without pprof, we fell back to &lt;a href=&quot;http:&#x2F;&#x2F;pro-tips-dot-com.tumblr.com&#x2F;post&#x2F;47677612115&#x2F;kill-a-hung-go-process-and-print-stack-traces&quot;&gt;SIGABRT thread dumps&lt;&#x2F;a&gt;
of hung processes. Using these, we determined that the process had a large amount of contention around &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitaly&#x2F;issues&#x2F;823#note_50951140&quot;&gt;&lt;code&gt;syscall.ForkLock&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
during the lockups. In one dump, 1,400 goroutines were blocked waiting on &lt;code&gt;ForkLock&lt;&#x2F;code&gt; – most for several minutes.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;code&gt;syscall.ForkLock&lt;&#x2F;code&gt; has &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;golang&#x2F;go&#x2F;blob&#x2F;release-branch.go1.8&#x2F;src&#x2F;syscall&#x2F;exec_unix.go#L17&quot;&gt;the following documentation&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Lock synchronizing creation of new file descriptors with fork.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;

&lt;p&gt;Each Gitaly server instance was &lt;code&gt;fork&#x2F;exec&lt;&#x2F;code&gt;&#x27;ing Git processes about 20 times per second so we seemed to finally have a very promising lead.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;serendipity&quot;&gt;Serendipity&lt;&#x2F;h2&gt;

&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-com&#x2F;www-gitlab-com&#x2F;merge_requests&#x2F;9365#note_54342481&quot;&gt;Researching ForkLock&lt;&#x2F;a&gt; led us to an issue on the Go repository,
opened in 2013, about switching from &lt;code&gt;fork&#x2F;exec&lt;&#x2F;code&gt; to &lt;a href=&quot;man7.org&#x2F;linux&#x2F;man-pages&#x2F;man2&#x2F;clone.2.html&quot;&gt;&lt;code&gt;clone(2)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; with &lt;code&gt;CLONE_VFORK&lt;&#x2F;code&gt; and &lt;code&gt;CLONE_VM&lt;&#x2F;code&gt;
on systems that support it: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;golang&#x2F;go&#x2F;issues&#x2F;5838&quot;&gt;golang&#x2F;go#5838&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;p&gt;The &lt;code&gt;clone(2)&lt;&#x2F;code&gt; syscall with &lt;code&gt;CLONE_VFORK&lt;&#x2F;code&gt; and &lt;code&gt;CLONE_VM&lt;&#x2F;code&gt; is the same as
the &lt;a href=&quot;http:&#x2F;&#x2F;man7.org&#x2F;linux&#x2F;man-pages&#x2F;man3&#x2F;posix_spawn.3.html&quot;&gt;&lt;code&gt;posix_spawn(3)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; c function, but the latter is easier to
refer to, so let&#x27;s use that.&lt;&#x2F;p&gt;

&lt;p&gt;When using &lt;code&gt;fork&lt;&#x2F;code&gt;, the child process will start with a copy of the parent processes&#x27; memory.
Unfortunately this process takes longer the larger the virtual memory footprint the process has.
Even with copy-on-write, it can take several hundred milliseconds in a memory-intensive process.
&lt;code&gt;posix_spawn&lt;&#x2F;code&gt; doesn&#x27;t copy the parent processes&#x27; memory space and has a roughly constant time.&lt;&#x2F;p&gt;

&lt;p&gt;Some good benchmarks of &lt;code&gt;fork&#x2F;exec&lt;&#x2F;code&gt; vs. &lt;code&gt;posix_spawn&lt;&#x2F;code&gt; can be found here: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rtomayko&#x2F;posix-spawn#benchmarks&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;rtomayko&#x2F;posix-spawn#benchmarks&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

&lt;p&gt;This seemed like a possible explanation. Over time, the virtual memory size (VMM) of the Gitaly process would increase. As VMM
increased, each &lt;a href=&quot;http:&#x2F;&#x2F;man7.org&#x2F;linux&#x2F;man-pages&#x2F;man2&#x2F;fork.2.html&quot;&gt;&lt;code&gt;fork(2)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; syscall would take longer. As fork latency increased, &lt;code&gt;syscall.ForkLock&lt;&#x2F;code&gt; contention would increase.
If &lt;code&gt;fork&lt;&#x2F;code&gt; time exceeded the frequency of &lt;code&gt;fork&lt;&#x2F;code&gt; requests, the system could temporarily lock up entirely.&lt;&#x2F;p&gt;

&lt;p&gt;(Interestingly, &lt;a href=&quot;https:&#x2F;&#x2F;golang.org&#x2F;pkg&#x2F;net&#x2F;#TCPListener.Accept&quot;&gt;&lt;code&gt;TCPListener.Accept&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;golang&#x2F;go&#x2F;blob&#x2F;2ea7d3461bb41d0ae12b56ee52d43314bcdb97f9&#x2F;src&#x2F;net&#x2F;sock_cloexec.go#L20&quot;&gt;also interacts&lt;&#x2F;a&gt; with &lt;code&gt;syscall.ForkLock&lt;&#x2F;code&gt;,
although only on older versions of Linux. Could this be the cause of our failure to connect to the pprof listener during a lockup?)&lt;&#x2F;p&gt;

&lt;p&gt;By some incredibly good luck, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;golang&#x2F;go&#x2F;issues&#x2F;5838&quot;&gt;golang&#x2F;go#5838&lt;&#x2F;a&gt;, the switch from &lt;code&gt;fork&lt;&#x2F;code&gt; to &lt;code&gt;posix_spawn&lt;&#x2F;code&gt;, had,
after several years&#x27; delay, recently landed in Go 1.9, just in time for us. Gitaly had been compiled with Go 1.8.
 We quickly built and tested a new binary with Go 1.9 and manually deployed this
on one of our production servers.&lt;&#x2F;p&gt;

&lt;h3 id=&quot;spectacular-results&quot;&gt;Spectacular results&lt;&#x2F;h3&gt;

&lt;p&gt;Here&#x27;s the CPU usage of Gitaly processes across the fleet:&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;how-a-fix-in-go-19-sped-up-our-gitaly-service-by-30x&#x2F;graph-05.png&quot; alt=&quot;CPU after Go 1.9&quot; class=&quot;shadow&quot; &#x2F;&gt;
&lt;em&gt;CPU after recompiling with Go 1.9&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p&gt;Here&#x27;s the 99th percentile latency figures. This chart is using a logarithmic scale, so we&#x27;re talking about two orders of
magnitude faster!&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;how-a-fix-in-go-19-sped-up-our-gitaly-service-by-30x&#x2F;graph-06.png&quot; alt=&quot;30x latency drops with Go 1.9&quot; class=&quot;shadow&quot; &#x2F;&gt;
&lt;em&gt;Endpoint latency after recompiling with Go 1.9 (log scale)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

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

&lt;p&gt;Recompiling with Go 1.9 solved the problem, thanks to the switch to &lt;code&gt;posix_spawn&lt;&#x2F;code&gt;. We learnt several other lessons
in the process too:&lt;&#x2F;p&gt;

&lt;ol&gt;
  &lt;li&gt;Having solid application monitoring in place allowed us to detect this issue, and start investigating it, far
earlier than we otherwise would have been able to.&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;blog.golang.org&#x2F;profiling-go-programs&quot;&gt;pprof&lt;&#x2F;a&gt; can be really helpful, but may not help when a process
has locked up and won&#x27;t accept new connections. pprof is lightweight enough that you should consider adding it to your application &lt;em&gt;before&lt;&#x2F;em&gt; you need it.&lt;&#x2F;li&gt;
  &lt;li&gt;When all else fails, &lt;a href=&quot;http:&#x2F;&#x2F;pro-tips-dot-com.tumblr.com&#x2F;post&#x2F;47677612115&#x2F;kill-a-hung-go-process-and-print-stack-traces&quot;&gt;&lt;code&gt;SIGABRT thread dumps&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; might help.&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;google&#x2F;cadvisor&quot;&gt;&lt;code&gt;cAdvisor&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; is great for monitoring cgroups. Systemd services each run in
their own cgroup, so &lt;code&gt;cAdvisor&lt;&#x2F;code&gt; is an easy way of monitoring a service and all its child processes, together.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;

&lt;p class=&quot;note&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;jJbQBP_yh68?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Photo&lt;&#x2F;a&gt; by Javier García on &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;search&#x2F;photos&#x2F;slow?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;img src=&#x27;https:&#x2F;&#x2F;about.gitlab.com&#x2F;images&#x2F;blogimages&#x2F;how-a-fix-in-go-19-sped-up-our-gitaly-service-by-30x&#x2F;cover.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
<entry>
<title>GitLab Patch Release: 10.3.6</title>
<link href='https://about.gitlab.com/2018/01/23/gitlab-10-dot-3-dot-6-released/' rel='alternate' />
<id>https://about.gitlab.com/2018/01/23/gitlab-10-dot-3-dot-6-released/</id>
<published>2018-01-23T00:00:00+00:00</published>
<updated>2018-01-23T00:00:00+00:00</updated>
<author>
<name>Tiago Botelho</name>
</author>
<content type='html'>&lt;p&gt;Today we are releasing GitLab version 10.3.6.&lt;&#x2F;p&gt;

&lt;p&gt;This version resolves a number of regressions and bugs in
&lt;a href=&quot;&#x2F;2018&#x2F;01&#x2F;02&#x2F;gitlab-10-dot-3-dot-5-released&#x2F;&quot;&gt;this month&#x27;s 10.3.5 release&lt;&#x2F;a&gt; and
prior versions.&lt;&#x2F;p&gt;



&lt;h2 id=&quot;bug-fixes-for-community-and-enterprise-editions&quot;&gt;Bug fixes for Community and Enterprise Editions&lt;&#x2F;h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16537&quot;&gt;Fix Mermaid drawings not loading on some browsers&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16356&quot;&gt;Resolve &quot;Incorrect default merge request title when Jira activated&quot;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16440&quot;&gt;Prevent RevList failing on non UTF8 paths&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16422&quot;&gt;Set target_branch to the ref branch when creating MR from issue&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16397&quot;&gt;Fix Route validation when conflicting permanent redirects exist&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16427&quot;&gt;Fixing request json mime type&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16237&quot;&gt;Fix 500 error when visiting a commit where the blobs do not exist (nil blobs)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16280&quot;&gt;Fix hooks not being set up properly for bare import Rake task&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16244&quot;&gt;Fix custom name in branch creation for issue in Firefox&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16205&quot;&gt;Prevent excessive DB load due to faulty DeleteConflictingRedirectRoutesRange background migration&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16197&quot;&gt;Fixing bug related to wiki last version&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16115&quot;&gt;Resolve &quot;gitlab-rake gitlab:import:repos schedules an import&quot;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16281&quot;&gt;Fix changes dropdown ellipsis working across browsers&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16193&quot;&gt;Resolve &quot;Error 500 trying to view a merge request JSON: undefined method binary? for nil:NilClass&quot;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16243&quot;&gt;Resolve &quot;Branch name omitted due to bad UTF-8 conversion by Gitaly ref handler&quot;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16188&quot;&gt;Do not run ee_compat_check on security branches&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16214&quot;&gt;Avoid leaving a push event empty if payload cannot be created&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16175&quot;&gt;Update prometheus gem to version that publishes +Inf bucket in accordance with Prometheus docs.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16068&quot;&gt;Fixed abuse reports link url&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16123&quot;&gt;Gracefully handle garbled URIs in Markdown&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16106&quot;&gt;Clarify Auto DevOps pipelines&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16019&quot;&gt;Refactor user, project and group docs when changing namespace&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16058&quot;&gt;Add CI YML example for Browser Performance Testing in CE&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;CE&#x2F;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ce&#x2F;merge_requests&#x2F;16001&quot;&gt;Fix shortcut links on help page&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;bug-fixes-for-enterprise-editions&quot;&gt;Bug fixes for Enterprise Editions&lt;&#x2F;h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;EEU:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;3836&quot;&gt;Mention Auto SAST in merge request SAST docs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;3800&quot;&gt;Multiple kubernetes clusters documentation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;3852&quot;&gt;Add Browser Performance Testing docs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4059&quot;&gt;Resolve &quot;Fix Geo::RepositoriesCleanUpWorker to work with hashed storage&quot;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;3870&quot;&gt;Update dashboard image&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;4112&quot;&gt;Fix JS bundle not running on the Cluster update&#x2F;destroy pages&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;3987&quot;&gt;Fix 500 error when visiting a commit where the blobs do not exist (nil blobs)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;3872&quot;&gt;Clarify Auto DevOps pipelines&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;3742&quot;&gt;Replace explicit service configuration with roles&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;3841&quot;&gt;Use &#x27;preload&#x27; in export to CSV&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;EES&#x2F;EEP:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-ee&#x2F;merge_requests&#x2F;3802&quot;&gt;Improve bidirectional mirroring docs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;h2 id=&quot;bug-fixes-for-omnibus-gitlab&quot;&gt;Bug fixes for Omnibus GitLab&lt;&#x2F;h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Omnibus:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;omnibus-gitlab&#x2F;merge_requests&#x2F;2183&quot;&gt;Specify initial tag of QA image for pushing to dockerhub&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;Omnibus:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;omnibus-gitlab&#x2F;merge_requests&#x2F;2185&quot;&gt;Use dash instead of spaces in cache keys and build jobs&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 does not include any new migrations, and should &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;update&#x2F;README.html#upgrading-without-downtime&quot;&gt;not require any
downtime&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;docs.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;&lt;&#x2F;a&gt; file,
which is only used for &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;omnibus&#x2F;update&#x2F;README.html&quot;&gt;updates&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-editions&quot;&gt;Enterprise Editions&lt;&#x2F;h2&gt;

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

&lt;p&gt;Access to GitLab Enterprise Editions is granted by a &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;products&#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>A beginner&#x27;s guide to continuous integration</title>
<link href='https://about.gitlab.com/2018/01/22/a-beginners-guide-to-continuous-integration/' rel='alternate' />
<id>https://about.gitlab.com/2018/01/22/a-beginners-guide-to-continuous-integration/</id>
<published>2018-01-22T00:00:00+00:00</published>
<updated>2018-01-22T00:00:00+00:00</updated>
<author>
<name>Riccardo Padovani</name>
</author>
<content type='html'>&lt;p&gt;At &lt;a href=&quot;https:&#x2F;&#x2F;www.fleetster.net&#x2F;&quot;&gt;fleetster&lt;&#x2F;a&gt; we have our own instance of GitLab and we rely a lot on &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;features&#x2F;gitlab-ci-cd&#x2F;&quot;&gt;GitLab CI&lt;&#x2F;a&gt;. Also our designers and QA guys use (and love) it, thanks to its advanced features.&lt;&#x2F;p&gt;



&lt;p&gt;GitLab CI is a very powerful system of continuous integration, with a lot of different features, and with every new release, new features land. It has very rich &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;README.html#gitlab-continuous-integration-gitlab-ci-cd&quot;&gt;technical documentation&lt;&#x2F;a&gt;, but it lacks a generic introduction for people who want to use it in an existing setup. A designer or a tester doesn’t need to know how to autoscale it with Kubernetes or the difference between an image or a service.&lt;&#x2F;p&gt;

&lt;p&gt;But still, he needs to know what a pipeline is, and how to see a branch deployed to an environment. In this article therefore I will try to cover as many features as possible, highlighting how the end users can enjoy them; in the last months I explained such features to some members of our team, also developers: not everyone knows what continuous integration is or has used Gitlab CI in a previous job.&lt;&#x2F;p&gt;

&lt;p&gt;If you want to know why continuous integration is important I suggest reading &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;2015&#x2F;02&#x2F;03&#x2F;7-reasons-why-you-should-be-using-ci&#x2F;&quot;&gt;this article&lt;&#x2F;a&gt;, while for finding the reasons for using Gitlab CI specifically, I leave the job to &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;features&#x2F;gitlab-ci-cd&#x2F;&quot;&gt;GitLab&lt;&#x2F;a&gt; itself.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;

&lt;p&gt;Every time a developer changes some code he saves his changes in a commit. He can then push that commit to GitLab, so other developers can review the code.&lt;&#x2F;p&gt;

&lt;p&gt;GitLab will also start some work on that commit, if GitLab CI has been configured. This work is executed by a runner. A runner is basically a server (it can be a lot of different things, also your PC, but we can simplify it as a server) that executes instructions listed in the &lt;code&gt;.gitlab-ci.yml&lt;&#x2F;code&gt; file, and reports the result back to GitLab itself, which will show it in his graphical interface.&lt;&#x2F;p&gt;

&lt;p&gt;When a developer has finished implementing a new feature or a bugfix (activity that usual requires multiple commits), they can open a merge request, where other members of the team can comment on the code and on the implementation.&lt;&#x2F;p&gt;

&lt;p&gt;As we will see, designers and testers can also (and really should!) join this process, giving feedback and suggesting improvements, especially thanks to two features of GitLab CI: environments and artifacts.&lt;&#x2F;p&gt;

&lt;h2 id=&quot;pipelines&quot;&gt;Pipelines&lt;&#x2F;h2&gt;

&lt;p&gt;Every commit that is pushed to GitLab generates a pipeline attached to that commit. If multiple commits are pushed together the pipeline will be created for the last one only. A pipeline is a collection of jobs split in different stages.&lt;&#x2F;p&gt;

&lt;p&gt;All the jobs in the same stage run concurrently (if there are enough runners) and the next stage begins only if all the jobs from the previous stage have finished with success.&lt;&#x2F;p&gt;

&lt;p&gt;As soon as a job fails, the entire pipeline fails. There is an exception for this, as we will see below: if a job is marked as manual, then a failure will not make the pipeline fail.&lt;&#x2F;p&gt;

&lt;p&gt;The stages are just a logical division between batches of jobs, where it doesn’t make sense to execute the next job if the previous failed. We can have a &lt;code&gt;build&lt;&#x2F;code&gt; stage, where all the jobs to build the application are executed, and a &lt;code&gt;deploy&lt;&#x2F;code&gt; stage, where the build application is deployed. Doesn’t make much sense to deploy something that failed to build, does it?&lt;&#x2F;p&gt;

&lt;p&gt;Every job shouldn’t have any dependency with any other job in the same stage, while they can expect results by jobs from a previous stage.&lt;&#x2F;p&gt;

&lt;p&gt;Let’s see how GitLab shows information about stages and stages’ status.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;pipeline-overview.png&quot; alt=&quot;Pipeline overview&quot; style=&quot;width: 700px;&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;pipeline-status.png&quot; alt=&quot;Pipeline status&quot; style=&quot;width: 700px;&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;jobs&quot;&gt;Jobs&lt;&#x2F;h2&gt;

&lt;p&gt;A job is a collection of instructions that a runner has to execute. You can see in real time what the output of the job is, so developers can understand why a job fails.&lt;&#x2F;p&gt;

&lt;p&gt;A job can be automatic, so it starts automatically when a commit is pushed, or manual. A manual job has to be triggered by someone manually. This can be useful, for example, to automate a deploy, but still to deploy only when someone manually approves it. There is a way to limit who can run a job, so only trustworthy people can deploy, to continue the example before.&lt;&#x2F;p&gt;

&lt;p&gt;A job can also build artifacts that users can download, like it creates an APK you can download and test on your device; in this way both designers and testers can download an application and test it without having to ask for help to developers.&lt;&#x2F;p&gt;

&lt;p&gt;Other than creating artifacts, a job can deploy an environment, usually reachable by an URL, where users can test the commit.&lt;&#x2F;p&gt;

&lt;p&gt;Job status are the same as stages status: indeed stages inherit theirs status from the jobs.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;running-job.png&quot; alt=&quot;Running job&quot; style=&quot;width: 700px;&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;artifacts&quot;&gt;Artifacts&lt;&#x2F;h2&gt;

&lt;p&gt;As we said, a job can create an artifact that users can download to test. It can be anything, like an application for Windows, an image generated by a PC, or an APK for Android.&lt;&#x2F;p&gt;

&lt;p&gt;So you are a designer, and the merge request has been assigned to you: you need to validate the implementation of the new design!&lt;&#x2F;p&gt;

&lt;p&gt;But how to do that?&lt;&#x2F;p&gt;

&lt;p&gt;You need to open the merge request, and download the artifact, as shown in the figure.&lt;&#x2F;p&gt;

&lt;p&gt;Every pipeline collects all the artifacts from all the jobs, and every job can have multiple artifacts. When you click on the download button, a dropdown will appear where you can select which artifact you want. After the review, you can leave a comment on the MR.&lt;&#x2F;p&gt;

&lt;p&gt;You can also always download the artifacts from pipelines that do not have a merge request open ;-)&lt;&#x2F;p&gt;

&lt;p&gt;I am focusing on merge requests because usually that is where testers, designers, and shareholders in general enter the workflow.&lt;&#x2F;p&gt;

&lt;p&gt;But merge requests are not linked to pipelines: while they integrate nicely with one another, they do not have any relation.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;download-artifacts.png&quot; alt=&quot;Download artifacts&quot; style=&quot;width: 700px;&quot; class=&quot;shadow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;

&lt;h2 id=&quot;environments&quot;&gt;Environments&lt;&#x2F;h2&gt;

&lt;p&gt;In a similar way, a job can deploy something to an external server, so you can reach it through the merge request itself.&lt;&#x2F;p&gt;

&lt;p&gt;As you can see, the environment has a name and a link. Just by clicking the link you to go to a deployed version of your application (of course, if your team has set it up correctly).&lt;&#x2F;p&gt;

&lt;p&gt;You can also click on the name of the environment, because GitLab also has other cool features for environments, like &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;help&#x2F;ci&#x2F;environments.md&quot;&gt;monitoring&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blogimages&#x2F;environment.png&quot; alt=&quot;environment&quot; style=&quot;width: 700px;&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;This was a small introduction to some of the features of GitLab CI: it is very powerful, and using it in the right way allows all the team to use just one tool to go from planning to deploying. A lot of new features are introduced every month, so keep an eye on the &lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;blog&quot;&gt;GitLab blog&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;For setting it up, or for more advanced features, take a look at the &lt;a href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;README.html&quot;&gt;documentation&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;p&gt;In fleetster we use it not only for running tests, but also for having automatic versioning of the software and automatic deploys to testing environments. We have automated other jobs as well (building apps and publishing them on the Play Store and so on).&lt;&#x2F;p&gt;

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

&lt;p&gt;Riccardo is a university student and a part-time developer at &lt;a href=&quot;https:&#x2F;&#x2F;www.fleetster.net&#x2F;&quot;&gt;fleetster&lt;&#x2F;a&gt;. When not busy with university or work, he likes to contribute to open source projects.&lt;&#x2F;p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https:&#x2F;&#x2F;rpadovani.com&#x2F;introduction-gitlab-ci&quot;&gt;An introduction to continuous integration&lt;&#x2F;a&gt; was originally published on rpadovani.com.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;p class=&quot;note&quot;&gt;&lt;em&gt;Cover photo by &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;photos&#x2F;3ym6i13Y9LU?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Mike Tinnion&lt;&#x2F;a&gt; on &lt;a href=&quot;https:&#x2F;&#x2F;unsplash.com&#x2F;&quot;&gt;Unsplash&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;beginners-guide-to-ci.jpg&#x27; class=&#x27;webfeedsFeaturedVisual&#x27; style=&#x27;display: none;&#x27; &#x2F;&gt;</content>
</entry>
</feed>
