<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Brendan O'Leary 👨🏻‍💻</title>
    <description>The latest articles on DEV Community by Brendan O'Leary 👨🏻‍💻 (@olearycrew).</description>
    <link>https://dev.to/olearycrew</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F116110%2F035832f7-b8c3-4b00-93cd-29d0e32efc8a.jpg</url>
      <title>DEV Community: Brendan O'Leary 👨🏻‍💻</title>
      <link>https://dev.to/olearycrew</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/olearycrew"/>
    <language>en</language>
    <item>
      <title>A guide to Git for beginners</title>
      <dc:creator>Brendan O'Leary 👨🏻‍💻</dc:creator>
      <pubDate>Mon, 13 Apr 2020 15:57:46 +0000</pubDate>
      <link>https://dev.to/olearycrew/a-guide-to-git-for-beginners-378p</link>
      <guid>https://dev.to/olearycrew/a-guide-to-git-for-beginners-378p</guid>
      <description>&lt;h2&gt;
  
  
  What is source code management?
&lt;/h2&gt;

&lt;p&gt;Before you start in software engineering it's important to understand the concept of source code management. In its simplest form software is a bunch of text files and if I'm using those by myself it's not a big deal. But when multiple people use multiple files it gets out of hand and you need some way to manage it all. Humans can't necessarily manage all of that easily: If you're working with files A and C and I'm working with C and D, you need a way to bring all the changes we've made together without overriding anything or causing any conflict. A computer can more easily figure that out, and in a nutshell, that's what source code management is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the term Git?
&lt;/h2&gt;

&lt;p&gt;There are several different urban legends about this. Linus Torvalds who wrote it is a pretty gruff person &lt;a href="https://www.newyorker.com/science/elements/after-years-of-abusive-e-mails-the-creator-of-linux-steps-aside"&gt;with some acknowledged sharp edges&lt;/a&gt;. And so the story suggests he actually named it after himself, as in the British slang word, &lt;a href="https://www.merriam-webster.com/dictionary/git"&gt;“git”&lt;/a&gt;. That may be apocryphal. Also, it's a three-letter combo, meaning it's short and didn't conflict with any existing Unix commands. Now people say it stands for “Global Information Tracker” or “GD Idiot Truckload of...” if you're mad at it.&lt;/p&gt;

&lt;h2&gt;
  
  
  But wait. Who is Linus Torvalds?
&lt;/h2&gt;

&lt;p&gt;Linus Torvalds is a Finnish-American software engineer who developed the &lt;a href="https://www.howtogeek.com/howto/31632/what-is-the-linux-kernel-and-what-does-it-do/"&gt;Linux kernel&lt;/a&gt; and then invented Git 15 years ago. Torvalds has been quoted as saying he's more "famous" for Linux but that over time, Git will &lt;a href="https://www.techrepublic.com/article/linus-torvalds-git-proved-i-could-be-more-than-a-one-hit-wonder/"&gt;end up being more important&lt;/a&gt;. Torvalds is also widely seen as the godfather of the open source movement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you explain the rationale behind the cult following of open source?
&lt;/h2&gt;

&lt;p&gt;Torvalds himself has a cult following and open source has been around for a very long time, long before Git was invented. But open source wasn't widely accepted and in some cases, companies were actively hostile to the concept. Torvalds wanted to create a project everyone could contribute to and Git was born (literally developed by Torvalds over a weekend 15 years ago). Git solved a problem that was common across all types of software development and it not only welcomed contributions from users, but it also &lt;em&gt;needed&lt;/em&gt; contributions to grow. The idea of a practical solution everyone could contribute to created a kind of zeitgeist, and today open source is widely embraced as a result.&lt;/p&gt;

&lt;h2&gt;
  
  
  How could I explain Git to my neighbor?
&lt;/h2&gt;

&lt;p&gt;We tend to talk about Git as a tree but I really don't know if that is the best analogy for it. It's a tree in the sense that it makes branches, but then those branches come back together and that doesn't happen in a tree.&lt;/p&gt;

&lt;p&gt;Instead, I'd say Git is like a time machine. The whole history of everything that happened on any branch in alternate timelines is brought back together magically. Nothing is lost or changed and you can look backward and move forward. It's magic.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's the most important thing I should know about Git?
&lt;/h2&gt;

&lt;p&gt;That's easy: You can't break it!&lt;/p&gt;

