<?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: Justin</title>
    <description>The latest articles on DEV Community by Justin (@jmprobst).</description>
    <link>https://dev.to/jmprobst</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%2F354325%2F7c239698-438a-4879-8094-c67846493568.jpeg</url>
      <title>DEV Community: Justin</title>
      <link>https://dev.to/jmprobst</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jmprobst"/>
    <language>en</language>
    <item>
      <title>Jenkins - Build a Private GitHub Repo</title>
      <dc:creator>Justin</dc:creator>
      <pubDate>Fri, 18 Dec 2020 19:12:46 +0000</pubDate>
      <link>https://dev.to/jmprobst/jenkins-build-a-private-github-repo-5489</link>
      <guid>https://dev.to/jmprobst/jenkins-build-a-private-github-repo-5489</guid>
      <description>&lt;h2&gt;
  
  
  Objective
&lt;/h2&gt;

&lt;p&gt;This guide shows you how to configure an existing Jenkins server to communicate with a private GitHub repo using &lt;strong&gt;GitHub Deploy Keys&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;My intent is to just be quick and to the point with minimal explanations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;This guide assumes you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A GitHub account with a private GitHub repo containing some form of source code or file(s).&lt;/li&gt;
&lt;li&gt;An AWS account containing an EC2 instance running with an installation of Jenkins. &lt;em&gt;See my &lt;a href=""&gt;Jenkins - Setup a Build Environment in AWS&lt;/a&gt; guide if you don't have this&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Basic knowledge of Jenkins.&lt;/li&gt;
&lt;li&gt;Basic knowledge of GitHub.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;I use macOS, but this guide does cater to Linux and Windows as well.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Jenkins - Build a Private GitHub Repo&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a Simple Jenkins Job&lt;/li&gt;
&lt;li&gt;Generating an SSH Key on the Jenkins Server&lt;/li&gt;
&lt;li&gt;Add the SSH Key as a Jenkins Credential&lt;/li&gt;
&lt;li&gt;Add the SSH Key as a GitHub Deploy Key&lt;/li&gt;
&lt;li&gt;Add the Credential to the Jenkins Job&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Jenkins - Build a Private GitHub Repo
&lt;/h2&gt;

