<?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: Aaron Todd</title>
    <description>The latest articles on DEV Community by Aaron Todd (@ozzyaaron).</description>
    <link>https://dev.to/ozzyaaron</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%2F37943%2F61588e0c-9dc8-4c47-9cf5-81c69ae12053.jpeg</url>
      <title>DEV Community: Aaron Todd</title>
      <link>https://dev.to/ozzyaaron</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ozzyaaron"/>
    <language>en</language>
    <item>
      <title>Setup Search Engines in Chrome as Shortcuts to the Web</title>
      <dc:creator>Aaron Todd</dc:creator>
      <pubDate>Wed, 26 Sep 2018 20:30:50 +0000</pubDate>
      <link>https://dev.to/ozzyaaron/setup-search-engines-in-chrome-as-shortcuts-to-the-web-25p4</link>
      <guid>https://dev.to/ozzyaaron/setup-search-engines-in-chrome-as-shortcuts-to-the-web-25p4</guid>
      <description>&lt;p&gt;I am totally stealing valour from my colleague, Alex - this is a tip he showed me.&lt;/p&gt;

&lt;p&gt;Here is a little tip that our head tester showed me that uses Chrome's autocompletion for search engines as shortcuts to URLs. The caveat is that the URL has a format where you can insert a string that you type into the URL. Basically you need a URL that can have 1 substitution done on it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://your-app.com/users/&amp;lt;id&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;code&gt;https://github.com/repo/pulls/&amp;lt;user&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;code&gt;https://your-prefix-&amp;lt;pr_number&amp;gt;.herokuapp.com/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For instance if you use Heroku's review apps with Github then you might end up with a URL such as &lt;a href="https://your-prefix-1234.herokuapp.com/" rel="noopener noreferrer"&gt;https://your-prefix-1234.herokuapp.com/&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;As a tester he was jumping around a lot of review apps and so setup a search engine such that he could just type the Github PR number.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F68067bjzgajxyhdqqj8w.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F68067bjzgajxyhdqqj8w.png" alt="Heroku Review App Shortcut"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What this allows you to do is just type &lt;code&gt;pr&lt;/code&gt; into the address bar, then press tab, then enter your PR number and press enter. The URL is expanded as explained in the dialog.&lt;/p&gt;

&lt;p&gt;As a developer I tend to want to visit the Heroku Dashboard for a Review App. To do this I setup another search engine: &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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F7dl9l0hac74bn4smpxtx.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F7dl9l0hac74bn4smpxtx.png" alt="Heroku Dashboard Shortcut"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This lets me type &lt;code&gt;hdash&lt;/code&gt;, tab, PR number, enter and I'm in the Heroku Dashboard for that Review App.&lt;/p&gt;

&lt;p&gt;Bob's your uncle!&lt;/p&gt;

&lt;p&gt;I realise this isn't ground breaking and I totally stole it from a colleague (that is unlikely to ever see this - but hello Alex if you do!) but it is a really handy hack. &lt;/p&gt;

</description>
      <category>chrome</category>
      <category>devtips</category>
      <category>tips</category>
    </item>
    <item>
      <title>Configuring Circle CI 2.0 for a Real Rails Application</title>
      <dc:creator>Aaron Todd</dc:creator>
      <pubDate>Wed, 08 Aug 2018 16:46:59 +0000</pubDate>
      <link>https://dev.to/ozzyaaron/configuring-circle-ci-20-for-a-real-rails-application-2n86</link>
      <guid>https://dev.to/ozzyaaron/configuring-circle-ci-20-for-a-real-rails-application-2n86</guid>
      <description>&lt;p&gt;To all you developers looking for a quick guide to getting a real Rails App running on Circle CI, feel free to rip and modify this as needed.&lt;/p&gt;