&lt;p&gt;Because it's a magical time machine you really can't do anything to it that can't be fixed. So I always tell beginners to relax and play around with your copy. No matter how many mistakes you make you can't break it in a way that's not fixable.&lt;/p&gt;

&lt;p&gt;Have no fear.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This was originally published on the &lt;a href="https://about.gitlab.com/blog/2020/04/13/beginner-git-guide/"&gt;GitLab Blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>git</category>
      <category>learning</category>
    </item>
    <item>
      <title>My next move at GitLab</title>
      <dc:creator>Brendan O'Leary 👨🏻‍💻</dc:creator>
      <pubDate>Thu, 12 Mar 2020 12:31:22 +0000</pubDate>
      <link>https://dev.to/olearycrew/my-next-move-at-gitlab-3p9b</link>
      <guid>https://dev.to/olearycrew/my-next-move-at-gitlab-3p9b</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mNQSqJxZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ag0zrxp7eR1s8nLEFBoWk_A.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mNQSqJxZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ag0zrxp7eR1s8nLEFBoWk_A.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m coming up on my third year at GitLab. Or as some people like to put it — I’ve been at GitLab for &lt;a href="https://about.gitlab.com/company/team/"&gt;1,049+ hires&lt;/a&gt;. GitLab has been growing rapidly, and I’ve been lucky enough to be there for &lt;a href="https://about.gitlab.com/blog/2017/10/09/gitlab-raises-20-million-to-complete-devops/"&gt;three&lt;/a&gt; &lt;a href="https://about.gitlab.com/blog/2018/09/19/announcing-100m-series-d-funding/"&gt;separate&lt;/a&gt; &lt;a href="https://about.gitlab.com/blog/2019/09/17/gitlab-series-e-funding/"&gt;funding rounds&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All of that growth has been incredible to watch and be a part of. And even before I worked at GitLab, I was a large proponent of GitLab and the concept of bringing CI and CD right next to the code. Having worked as both an Engineering Manager and a Product Manager in the past, I’ve lived the pain of having a team have to spend more time fixing the tools than actually coding solutions to customer problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Always an Evangelist
&lt;/h3&gt;

&lt;p&gt;Given that background, and previous lives spent wrestling with various DevOps tool chains, I’ve always, always been an evangelist for GitLab and GitLab CI/CD. Ever since I wrote my first pipeline for my side project — &lt;a href="https://listme.chat"&gt;listMe, a Slack app for managing lists&lt;/a&gt; I knew GitLab CI/CD was something special.&lt;/p&gt;

&lt;p&gt;From there, I went on to evangelize GitLab in my role at the time as the director of DevOps at a small federal government contractor. Their environments were vastly different — production was bare metal, the customer’s test environment one virtualization platform, and our DEV environment yet another platform. Bringing GitLab CI/CD to that problem allowed me to control those variables that we could, and eliminate mistakes by reducing complexity.&lt;/p&gt;

&lt;p&gt;In late 2017, I was given the opportunity to get “on the bus” at GitLab. After a friend was recruited to GitLab, they recommended I take a look. “Oh…it’s a company, not just a tool,” I thought. And later that month, on a rainy beach vacation, I had enough time to read and fall in love with the &lt;a href="https://about.gitlab.com/handbook"&gt;GitLab handbook&lt;/a&gt; and &lt;a href="https://about.gitlab.com/handbook/values/"&gt;values&lt;/a&gt;. From that day on, I was an evangelist for GitLab, the company, too. Much to the chagrin of my wife and family that week.&lt;/p&gt;

&lt;h3&gt;
  
  
  At GitLab
&lt;/h3&gt;

&lt;p&gt;At GitLab, I was able to help start our professional services group, run product management for a time for the CI product I loved, and contribute in a lot of other ways. True to our Everyone Can Contribute mission, I was able to pitch into the product itself, various functions, and help onboard lots of new team members.&lt;/p&gt;

&lt;p&gt;That whole time, I have been fortunate enough to be able to talk, write, and tweet about GitLab, the company, and the product to anyone that would listen. So I’m excited that now as we scale, I’ve been given the opportunity to become a Developer Evangelist full time. My new boss, &lt;a href="https://twitter.com/pritianka"&gt;Priyanka Sharma&lt;/a&gt;, is building a fantastic team. We &lt;a href="https://about.gitlab.com/handbook/marketing/technical-evangelism/"&gt;plan to focus&lt;/a&gt; on doubling down on our open source roots, evangelize DevOps and simplified tools chains and ensure that we can make GitLab as amazing for everyone as it was for me in those early days.&lt;/p&gt;