&lt;p&gt;Before beginning, make sure your Jenkins EC2 instance is running, log into your Jenkins dashboard, and your GitHub account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a Simple Jenkins Job
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open the &lt;strong&gt;Jenkins dashboard&lt;/strong&gt; and select &lt;strong&gt;New Item&lt;/strong&gt; from the menu on the left.&lt;/li&gt;
&lt;li&gt;Give the item a &lt;strong&gt;name&lt;/strong&gt; (this can be anything you want but it's representing the job itself)&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Freestyle project&lt;/strong&gt; from the list of options and then click &lt;strong&gt;OK&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Once the job configuration view loads, locate the &lt;strong&gt;Source Code Management&lt;/strong&gt; section and tick &lt;strong&gt;Git&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add in the &lt;strong&gt;SSH Clone URL&lt;/strong&gt; of your desired private GitHub repo&lt;/li&gt;
&lt;li&gt; You &lt;strong&gt;should&lt;/strong&gt; see an error appear that reads something like: "Failed to connect to repository...". This is fine for now; it's because we haven't yet set up the SSH keys.&lt;/li&gt;
&lt;li&gt;Scroll down to the &lt;strong&gt;Build&lt;/strong&gt; section, click &lt;strong&gt;Add build step&lt;/strong&gt; and then select *&lt;em&gt;Execute shell&lt;/em&gt; from the list.&lt;/li&gt;
&lt;li&gt;In the text area that appears, enter: &lt;code&gt;echo "Hello, world!"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Scroll to the bottom and click &lt;strong&gt;Save&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You'll now be brought to your job overview; click &lt;strong&gt;Build Now&lt;/strong&gt; from the left menu to trigger a build&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This should immediately fail&lt;/strong&gt;, but that's intended at this point. Click the &lt;strong&gt;red dot next to the build number&lt;/strong&gt; to view the console output.&lt;/li&gt;
&lt;li&gt;Looking into the console output, you should see references relating to: "Permission denied" or "Could not read from remote repository" - this is what we are aiming to solve.&lt;/li&gt;
&lt;li&gt;Return to the &lt;strong&gt;Jenkins dashboard&lt;/strong&gt; by clicking the &lt;strong&gt;Dashboard&lt;/strong&gt; breadcrumb at the top and then continue onto the next section.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Generating an SSH Key on the Jenkins Server
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open a terminal and SSH into your EC2 Jenkins server: &lt;code&gt;ssh -i /path/to/&amp;lt;your_key_pair.pem&amp;gt; ec2-user@&amp;lt;your_public_dns&amp;gt;&lt;/code&gt; (replacing the &lt;code&gt;&amp;lt;angles&amp;gt;&lt;/code&gt; with your info)&lt;/li&gt;
&lt;li&gt;Sudo to the jenkins user: &lt;code&gt;sudo su -s /bin/bash jenkins&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This guide assumes you are using Linux or macOS, but if you are using Windows, you can reference the AWS guide for &lt;br&gt;
&lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html"&gt;Connecting to your Linux instance from Windows using PuTTY&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Generate an SSH key: &lt;code&gt;ssh-keygen&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Accept the defaults from the prompts and leave the password blank.&lt;/li&gt;
&lt;li&gt;Leave the terminal open and continue onto the next section.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Add the SSH Key as a Jenkins Credential
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;From the &lt;strong&gt;Jenkins dashboard&lt;/strong&gt; select &lt;strong&gt;Manage Jenkins&lt;/strong&gt; from the menu on the left.&lt;/li&gt;
&lt;li&gt;Under the &lt;strong&gt;Security&lt;/strong&gt; section, select &lt;strong&gt;Manage Credentials&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the table labeled &lt;strong&gt;Stores scoped to Jenkins&lt;/strong&gt;, click the &lt;strong&gt;Jenkins&lt;/strong&gt; store.&lt;/li&gt;
&lt;li&gt;In the table labeled &lt;strong&gt;System&lt;/strong&gt;, click the &lt;strong&gt;Global credentials&lt;/strong&gt; domain.&lt;/li&gt;
&lt;li&gt;From the menu on the left, click &lt;strong&gt;Add Credentials&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the form that appears, apply the following:

&lt;ul&gt;
&lt;li&gt;Kind: SSH Username with private key&lt;/li&gt;
&lt;li&gt;Scope: Global&lt;/li&gt;
&lt;li&gt;ID: (blank)&lt;/li&gt;
&lt;li&gt;Description: (blank)&lt;/li&gt;
&lt;li&gt;Username: gh-deploy&lt;/li&gt;
&lt;li&gt;Private Key: tick &lt;strong&gt;Enter Directly&lt;/strong&gt; and then click &lt;strong&gt;Add&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Back in your Jenkins terminal session, copy the &lt;strong&gt;private key&lt;/strong&gt; to your clipboard: &lt;code&gt;cat ~/.ssh/id_rsa&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Paste this key into the form &lt;strong&gt;making sure not to include any additional preceding/trailing spaces&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Passphrase: (blank)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;We'll apply this credential to your new job in later steps. &lt;/li&gt;
&lt;li&gt;Keep your terminal session open and continue onto the next section.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Add the SSH Key as a GitHub Deploy Key
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open GitHub and select the repo you specified in your job configuration&lt;/li&gt;
&lt;li&gt;From within the repo view, select the &lt;strong&gt;Settings&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;From the menu on the left, select &lt;strong&gt;Deploy keys&lt;/strong&gt; and then click the button on the right that says &lt;strong&gt;Add deploy key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Give the deploy key a &lt;strong&gt;Title&lt;/strong&gt; (makes sense to match it with the name given to the jenkins credential: &lt;code&gt;gh-deploy&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Back in your Jenkins terminal session, copy the &lt;strong&gt;public key&lt;/strong&gt; to your clipboard: &lt;code&gt;cat ~/.ssh/id_rsa.pub&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Paste this key into the form &lt;strong&gt;making sure not to include any additional preceding/trailing spaces&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Leave &lt;strong&gt;Allow write access&lt;/strong&gt; unchecked&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add Key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The SSH key is now attached to this specific GitHub repo and is being used as a &lt;strong&gt;Deploy Key&lt;/strong&gt;. For more info on Deploy Keys, checkout the &lt;a href="https://docs.github.com/en/free-pro-team@latest/developers/overview/managing-deploy-keys#deploy-keys"&gt;GitHub documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Add the Credential to the Jenkins Job
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Return to the &lt;strong&gt;Jenkins dashboard&lt;/strong&gt; and select your new job that we created in the first section.&lt;/li&gt;
&lt;li&gt;From the job overview; click &lt;strong&gt;Configure&lt;/strong&gt; from the left menu&lt;/li&gt;
&lt;li&gt;Scroll to the &lt;strong&gt;Source Code Management&lt;/strong&gt; section and select your new credential from the &lt;strong&gt;Credentials&lt;/strong&gt; select list&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You should now see the errors resolve&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Scroll to the bottom and click &lt;strong&gt;Save&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You'll now be brought to your job overview; click &lt;strong&gt;Build Now&lt;/strong&gt; from the left menu to trigger a build&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The job should now succeed&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;blue dot next to the build number&lt;/strong&gt; to view the console output.&lt;/li&gt;
&lt;li&gt;Looking into the console output, you should see the &lt;code&gt;Hello, world!&lt;/code&gt; from the shell command we added and a status of &lt;code&gt;Finished: SUCCESS&lt;/code&gt; - the job is now pulling from the private GitHub Repo!&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Per usual, there are multiple ways that this connection can be configured. I've just shown one here. In a team setting, you might encounter a setup where Jenkins has its own GitHub account with SSH keys configured much like you'd do for yourself. That user can then be added as a collaborator on any given repo and will have access to it. Check out &lt;a href="https://medium.com/facademy/setup-jenkins-for-private-repository-9060f54eeac9"&gt;this guide&lt;/a&gt; if you're interested in that.&lt;/p&gt;

&lt;p&gt;But from here, you can work on configuring your particular build for your project. In this example, I showed a &lt;strong&gt;Freestyle project&lt;/strong&gt;, but I really recommend using &lt;strong&gt;Pipeline projects&lt;/strong&gt; where the build specifics live with the source code in a &lt;code&gt;Jenkinsfile&lt;/code&gt;. Check out &lt;a href="https://www.jenkins.io/doc/book/pipeline/jenkinsfile/"&gt;Using a Jenkinsfile&lt;/a&gt; from the official Jenkins documentation to get started.&lt;/p&gt;

&lt;p&gt;I'm continuing to work on new content showcasing my own Jenkins pipeline, so I'll make sure to add a reference here as it's completed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=HTlAssPBKBs"&gt;https://www.youtube.com/watch?v=HTlAssPBKBs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/free-pro-team@latest/developers/overview/managing-deploy-keys"&gt;https://docs.github.com/en/free-pro-team@latest/developers/overview/managing-deploy-keys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@ryanquintal?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Ryan Quintal&lt;/a&gt; on &lt;a href="https://unsplash.com/@ryanquintal?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>jenkins</category>
      <category>github</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Jenkins - Setup a Build Environment in AWS</title>
      <dc:creator>Justin</dc:creator>
      <pubDate>Fri, 18 Dec 2020 19:08:55 +0000</pubDate>
      <link>https://dev.to/jmprobst/jenkins-setup-a-build-environment-in-aws-16k9</link>
      <guid>https://dev.to/jmprobst/jenkins-setup-a-build-environment-in-aws-16k9</guid>
      <description>&lt;h2&gt;
  
  
  Objective
&lt;/h2&gt;

&lt;p&gt;This guide is simply an updated regurgitation of the AWS guide: &lt;a href="https://aws.amazon.com/getting-started/hands-on/setup-jenkins-build-server/"&gt;Set Up a Jenkins Build Server&lt;/a&gt;. I mainly wanted to have this for my own reference, but I hope it can help someone else!&lt;/p&gt;

&lt;p&gt;My intent is to just be quick and to the point with minimal explanations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;This guide assumes you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic knowledge of AWS, an AWS account and familiarity with the AWS Console and the EC2 service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;All resources used are Free Tier eligible.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I use macOS, but this guide does cater to Linux and Windows as well.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Setting up a Jenkins Environment in AWS&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a Security Group&lt;/li&gt;
&lt;li&gt;Creating an EC2 Instance&lt;/li&gt;
&lt;li&gt;Installing Packages on your EC2 Instance&lt;/li&gt;
&lt;li&gt;Configuring Jenkins for the First Time&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting up a Jenkins Environment in AWS
&lt;/h2&gt;

&lt;p&gt;Before beginning, log into the AWS console and verify that you are using the region that is closest to you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a Security Group
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;From the AWS console search for and select the &lt;strong&gt;EC2 service&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;From the left menu, select &lt;strong&gt;Security Groups&lt;/strong&gt; and then click &lt;strong&gt;Create Security Group&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Give the Security Group a &lt;strong&gt;name&lt;/strong&gt; (this can be anything you want but usually reflects the underlying permissions: &lt;code&gt;WebServerSecurity&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Add a &lt;strong&gt;description&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;your VPC&lt;/strong&gt; from the list (you can accept the default if you don't have a specific VPC you're targeting)&lt;/li&gt;
&lt;li&gt;On the Inbound tab, click &lt;strong&gt;Add Rule&lt;/strong&gt; and add the following rules:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Port Range&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Custom (YOUR IPv4)/32&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;0.0.0.0/0, ::/0&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom TCP Rule&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;8080&lt;/td&gt;
&lt;td&gt;0.0.0.0/0, ::/0&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Verify that your security group appears in the list and continue on to the next section.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Creating an EC2 Instance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;From the left menu in the EC2 service, select &lt;strong&gt;Instances&lt;/strong&gt; and then click &lt;strong&gt;Launch Instance&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;Choose an Amazon Machine Image&lt;/strong&gt; page, select &lt;strong&gt;Free tier only&lt;/strong&gt; and then select the &lt;strong&gt;Amazon Linux AMI 2 (HVM)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;Choose an Instance Type&lt;/strong&gt; page, select the &lt;code&gt;t2.micro&lt;/code&gt; instance and click &lt;strong&gt;Next: Configure Instance Details&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;Configure Instance Details&lt;/strong&gt; page, complete the items below (the rest can be left as the default):

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Network&lt;/strong&gt; - select your VPC (same as the previous section).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subnet&lt;/strong&gt; - No preference .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-assign Public IP&lt;/strong&gt; - Enable.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Review and Launch&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;Review Instance Launch&lt;/strong&gt; page click &lt;strong&gt;Edit security groups&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;Configure Security Group&lt;/strong&gt; page:

&lt;ul&gt;
&lt;li&gt;Tick &lt;strong&gt;Select an existing security group&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose the security group that you created in the previous section (&lt;code&gt;WebServerSecurity&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Review and Launch&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;On the &lt;strong&gt;Review Instance Launch&lt;/strong&gt; page, click &lt;strong&gt;Launch&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;When prompted to &lt;strong&gt;Select an existing key pair or create a new key pair&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;Create a new key pair&lt;/strong&gt; and then give your key a name (this can be anything you want but usually reflects the use case: &lt;code&gt;JenkinsSSH&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Download Key Pair&lt;/strong&gt; and save it to a location that you can easily access.&lt;/li&gt;
&lt;li&gt;With the key pair saved, check the &lt;strong&gt;I acknowledge&lt;/strong&gt; and then click &lt;strong&gt;Launch Instances&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;Launch Status&lt;/strong&gt; page, click &lt;strong&gt;View Instances&lt;/strong&gt; to review the status of the instance you've just launched. &lt;/li&gt;
&lt;li&gt;Once the &lt;strong&gt;Instance State&lt;/strong&gt; is &lt;strong&gt;green&lt;/strong&gt; and &lt;strong&gt;running&lt;/strong&gt; and the &lt;strong&gt;Status Checks&lt;/strong&gt; shows &lt;strong&gt;2/2 checks&lt;/strong&gt;, it is ready for use. (This may take a few minutes).&lt;/li&gt;
&lt;li&gt;Once these statuses update, continue onto the next section.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installing Packages on your EC2 Instance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;From the &lt;strong&gt;Instances&lt;/strong&gt; view in the &lt;strong&gt;EC2 service&lt;/strong&gt;, select your instance and copy the &lt;strong&gt;Public IPv4 DNS&lt;/strong&gt; which should be located under the &lt;strong&gt;Details&lt;/strong&gt; tab (In the older UI this field is called Public DNS and is located under the Description tab).&lt;/li&gt;
&lt;li&gt;Open a terminal and SSH into your EC2 instance: &lt;code&gt;ssh -i /path/to/&amp;lt;your_key_pair.pem&amp;gt; ec2-user@&amp;lt;your_public_dns&amp;gt;&lt;/code&gt; (replacing the &lt;code&gt;&amp;lt;angles&amp;gt;&lt;/code&gt; with your info)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This guide assumes you are using Linux or macOS, but if you are using Windows, you can reference the AWS guide for &lt;br&gt;
&lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html"&gt;Connecting to your Linux instance from Windows using PuTTY&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Type &lt;code&gt;yes&lt;/code&gt; if prompted: "Are you sure you want to continue connecting?"&lt;/li&gt;
&lt;li&gt;Once you're logged in, enter: 

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sudo yum update -y&lt;/code&gt; to update your instance with the latest software packages.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo yum install java-1.8.0 -y&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo yum install git -y&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo&lt;/code&gt; to add the Jenkins repo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key&lt;/code&gt; to import a key file from Jenkins-CI enabling the installation.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo yum install jenkins -y&lt;/code&gt; to finally install the package&lt;/li&gt;
&lt;li&gt;Once the installation completes, start the Jenkins service with &lt;code&gt;sudo service jenkins start&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Verify the service started with an &lt;code&gt;OK&lt;/code&gt; and continue on to the next section.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configuring Jenkins for the First Time
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;With the Jenkins service running on your EC2 instance, &lt;strong&gt;open a browser and navigate to&lt;/strong&gt; &lt;code&gt;http://&amp;lt;your_public_dns&amp;gt;:8080&lt;/code&gt; &lt;strong&gt;replacing the &lt;code&gt;&amp;lt;angles&amp;gt;&lt;/code&gt; with your info&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;Unlock Jenkins&lt;/strong&gt; page, enter the following in your SSH session to find the administrator password: &lt;code&gt;sudo cat /var/lib/jenkins/secrets/initialAdminPassword&lt;/code&gt;. Copy and enter the password into the prompt and click &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;Customize Jenkins&lt;/strong&gt; page, click &lt;strong&gt;Install suggested plugins&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Once the installation completes, complete the form to create a secondary user that you will use in the future to access this Jenkins instance. Click &lt;strong&gt;Save Credentials&lt;/strong&gt; and then click &lt;strong&gt;Start Using Jenkins&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Verify that you can now see the Jenkins Dashboard and continue on to the next section. &lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Your Jenkins instance is now ready for you to explore and use. If you're new to Jenkins, try &lt;a href="https://www.jenkins.io/doc/pipeline/tour/hello-world/"&gt;Creating your first Pipeline&lt;/a&gt; from the official Jenkins documentation.&lt;/p&gt;

&lt;p&gt;If you're familiar with Jenkins, try &lt;a href=""&gt;Jenkins - Build a Private GitHub Repo&lt;/a&gt; where I show you how to configure a build to pull from a private GitHub repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://d1.awsstatic.com/Projects/P5505030/aws-project_Jenkins-build-server.pdf"&gt;https://d1.awsstatic.com/Projects/P5505030/aws-project_Jenkins-build-server.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@ryanquintal?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Ryan Quintal&lt;/a&gt; on &lt;a href="https://unsplash.com/@ryanquintal?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>jenkins</category>
      <category>aws</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cypress and Angular in a Jenkins Pipeline via Docker</title>
      <dc:creator>Justin</dc:creator>
      <pubDate>Wed, 25 Mar 2020 21:51:25 +0000</pubDate>
      <link>https://dev.to/jmprobst/cypress-with-angular-in-a-jenkins-pipeline-via-docker-1718</link>
      <guid>https://dev.to/jmprobst/cypress-with-angular-in-a-jenkins-pipeline-via-docker-1718</guid>
      <description>&lt;h3&gt;
  
  
  What's the objective?
&lt;/h3&gt;

&lt;p&gt;In this post I'm going to show you how to run Cypress in a Jenkins pipeline (via Docker) to test an Angular application. &lt;/p&gt;

&lt;p&gt;The main focus of this tutorial is not on these individual technologies. Instead, it's how to pull them all together to give you an example of how continuous integration could look for your project.&lt;/p&gt;




&lt;h3&gt;
  
  
  What's needed before starting?
&lt;/h3&gt;

&lt;p&gt;This tutorial assumes that you have...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;An Angular application (built with the CLI) with Cypress installed and at least one test written.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docker installed &amp;amp; configured on your machine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Experience working with these technologies before&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This example was developed using macOS&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Jenkins Initial Setup, Startup and Configuration
&lt;/h3&gt;

&lt;p&gt;Start by creating some volumes for your Jenkins Docker container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# from the terminal&lt;/span&gt;
docker volume create jenkins-data 
docker volume create npm-cache
docker volume create cypress-cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, use the &lt;code&gt;docker run&lt;/code&gt; command to pull down the Jenkins Docker image, configure the volumes you've created and run the container serving the Jenkins app on localhost:8080:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# from the terminal&lt;/span&gt;
docker run &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; jenkins-tut &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="nt"&gt;--ipc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-v&lt;/span&gt; jenkins-data:/var/jenkins_home &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-v&lt;/span&gt; npm-cache:/root/.npm &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-v&lt;/span&gt; cypress-cache:/root/.cache &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-v&lt;/span&gt; /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once that completes, open a browser and navigate to: &lt;code&gt;http://localhost:8080&lt;/code&gt; and wait until you see the 'Unlock Jenkins' page appear.&lt;/p&gt;

&lt;p&gt;This page should prompt you for an administrator password. To retrieve it, peek at the Docker logs for the jenkins-tut container you have running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# from the terminal&lt;/span&gt;
docker logs jenkins-tut
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The password should appear in the log under the 'Jenkins initial setup is required...' statement. It's a long alphanumeric string - you can't miss it! It looks like this: &lt;code&gt;2f064d3663814887964b682940572567&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Copy and paste that puppy in and select 'Continue'!&lt;/p&gt;

&lt;p&gt;After you make it past the 'Unlock Jenkins' page, you will be prompted to create a user and login for returning sessions. Create your desired user and continue on.&lt;/p&gt;

&lt;p&gt;Next, you'll be prompted with the 'Customize Jenkins' page. Select 'Install Suggested Plugins' and continue on.&lt;/p&gt;

&lt;p&gt;You should now see the Jenkins Dashboard!&lt;/p&gt;




&lt;h3&gt;
  
  
  Prepping Angular/Cypress for Deployment
&lt;/h3&gt;

&lt;p&gt;Now hop over to your Angular project (that has Cypress installed and configured with at least one running test) and wire up the build process.&lt;/p&gt;

&lt;p&gt;First, we need to install 2 packages that will allow Angular and Cypress to run together on the Jenkins node.&lt;/p&gt;

&lt;p&gt;Inside the root directory of your Angular project, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# from the terminal&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;angular-http-server &lt;span class="nt"&gt;--save-dev&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;start-server-and-test &lt;span class="nt"&gt;--save-dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;angular-http-server&lt;/code&gt; allows the built Angular code (in /dist) to be served on the Jenkins node during the Pipeline. We want it running so that Cypress can call it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;start-server-and-test&lt;/code&gt; enforces a sequential start up between the Angular app and the Cypress tests. This prevents the issue of Cypress trying to call the app before it's running.&lt;/p&gt;

&lt;p&gt;Next we'll need to add some scripts to the &lt;code&gt;package.json&lt;/code&gt; file. These scripts will make use of the new packages and orchestrate the startup of the Angular app and the Cypress test suite.&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cy:run"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cypress run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cy:verify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cypress verify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ci:start-ng"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"angular-http-server --path ./dist/YOUR_APP_NAME -p 4200"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ci:cy-run"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"start-server-and-test ci:start-ng http://localhost:4200 cy:run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;If you're using Angular 9&lt;/strong&gt; you may want to add this line as well to the &lt;code&gt;package.json&lt;/code&gt; scripts section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Angular&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;only&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postinstall"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works with v9's Ivy view engine and will speed up compilation time when running &lt;code&gt;ng build&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lastly, well create a &lt;code&gt;Jenkinsfile&lt;/code&gt; at the root of the project that Jenkins will read from and define some stages for the build to go through.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;Jenkinsfile&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pipeline {
    agent {
        docker {
            image 'cypress/base:12.16.1' 
            args '-p 3000:3000' 
        }
    }
    stages {
        stage('Install Dependencies') { 
            steps {
                sh 'npm ci'
                sh 'npm run cy:verify'
            }
        }
        stage('Build') { 
            steps {
                sh 'npm run build'
            }
        }
        stage('Test') { 
            steps {
                sh 'npm run ci:cy-run'
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;agent&lt;/code&gt; section will allow our Jenkins container to pull in a Cypress Docker image (with Node 12.16.1) for the duration of the build. The steps that follow will actually be run in that environment.&lt;/p&gt;

&lt;p&gt;We also add in 3 steps that will install the projects dependencies, verify a successful Cypress installation, build the Angular project and then run the compiled Angular code with Cypress using the sequential start provided by the &lt;code&gt;angular-http-server&lt;/code&gt; and &lt;code&gt;start-server-and-test&lt;/code&gt; packages.&lt;/p&gt;

&lt;p&gt;With all that added, &lt;strong&gt;save and commit your changes&lt;/strong&gt;!&lt;/p&gt;




&lt;h3&gt;
  
  
  Create the Jenkins Pipeline Project
&lt;/h3&gt;

&lt;p&gt;Now head back to your Jenkins instance...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;From the dashboard view, click 'Create New Jobs' in the middle or 'New Item' at the top of the left menu.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter a name for your item.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select 'Pipeline' as the type and click 'OK' at the bottom of the page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add an &lt;strong&gt;optional&lt;/strong&gt; description for your pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the 'pipeline' tab at the top of the page to bring the 'pipeline' section into view.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the 'Definition' field, select: 'Pipeline script from SCM'&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the 'SCM' field, select: 'Git'&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the 'Repository URL' field, enter the path to your project &lt;strong&gt;on your local system&lt;/strong&gt; translated to the /home directory of the Jenkins container. For example, if your project is at &lt;code&gt;/Users/YOUR_NAME/Development/YOUR_PROJECT&lt;/code&gt; then you would enter &lt;code&gt;/home/Development/YOUR_PROJECT&lt;/code&gt;. Jenkins will perform some validation against your entry to let you know if it can reach the project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lastly, 'Save' your configuration!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Run the Build!
&lt;/h3&gt;

&lt;p&gt;With your new pipeline created, it's time to run a build!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From the Jenkins dashboard view&lt;/strong&gt;, you should see your new pipeline listed. Select the project name and then in the details view select 'Build Now'.&lt;/p&gt;

&lt;p&gt;Once you've started the build, you should see a new entry in the 'Build History' menu to the left. If you click on the flashing dot next to the build number, you can view the log of the build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify success and celebrate!&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;This tutorial came from a collection of resources. I encourage you to further explore these technologies and improve upon this process!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jenkins.io/doc/tutorials/build-a-node-js-and-react-app-with-npm/"&gt;https://jenkins.io/doc/tutorials/build-a-node-js-and-react-app-with-npm/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cypress.io/blog/2019/08/02/guest-post-angular-adding-cypress-ui-tests-to-your-devops-pipeline/"&gt;https://www.cypress.io/blog/2019/08/02/guest-post-angular-adding-cypress-ui-tests-to-your-devops-pipeline/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cypress-io/cypress-example-kitchensink/blob/master/Jenkinsfile"&gt;https://github.com/cypress-io/cypress-example-kitchensink/blob/master/Jenkinsfile&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover photo by JJ Ying on Unsplash&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cypress</category>
      <category>angular</category>
      <category>jenkins</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