&lt;p&gt;For others that are looking to find out about some unusual aspects of Circle's new 2.0 infrastructure that we've had to contend with, please read on after this giant code block!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;version: &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="ss"&gt;jobs:
  build:
    parallelism: &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
    &lt;span class="ss"&gt;working_directory: &lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;/path/&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;your&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;
    &lt;span class="ss"&gt;docker:
      &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;image: &lt;/span&gt;&lt;span class="n"&gt;circleci&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;browsers&lt;/span&gt;
        &lt;span class="ss"&gt;environment:
          &lt;/span&gt;&lt;span class="no"&gt;CIRCLE_ARTIFACTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/tmp/&lt;/span&gt;&lt;span class="n"&gt;circleci&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;artifacts&lt;/span&gt;
          &lt;span class="no"&gt;CIRCLE_TEST_REPORTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/tmp/&lt;/span&gt;&lt;span class="n"&gt;circleci&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;
          &lt;span class="no"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt;
          &lt;span class="no"&gt;YARN_VERSION&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.7&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
          &lt;span class="no"&gt;PGHOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;
          &lt;span class="no"&gt;PGUSER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;image: &lt;/span&gt;&lt;span class="n"&gt;circleci&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postgres&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;10.3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;alpine&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ram&lt;/span&gt;
        &lt;span class="ss"&gt;environment:
          &lt;/span&gt;&lt;span class="no"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;
          &lt;span class="no"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;circle&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;test_test&lt;/span&gt;
    &lt;span class="ss"&gt;steps:
      &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;checkout&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;restore_cache:
          name: &lt;/span&gt;&lt;span class="no"&gt;Restore&lt;/span&gt; &lt;span class="no"&gt;Bundler&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;
          &lt;span class="ss"&gt;keys:
            &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="n"&gt;checksum&lt;/span&gt; &lt;span class="s2"&gt;"Gemfile.lock"&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
            &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;run:
          name: &lt;/span&gt;&lt;span class="no"&gt;Install&lt;/span&gt; &lt;span class="no"&gt;NVM&lt;/span&gt;
          &lt;span class="ss"&gt;command: &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
            &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;
            &lt;span class="n"&gt;touch&lt;/span&gt; &lt;span class="vg"&gt;$BASH_ENV&lt;/span&gt;
            &lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="k"&gt;retry&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="k"&gt;retry&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="ss"&gt;:/&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;githubusercontent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;creationix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nvm&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;33.11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sh&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;bash&lt;/span&gt;
            &lt;span class="n"&gt;export&lt;/span&gt; &lt;span class="no"&gt;NVM_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"$HOME/.nvm"&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="s2"&gt;"$NVM_DIR/nvm.sh"&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"$NVM_DIR/nvm.sh"&lt;/span&gt;
            &lt;span class="n"&gt;nvm&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="mf"&gt;10.6&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;

            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export NVM_DIR="$HOME/.nvm"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="vg"&gt;$BASH_ENV&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'[ -s "$NVM_DIR/nvm.sh" ] &amp;amp;&amp;amp; \. "$NVM_DIR/nvm.sh"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="vg"&gt;$BASH_ENV&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'nvm alias default 10.6.0'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="vg"&gt;$BASH_ENV&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;restore_cache:
          name: &lt;/span&gt;&lt;span class="no"&gt;Restore&lt;/span&gt; &lt;span class="no"&gt;Yarn&lt;/span&gt; &lt;span class="no"&gt;Binary&lt;/span&gt;
          &lt;span class="ss"&gt;keys:
            &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;yarn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;YARN_VERSION&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
            &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;yarn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;run:
          name: &lt;/span&gt;&lt;span class="no"&gt;Prepare&lt;/span&gt; &lt;span class="no"&gt;Yarn&lt;/span&gt; &lt;span class="no"&gt;Path&lt;/span&gt;
          &lt;span class="ss"&gt;command: &lt;/span&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$PATH"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="vg"&gt;$BASH_ENV&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;run:
          name: &lt;/span&gt;&lt;span class="no"&gt;Install&lt;/span&gt; &lt;span class="no"&gt;Yarn&lt;/span&gt;
          &lt;span class="ss"&gt;command: &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;/.yarn/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;yarn&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yarn&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"${YARN_VERSION}"&lt;/span&gt; &lt;span class="p"&gt;]];&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
              &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Download and install Yarn."&lt;/span&gt;
              &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Current Yarn at `which yarn`"&lt;/span&gt;
              &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Current yarn version `yarn --version`"&lt;/span&gt;
              &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Current YARN_VERSION `echo $YARN_VERSION`"&lt;/span&gt;
              &lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sS&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="ss"&gt;:/&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;yarnpkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pubkey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gpg&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
              &lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="k"&gt;retry&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="k"&gt;retry&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;L&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="ss"&gt;:/&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;yarnpkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sh&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;bash&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="vg"&gt;$YARN_VERSION&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
              &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"The correct version of Yarn is already installed."&lt;/span&gt;
            &lt;span class="n"&gt;fi&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;save_cache:
          name: &lt;/span&gt;&lt;span class="no"&gt;Cache&lt;/span&gt; &lt;span class="no"&gt;Yarn&lt;/span&gt; &lt;span class="no"&gt;Binary&lt;/span&gt;
          &lt;span class="ss"&gt;key: &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;yarn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;YARN_VERSION&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
          &lt;span class="ss"&gt;paths:
            &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;/.yarn

      - restore_cache:
          name: Restore Yarn Package Cache
          keys:
            - yarn-packages-{{ checksum "yarn.lock" }}

      - run:
          name: Install node packages &amp;amp; build assets
          command: yarn -v &amp;amp;&amp;amp; yarn install &amp;amp;&amp;amp; yarn heroku-postbuild

      - save_cache:
          name: Save Yarn Package Cache
          key: yarn-packages-{{ checksum "yarn.lock" }}
          paths:
            - node_modules/&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;run:
          name: &lt;/span&gt;&lt;span class="no"&gt;APT&lt;/span&gt; &lt;span class="no"&gt;Installs&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;QT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;PDFtk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;psql&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="ss"&gt;command: &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
            &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;
            &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;
            &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;gcc&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;qt5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;libqt5webkit5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;zlib1g&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;
            &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;pdftk&lt;/span&gt;
            &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;postgresql&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;run:
          name: &lt;/span&gt;&lt;span class="no"&gt;Bundle&lt;/span&gt; &lt;span class="no"&gt;Install&lt;/span&gt;
          &lt;span class="ss"&gt;command: &lt;/span&gt;&lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vendor&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="k"&gt;retry&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;without&lt;/span&gt; &lt;span class="n"&gt;development&lt;/span&gt; &lt;span class="n"&gt;database_management&lt;/span&gt;
          &lt;span class="ss"&gt;no_output_timeout: &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;

      &lt;span class="c1"&gt;# Store bundle cache&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;save_cache:
          key: &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="n"&gt;checksum&lt;/span&gt; &lt;span class="s2"&gt;"Gemfile.lock"&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
          &lt;span class="ss"&gt;paths:
            &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;vendor&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bundle&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;run:
          name: &lt;/span&gt;&lt;span class="no"&gt;Wait&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;
          &lt;span class="ss"&gt;command: &lt;/span&gt;&lt;span class="n"&gt;dockerize&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt;&lt;span class="ss"&gt;:/&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5432&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;run:
          name: &lt;/span&gt;&lt;span class="no"&gt;Database&lt;/span&gt; &lt;span class="no"&gt;Setup&lt;/span&gt;
          &lt;span class="ss"&gt;command: &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
            &lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;rake&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="ss"&gt;:create&lt;/span&gt;
            &lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;rake&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="ss"&gt;:structure:load&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;run:
          name: &lt;/span&gt;&lt;span class="no"&gt;Create&lt;/span&gt; &lt;span class="no"&gt;Artifacts&lt;/span&gt; &lt;span class="no"&gt;Directory&lt;/span&gt;
          &lt;span class="ss"&gt;command: &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
            &lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;artifacts&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export CI_ARTIFACTS="tmp/artifacts"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="vg"&gt;$BASH_ENV&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;run: &lt;/span&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;/rspec

      - run:
          name: Run Specs
          command: |
            TESTFILES=$(circleci tests glob "spec/&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="sr"&gt;/*_spec.rb" | circleci tests split --split-by=timings)
            bundle exec rspec --format progress --format RspecJunitFormatter -o ~/&lt;/span&gt;&lt;span class="n"&gt;rspec&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rspec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xml&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;wip&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;TESTFILES&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;store_test_results:
          path: &lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;/rspec

      - store_artifacts:
          path: ~/&lt;/span&gt;&lt;span class="n"&gt;rspec&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;run: &lt;/span&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;/cucumber

      - run:
          name: Run Cukes without Failing
          command: |
            TESTFILES=$(circleci tests glob "features/&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="sr"&gt;/*.feature" | circleci tests split --split-by=timings)
            DONT_FAIL=true bundle exec cucumber --tags 'not @wip' --format rerun --out rerun.txt --format pretty --format json --out ~/&lt;/span&gt;&lt;span class="n"&gt;cucumber&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cucumber&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;TESTFILES&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;run:
          name: &lt;/span&gt;&lt;span class="no"&gt;Run&lt;/span&gt; &lt;span class="no"&gt;Cukes&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="no"&gt;Failed&lt;/span&gt;
          &lt;span class="ss"&gt;command: &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;rerun&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
              &lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;cucumber&lt;/span&gt; &lt;span class="vi"&gt;@rerun&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt&lt;/span&gt;
            &lt;span class="n"&gt;fi&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;store_test_results:
          path: &lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;/cucumber

      - store_artifacts:
          path: ~/&lt;/span&gt;&lt;span class="n"&gt;cucumber&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;store_artifacts:
          path: &lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;artifacts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some odd things you might notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;concatenating output to &lt;code&gt;$BASH_ENV&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;caching yarn's binary folder&lt;/li&gt;