&lt;p&gt;I can’t wait to see where we’ll go next, and I know that I will be a &lt;a href="https://about.gitlab.com/handbook/communication/#top-misused-terms"&gt;GitLabber&lt;/a&gt; for the rest of my life. For now, I’m excited that sharing my passion for DevOps tooling, #AllRemote, and the &lt;a href="https://about.gitlab.com/handbook/values/"&gt;GitLab values&lt;/a&gt; is now officially my full-time job!&lt;/p&gt;

&lt;h3&gt;
  
  
  Follow Along
&lt;/h3&gt;

&lt;p&gt;If you’d like to follow what my team and I are doing — we’re, of course, &lt;a href="https://about.gitlab.com/handbook/values/#public-by-default"&gt;public by default&lt;/a&gt;. I would love it if folks took a look at my &lt;a href="https://gitlab.com/brendan/2020-dev-evangelism"&gt;2020 Technical Evangelism&lt;/a&gt; plan, which outlines at a high level what I plan to focus on this year. You can also check out our &lt;a href="https://gitlab.com/groups/gitlab-com/-/boards/1565342?scope=all&amp;amp;utf8=%E2%9C%93&amp;amp;state=opened&amp;amp;label_name%5B%5D=tech-evangelism"&gt;issue board here&lt;/a&gt; to see all of the tactical things we have in the pipeline. And of course, &lt;a href="https://twitter.com/olearycrew"&gt;follow me on Twitter&lt;/a&gt; to see the day-to-day work it takes for me to realize this dream and evangelize GitLab.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This article was originally published here: &lt;a href="https://boleary.dev/blog/2020-03-11-my-next-step-at-gitlab.html"&gt;https://boleary.dev/blog/2020-03-11-my-next-step-at-gitlab.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>devops</category>
      <category>gitlab</category>
    </item>
    <item>
      <title>CI/CD all the things: PiHole</title>
      <dc:creator>Brendan O'Leary 👨🏻‍💻</dc:creator>
      <pubDate>Fri, 11 Jan 2019 00:01:12 +0000</pubDate>
      <link>https://dev.to/olearycrew/ci-cd-all-the-things-pihole-4023</link>
      <guid>https://dev.to/olearycrew/ci-cd-all-the-things-pihole-4023</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kvjy7qw1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A5kVeCxUk4wY4Ge4g" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kvjy7qw1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A5kVeCxUk4wY4Ge4g" alt=""&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@rawpixel?utm_source=medium&amp;amp;utm_medium=referral"&gt;rawpixel&lt;/a&gt; on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  CI/CD all the things: Pi-hole
&lt;/h3&gt;

&lt;p&gt;I’ve spent some time exploring how to apply the concepts of CI/CD to everyday life. In &lt;a href="https://dev.to/olearycrew/ci-cd-all-the-things-introducing-auto-breakfast-from-gitlab-sort-of-ldn-temp-slug-5187764"&gt;my first post&lt;/a&gt;, I went all in — making breakfast with GitLab CI/CD as the orchestrator. In this post, I’ll tell you about a home project I undertook over the holidays: getting a &lt;a href="https://pi-hole.net/"&gt;Pi-hole&lt;/a&gt; up and running at my house. (mmmm 🥧)&lt;/p&gt;

&lt;p&gt;Pi-hole is a great little &lt;a href="https://github.com/pi-hole"&gt;open source&lt;/a&gt; tool that lets you run your own DNS server on your network and send advertisement and tracking requests to a “black hole” of 0.0.0.0, providing network-level ad blocking…rather than installing ad blockers on every device, browser, and IoT item in the house.&lt;/p&gt;

&lt;p&gt;Pi-hole even ships with a great dashboard and has a number of extension points to customize it. I added an &lt;a href="https://github.com/arevindh/pihole-speedtest/wiki/Installing-Speedtest-Mod"&gt;hourly speed test&lt;/a&gt; — just to keep my ISP honest 😉.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VckF299R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AwwR_IBlOfTguthA00Ha7bQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VckF299R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AwwR_IBlOfTguthA00Ha7bQ.png" alt=""&gt;&lt;/a&gt;PiHole Dashboard with Speedtest plugin&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Pi-hole
&lt;/h3&gt;

&lt;p&gt;Installing Pi-hole is relatively simple, with &lt;a href="https://github.com/pi-hole/pi-hole/#method-1-clone-our-repository-and-run"&gt;straightforward instructions&lt;/a&gt;, and the only thing I had to watch out for was DHCP. Since my router provides Circle from Disney for parental controls, it has to retain the DNS/DHCP server but I could still map its upstream DNS to Pi-hole. This means I lost some of the granularity in the logs as most requests come from my router rather than the individual devices, but once I had it all set up Pi-Hole worked as designed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Source control for Pi-hole
&lt;/h3&gt;

&lt;p&gt;There are a lot of great resources out there for Pi-hole, including things like &lt;a href="https://discourse.pi-hole.net/t/commonly-whitelisted-domains/212"&gt;commonly whitelisted domains&lt;/a&gt; to make sure some general services aren’t negatively impacted by it. There are also many &lt;a href="https://firebog.net/"&gt;additional blacklists&lt;/a&gt; available on the internet, depending on what you’re concerned about. And, since &lt;a href="https://github.com/pi-hole/FTL"&gt;FTL&lt;/a&gt; is extensible, it is even possible to use it as a lightweight local DNS server.&lt;/p&gt;

&lt;p&gt;Because all of those elements are presented in a fashion that says, “Here’s how you can run a command in the terminal,” or “Here’s how you add it in the UI,” my internal “must source control all things” tick was activated…and so I &lt;a href="https://gitlab.com/olearycrew/pihole/"&gt;created a repository on GitLab&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I added a couple of scripts to automate the whitelisting for common and custom domains as well as a file to contain the hosts on my network. But this still meant I had to manually check out the repository on my Raspberry Pi and manually run the scripts. That’s where &lt;a href="https://about.gitlab.com/product/continuous-integration/"&gt;GitLab CI/CD&lt;/a&gt; comes to the rescue! Luckily, it’s available on our free tier, because I was using my &lt;a href="https://gitlab.com/oleary"&gt;personal account&lt;/a&gt; for all of this, &lt;a href="https://about.gitlab.com/handbook/paid-time-off/#a-gitlabbers-guide-to-time-off"&gt;while I was on holiday&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enabling CI/CD to Pi-hole
&lt;/h3&gt;

&lt;p&gt;Now that I had a repository ready to go, I just had two steps until I had access to all the CI/CD goodness my little heart would ever desire.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make my Raspberry Pi a &lt;a href="https://docs.gitlab.com/runner/"&gt;GitLab Runner&lt;/a&gt; so that GitLab.com changes could get into my home network with no holes poked in my firewall.&lt;/li&gt;
&lt;li&gt;Set up a &lt;a href="https://docs.gitlab.com/ee/ci/yaml/"&gt;.gitlab-ci.yml&lt;/a&gt; to run updates when changes are made.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Installing GitLab Runner on my Raspberry Pi
&lt;/h4&gt;