&lt;li&gt;we have to tell Circle to wait &lt;em&gt;a half hour&lt;/em&gt; for a bundle install&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Outside of this a lot of things are pretty standard, including install nvm, building assets, running tests and so on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concatenating to $BASH_ENV
&lt;/h2&gt;

&lt;p&gt;At first you might expect commands under the 2.0 infrastructure to be a series of commands that are run one after another. It appears that they're actually a series of isolated commands where the ENV is reloaded each time. When you output to &lt;code&gt;$BASH_ENV&lt;/code&gt;, you're essentially adding setup that is to be done by each subsequent command.&lt;/p&gt;

&lt;p&gt;For this reason, we export yarn's path prior to checking yarn's version, as well we setup NVM so that for other commands NVM is setup properly. It isn't enough to export inside that command and continue, as subsequent commands will no longer have what you have exported.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caching yarn's Binary Folder
&lt;/h2&gt;

&lt;p&gt;One new issue we ran into was that yarn would quite often fail to install when we used the suggested mechanism of piping the output of a web request to bash. We tried a number of&lt;br&gt;
potential fixes, such as curl's retry, but the final step that truly isolated our tests from a failure of yarn to install was to cache the installed files.&lt;/p&gt;

&lt;p&gt;It appears many people were having this problem under Circle 2.0 but I couldn't find a posted solution but this has worked well for us.&lt;/p&gt;

&lt;p&gt;Interestingly, even though we were installing a new yarn version under Circle's 1.0 infrastructure, we never had this issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Do We Need to Wait 30 Minutes for Bundler?!
&lt;/h2&gt;

&lt;p&gt;I don't know. I had a support ticket open with Circle about this but they had no answer for me. They did tell me that the new images under the 2.0 infrastructure allocate half the memory of the 1.0 images so it could simply be the increase in swapping.&lt;/p&gt;

&lt;p&gt;Locally a fresh installation is done in under a minute, under Circle CI 1.0 it was 2-3 minutes.&lt;/p&gt;

&lt;p&gt;The guidance I was given was to just add that timeout configuration option. There was no other solution.&lt;/p&gt;

&lt;p&gt;The culprit in most cases appeared to be compiling native extensions such as are needed by&lt;br&gt;
capybara-webkit or nokogiri, both of which are virtually ubiquitous libraries when discussing Rails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Notables
&lt;/h2&gt;

&lt;p&gt;You might also notice that we're using an in-memory Postgres instance. This is just a docker image that Circle kindly provides. It makes setup in this system much easier.&lt;/p&gt;

&lt;p&gt;We install some apt packages such as pdftk so that can test PDF creation.&lt;/p&gt;

&lt;p&gt;We install QT so that we can test using capybara-webkit.&lt;/p&gt;

&lt;p&gt;We have a retry on our Cucumber features such that only failed tests will be re-run. These failures show up in the test summary, as you would expect.&lt;/p&gt;

&lt;p&gt;Outside of this our configuration is quite busy, but from what I've seen not entirely unusual. The busyness is just an artifact of Circle's 2.0 infrastructure requiring more configuration and setup by its users than under their 1.0 offering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;One thing that might be apparent to many is the amount of duplicate setup that is done when these tests are run in parallel.&lt;/p&gt;

&lt;p&gt;Circle now offers workflows and a feature that allows you to share data between jobs in those workflows. In the future, this should allow us to have a job to install dependencies and compile assets which can then be distributed to each of the parallel test jobs.&lt;/p&gt;

&lt;p&gt;I attempted to get this going, but at the time the documentation did not match reality and I was told by Circle's support that the method the documentation used to try and achieve something like we wanted did not work. There is a new feature that appeared less documented at the time that might. This is something I'll look at in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In my opinion, Circle 1.0 was actually quite nice as if you had a normal Rails App; very little to no configuration was required. With Circle CI 2.0, it appears that by providing a more open platform, it has made the setup of CI for fairly normal applications significantly harder. In many cases the provided documentation was nowhere even close to what was required and our setup is nothing unusual for most Rails applications I've worked on or consulted to.&lt;/p&gt;

&lt;p&gt;As an aside, we also build our website and an old PHP app on Circle and the same can be said for them. Very easy to setup under 1.0 but quite a bit more difficult under 2.0.&lt;/p&gt;

&lt;p&gt;In the end I'm only writing this article because I hope it helps someone! I don't want this to read too much like a go at Circle as for the most part we're able to offload a lot of work we don't want to do to them - maintaining CI servers, integrating with slack, integrating with Github and so on. I will say this process was a lot harder than getting setup under their previous infrastructure and other CI systems I had used previously. I realise that if you want to increase your customer base in this space your hands are somewhat tied - it still didn't make the experience any nicer as a customer.&lt;/p&gt;

&lt;p&gt;We were able to get our builds running within a day or two, the reason it took so long is mostly due to having to read documentation and understand the new system. Core components such as yarn and nvm required output to &lt;code&gt;$BASH_ENV&lt;/code&gt; which was something I only found whilst trawling discussion forums.&lt;/p&gt;

&lt;p&gt;After this first win it took us a few weeks of bug fixing intermittent issues to get to something we all consider pretty stable. These little fixes are the main things I hope this article can help with.&lt;/p&gt;

&lt;p&gt;I hope this helps someone!&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