&lt;p&gt;Installing GitLab Runner is easy on any platform that supports Golang, including &lt;a href="https://docs.gitlab.com/runner/install/linux-manually.html"&gt;Linux&lt;/a&gt;, &lt;a href="https://docs.gitlab.com/runner/install/osx.html"&gt;OSX&lt;/a&gt;, &lt;a href="https://docs.gitlab.com/runner/install/windows.html"&gt;Windows&lt;/a&gt;, &lt;a href="https://docs.gitlab.com/runner/install/freebsd.html"&gt;FreeBSD&lt;/a&gt;, &lt;a href="https://docs.gitlab.com/runner/install/kubernetes.html"&gt;Kubernetes&lt;/a&gt; and (soon) even &lt;a href="https://gitlab.com/gitlab-org/gitlab-runner/issues/3263"&gt;z/OS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Raspberry Pi has an ARM chip, so I used the ARM binary to install it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo wget -O /usr/local/bin/gitlab-runner [https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm](https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then I made the gitlab-runner binary executable with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/gitlab-runner
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;After that, I installed it as a service with these commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo gitlab-runner install --user=pi
sudo gitlab-runner start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Once it was installed, &lt;a href="https://docs.gitlab.com/runner/register/"&gt;registering the runner&lt;/a&gt;to be a private runner on my project was easy. I also added a &lt;a href="https://docs.gitlab.com/ee/ci/runners/#using-tags"&gt;tag&lt;/a&gt; of prod to make sure it only ran code I tagged to run on “production” aka actually on my home network. I’m hoping this protects me from someone I like to call “future Brendan” who may or may not have the best memory when it comes to breaking things.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--liXhd5wn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ALOnN2a7R4gh0klcdIcG4cQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--liXhd5wn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ALOnN2a7R4gh0klcdIcG4cQ.png" alt=""&gt;&lt;/a&gt;Registering the GitLab runner&lt;/p&gt;

&lt;p&gt;I chose a &lt;a href="https://docs.gitlab.com/runner/executors/shell.html"&gt;shell&lt;/a&gt; &lt;a href="https://docs.gitlab.com/runner/executors/README.html"&gt;executor&lt;/a&gt; so that it was simple to understand. Basically, the runner would just execute the commands I put in the script: section of my YAML. Just as if I had logged in and ran them myself.&lt;/p&gt;

&lt;h4&gt;
  
  
  Setting up the .gitlab-ci.yml
&lt;/h4&gt;

&lt;p&gt;I had a few thoughts in mind when it came to setting up my pipeline for deployments. Some of the scripts required restarts of the DNS services on the Pi-hole, so I didn’t want them to be running all of the time. To prevent that, I used a number of GitLab CI/CD features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.gitlab.com/ee/ci/yaml/#onlyrefs-and-exceptrefs"&gt;only:refs&lt;/a&gt;: Ensures we only run this on master — so if I’m on a branch trying something out (*shakes fist at future Brendan*) I don’t break anything.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.gitlab.com/ee/ci/yaml/#onlychanges-and-exceptchanges"&gt;only:changes&lt;/a&gt;: This allows me to limit the scope of the run to only the changes needed. For instance, a change to the whitelist won’t trigger an update to the local DNS list and vice versa.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.gitlab.com/ee/ci/yaml/#tags"&gt;tags&lt;/a&gt;: I mentioned this tag before, but this also means that any job I add must have the prod tag before it will run in production (aka the live Pi-hole).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As an example, let’s look at automating the whitelist. I already created a script (&lt;a href="https://gitlab.com/olearycrew/pihole/blob/master/whitelistme.sh"&gt;whitelistme.sh&lt;/a&gt;) that automates it when ran. So getting that to run in GitLab CI/CD is as simple as this script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;whitelist:
  stage: deploy-prod
  script: 
    - echo "Run whitelist.sh"
    - ./whitelistme.sh
  only:
    refs:
      - master
    changes:
      - whitelistme.sh
  tags:
    - prod
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Let’s break down each section of that script:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For the stage, I created my own custom stage called deploy-prod.&lt;/li&gt;
&lt;li&gt;The script is very simple and echoes what it is about to do and runs the script at the root of the checkout with ./whitelistme.sh.&lt;/li&gt;
&lt;li&gt;The only section implements the two controls I was talking about earlier. refs: — master means this will only run on the master branch of the repository. changes: — whitelistme.sh means this will only run on a change to the whitelistme.sh script and not on every change to the repository. This ensures that script only runs when it needs to.&lt;/li&gt;
&lt;li&gt;“Tags” ensures that it runs on a tagged runner — in this case, the Pi-hole at home.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Success! Running my jobs on my Pi-hole in my home network — orchestrated all from GitLab. 😺&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wFeI_kuI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/654/1%2AhIWxVZ3SHPcsk4ApqJRwnQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wFeI_kuI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/654/1%2AhIWxVZ3SHPcsk4ApqJRwnQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  DNS as Code
&lt;/h3&gt;

&lt;p&gt;Since FTL is mostly just dnsmasq with some customizations for Pi-hole, it is relatively easy to customize. In fact, by default, it includes an additional local file (and hostnames for the Pi-hole itself) in /etc/pihole/local.list like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10.0.0.xx pihole
10.0.0.xx pi.hole
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Again, I wanted to make sure this was source controlled — and the dream of source controlled DNS is now a reality for me. The way I implemented it was to:&lt;/p&gt;

&lt;p&gt;Create a &lt;a href="https://gitlab.com/olearycrew/pihole/blob/master/localDNS"&gt;localDNS&lt;/a&gt; file that would contain all of the local DNS entries I wanted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10.0.0.xx pihole
10.0.0.xx pi.hole

10.0.0.1 orbi.local

10.0.0.xx pirack0.local
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then I used GitLab CI/CD to automate replacing the /etc/pihole/local.list file with this one anytime it changed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;local-DNS:
  stage: deploy-prod
  script: 
    - echo "Copy localDNS to /etc/pihole/local.list"
    - sudo cp ./localDNS /etc/pihole/local.list
    - echo "Restart Pi-hole DNS"
    - pihole restartdns
  only:
    refs:
      - master
    changes:
      - localDNS
  tags:
    - prod
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And Voilà! Source controlled and automated DNS-as-code (DaaS (tm) (r) (c))&lt;/p&gt;

&lt;h3&gt;
  
  
  Frequently Asked Questions
&lt;/h3&gt;

&lt;p&gt;Anticipating the questions you’ll have, I’ve prepared a short primer below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Yes, I did bring down the internet in the whole house for about 20 minutes while I was tinkering away. Yes, this was while all my in-laws were here on their phones. Yes, I got a lot of grief for it&lt;/li&gt;
&lt;li&gt;Yes, this will restart DNS as it is running, thus I wanted to only run the jobs as restricted above&lt;/li&gt;
&lt;li&gt;What is this business about pirack0 in the DNS entry?! That will just have to wait for another post 😉&lt;/li&gt;
&lt;/ol&gt;




</description>
      <category>raspberrypi</category>
      <category>gitlab</category>
    </item>
    <item>
      <title>CI/CD All the things: Introducing Auto Breakfast from GitLab (sort of)</title>
      <dc:creator>Brendan O'Leary 👨🏻‍💻</dc:creator>
      <pubDate>Fri, 29 Jun 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/olearycrew/ci-cd-all-the-things-introducing-auto-breakfast-from-gitlab-sort-of-3d93</link>
      <guid>https://dev.to/olearycrew/ci-cd-all-the-things-introducing-auto-breakfast-from-gitlab-sort-of-3d93</guid>
      <description>&lt;p&gt;A big part of &lt;a href="https://about.gitlab.com/culture" rel="noopener noreferrer"&gt;GitLab’s culture&lt;/a&gt; is &lt;a href="https://about.gitlab.com/handbook/communication/#say-thanks" rel="noopener noreferrer"&gt;saying thanks&lt;/a&gt; to one another for doing a great job. That can be anything from helping with a tough technical problem to simply sharing a nice &lt;a href="https://about.gitlab.com/culture/all-remote/#coffee-break-calls" rel="noopener noreferrer"&gt;coffee break call&lt;/a&gt; to break up the work day. One day a Sales team member thanked someone from Customer Success for a great demo of &lt;a href="https://about.gitlab.com/features/gitlab-ci-cd/" rel="noopener noreferrer"&gt;GitLab CI/CD&lt;/a&gt;. The customer commented afterwards, “Okay, what doesn’t GitLab do?”&lt;/p&gt;

&lt;p&gt;Plenty of heart-themed emoji reactions followed. We’ve seen users do some pretty amazing things with GitLab CI/CD, from &lt;a href="https://about.gitlab.com/2017/06/07/continous-integration-ticketmaster/" rel="noopener noreferrer"&gt;ramping up to weekly mobile releases&lt;/a&gt; to &lt;a href="https://about.gitlab.com/2017/11/02/automating-boring-git-operations-gitlab-ci/" rel="noopener noreferrer"&gt;automating boring Git operations&lt;/a&gt;, to &lt;a href="https://about.gitlab.com/2017/11/23/autoscale-ci-runners/" rel="noopener noreferrer"&gt;saving 90 percent on EC2 costs&lt;/a&gt;. However, there was one thing we hadn’t seen. So in addition to this love, the question also garnered a semi-sarcastic answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;It won’t make breakfast for you, unfortunately.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Never one to let a Slack conversation go unnoticed, I replied with one of my favorite phrases:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F466%2F0%2AGRSEFacBCMhZ_19G.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F466%2F0%2AGRSEFacBCMhZ_19G.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have to admit that the fact that my status was &lt;a href="https://github.com/jmhobbs/cultofthepartyparrot.com/issues/55" rel="noopener noreferrer"&gt;:coffee_parrot:&lt;/a&gt; could have been related to my enthusiastic reply…&lt;/p&gt;

&lt;h3&gt;
  
  
  The challenge
&lt;/h3&gt;

&lt;p&gt;At the time I had only a vague idea of how I would accomplish this. Many suggestions about Internet of Things devices followed my comment. And while a toaster with a version of Linux that will never be patched was intriguing, I wanted to do something bigger.&lt;/p&gt;

&lt;p&gt;A few years ago some friends got together and bought me an &lt;a href="https://anovaculinary.com/" rel="noopener noreferrer"&gt;Anova Sous Vide&lt;/a&gt;, knowing that I loved to cook. What they failed to calculate was that having four kids in eight years was counterproductive to learning the time-tested &lt;a href="https://en.wikipedia.org/wiki/Sous-vide" rel="noopener noreferrer"&gt;French cooking method of sous-vide&lt;/a&gt;. As such, the tool has not had a whole lot of use in its time.&lt;/p&gt;

&lt;p&gt;However, at this point I thought of two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I love a new sous-vide egg bite offering from a well-known coffee shop&lt;/li&gt;
&lt;li&gt;The Anova Sous Vide uses &lt;a href="https://en.wikipedia.org/wiki/Bluetooth_Low_Energy" rel="noopener noreferrer"&gt;bluetooth low energy (BLE)&lt;/a&gt; to allow you to control it through an app&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The recipe (culinary)
&lt;/h3&gt;

&lt;p&gt;While I did like the egg bites from a coffee shop that shall remain nameless, I don’t have them all the time. I would give them a 5- &lt;em&gt;star&lt;/em&gt; rating, but they cost a few more &lt;em&gt;bucks&lt;/em&gt; then I’d like to spend 😉 So I found a &lt;a href="https://recipes.anovaculinary.com/recipe/sous-vide-egg-bites-bacon-gruyere" rel="noopener noreferrer"&gt;sous-vide egg bite recipe&lt;/a&gt; on Anova’s website.&lt;/p&gt;

&lt;h3&gt;
  
  
  The recipe (technology)
&lt;/h3&gt;

&lt;p&gt;Once I had the recipe, all I needed was to reverse engineer the BLE connection, figure out how to get that to work from the command line, set up a project and get it integrated with GitLab CI/CD… no big deal. Luckily I found a fantastic project called PyCirculate that had already worked out a lot of the BLE connection issues with the Anova. It made me wonder if someone else had automated breakfast before… but I’ve yet to find them!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AftCztjcrF_GunE8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AftCztjcrF_GunE8n.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that I had both recipes and all the ingredients, it was time to &lt;em&gt;*git*&lt;/em&gt; crackin’… (I can’t tell you how happy I was when I thought of that joke. Did I mention I’m a dad?)&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up the breakfast pipeline
&lt;/h3&gt;

&lt;p&gt;Once I had that project installed and working on my laptop, I uploaded the code to GitLab in the public repository in the &lt;a href="https://gitlab.com/auto-breakfast/eggs/" rel="noopener noreferrer"&gt;auto-breakfast group&lt;/a&gt;. Next, I installed &lt;a href="https://docs.gitlab.com/runner/" rel="noopener noreferrer"&gt;GitLab Runner&lt;/a&gt; on a &lt;a href="https://www.raspberrypi.org/" rel="noopener noreferrer"&gt;RaspberryPi&lt;/a&gt;. I registered the Pi as a &lt;a href="https://docs.gitlab.com/runner/register/" rel="noopener noreferrer"&gt;specific runner&lt;/a&gt; for my project. I used a &lt;a href="https://docs.gitlab.com/ee/ci/runners/README.html#using-tags" rel="noopener noreferrer"&gt;runner tag&lt;/a&gt; so that I could ensure the cooking job only ran on a device with a Bluetooth connection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F431%2F0%2AIh8rZdaElnwaPbBb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F431%2F0%2AIh8rZdaElnwaPbBb.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I run a pipeline on auto-breakfast/eggs it uses the RaspberryPi to execute and thus can create the BLE connection to the Anova. With the click of a button in GitLab, my breakfast pipeline was running. All I had to do was sit back, relax, and let GitLab CI/CD do all the work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AFQGAGuZqLYOQ_yOR.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AFQGAGuZqLYOQ_yOR.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The results
&lt;/h3&gt;

&lt;p&gt;The egg bites were great! I even modified the recipe with some great Kerrygold Irish whiskey cheddar cheese. However, I would say that it did take a little more effort to get things set up. However, now that it’s done, I have a repeatable, single-button way to cook the recipe again (minus the egg cracking and food processing). Just like CI/CD with a .gitlab-ci.yml can help make software build and deployment more reliable and repeatable, it can also make a fantastic breakfast 😎&lt;/p&gt;

&lt;p&gt;Not pictured: A very messy kitchen and a very perplexed wife.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://unsplash.com/photos/I-ykyShydj0?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Photo&lt;/a&gt; by Leti Kugler on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="https://about.gitlab.com/2018/06/29/introducing-auto-breakfast-from-gitlab/" rel="noopener noreferrer"&gt;&lt;em&gt;about.gitlab.com&lt;/em&gt;&lt;/a&gt; &lt;em&gt;on June 29, 2018.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gitlab</category>
    </item>
    <item>
      <title>Using GitLab to project manage home renovation priorities</title>
      <dc:creator>Brendan O'Leary 👨🏻‍💻</dc:creator>
      <pubDate>Thu, 08 Feb 2018 20:35:35 +0000</pubDate>
      <link>https://dev.to/olearycrew/using-gitlab-to-project-manage-home-renovation-priorities-29n0</link>
      <guid>https://dev.to/olearycrew/using-gitlab-to-project-manage-home-renovation-priorities-29n0</guid>
      <description>&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;/p&gt;

&lt;h3&gt;
  
  
  Trying to get organized
&lt;/h3&gt;

&lt;p&gt;I’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’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’s kitchen… &lt;a href="https://about.gitlab.com/culture/remote-only/"&gt;working from home for the win!&lt;/a&gt;). These projects were great, but we needed a way to organize and prioritize larger renovation projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SseBM_Ll--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/768/1%2AfzTZsU2glyj4xclVSNzfOQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SseBM_Ll--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/768/1%2AfzTZsU2glyj4xclVSNzfOQ.png" alt=""&gt;&lt;/a&gt;Clockwise, from left: built-in shelf wall, painted and stained deck, DIY standing desk&lt;/p&gt;

&lt;p&gt;I was a GitLab user for years before I even became a GitLabber. I’ve always hosted my side-project code in GitLab.com since GitLab offers &lt;a href="https://about.gitlab.com/gitlab-com/"&gt;unlimited private repositories&lt;/a&gt; for free. For project management in my “day job” I’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;/p&gt;

&lt;p&gt;In thinking about the other tools I’ve used in the past, they didn’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’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;/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;/p&gt;

&lt;h3&gt;
  
  
  Enter GitLab Issue Boards
&lt;/h3&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="https://about.gitlab.com/features/issueboard/"&gt;GitLab Issue Board&lt;/a&gt; to manage our ever-changing home renovation priorities?&lt;/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="https://docs.gitlab.com/ee/development/ux_guide/"&gt;GitLab UX team&lt;/a&gt;!). With &lt;a href="https://docs.gitlab.com/ee/user/project/labels.html"&gt;labels&lt;/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;/p&gt;

&lt;h3&gt;
  
  
  How the board works
&lt;/h3&gt;

&lt;p&gt;To start, I &lt;a href="https://gitlab.com/groups/new"&gt;created a new group on GitLab.com&lt;/a&gt; to house (pun intended) everything for our family. I made a project in that group called &lt;strong&gt;priorities&lt;/strong&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;/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’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’s page, allowing her to sign up and get access to the project in one step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7F3tlmga--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Am8KRD9BwB85dms2j5e8U-g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7F3tlmga--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Am8KRD9BwB85dms2j5e8U-g.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To get organized, I created a few labels: &lt;strong&gt;P1&lt;/strong&gt; for top priority items, &lt;strong&gt;DIY Possibility&lt;/strong&gt; for those I might be able to tackle on my own, and &lt;strong&gt;Furniture&lt;/strong&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;strong&gt;DIY Possibility&lt;/strong&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;/p&gt;

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

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nb_DTjVV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AlTH7eLelG9cWUa5kM2izUA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nb_DTjVV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AlTH7eLelG9cWUa5kM2izUA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where to go next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now it’s time to execute! One thing we didn’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="https://docs.gitlab.com/ee/workflow/issue_weight.html"&gt;issue weight&lt;/a&gt; to understand how different projects align with budget and time investment to pull off.&lt;/p&gt;

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

&lt;p&gt;This post was originally &lt;a href="https://about.gitlab.com/2018/02/08/using-gitlab-to-manage-house-renovation-priorities/"&gt;published by GitLab&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>agile</category>
    </item>
  </channel>
</rss>
