<?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: Shehab Hosny</title>
    <description>The latest articles on DEV Community by Shehab Hosny (@shehab7osny).</description>
    <link>https://dev.to/shehab7osny</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%2F530115%2Fdebe44f7-a76d-45f2-9dd6-2545dda439cc.jpeg</url>
      <title>DEV Community: Shehab Hosny</title>
      <link>https://dev.to/shehab7osny</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shehab7osny"/>
    <language>en</language>
    <item>
      <title>GitHub Actions Workflow for Ultimate Laziness</title>
      <dc:creator>Shehab Hosny</dc:creator>
      <pubDate>Sat, 04 Dec 2021 10:41:01 +0000</pubDate>
      <link>https://dev.to/shehab7osny/github-actions-workflow-for-ultimate-laziness-af5</link>
      <guid>https://dev.to/shehab7osny/github-actions-workflow-for-ultimate-laziness-af5</guid>
      <description>&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
My Workflow

&lt;ul&gt;
&lt;li&gt;Motivation behind the Workflow&lt;/li&gt;
&lt;li&gt;How did GitHub Actions help me?&lt;/li&gt;
&lt;li&gt;How I created this workflow?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Submission Category&lt;/li&gt;

&lt;li&gt;Additional Resources&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  My Workflow
&lt;/h2&gt;




&lt;h3&gt;
  
  
  Motivation behind the Workflow
&lt;/h3&gt;

&lt;p&gt;Let's all agree that we, as &lt;strong&gt;Human Beings&lt;/strong&gt;, prefer laziness most of the time. We love snoozing the alarm for an extra five minutes every morning, we prefer texting our siblings who are just sitting in the next room, sometimes we don't even run through our exam paper before submitting it just because we are too lazy to do so.&lt;/p&gt;

&lt;p&gt;Besides laziness, we usually get bored so easily, from tedious tasks at work right through to waiting in line at the supermarket. Our brains simply don't respond well to experiences that are too predictable and repetitive. This lack of amusement is what we call &lt;strong&gt;boredom&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://i.giphy.com/media/szcpreDH56q9513iOL/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/szcpreDH56q9513iOL/giphy.gif" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's why we invented &lt;strong&gt;Machines&lt;/strong&gt; and enhanced the overall process of automation. Simply to make everything better, from increasing productivity to building more efficient and flawless products.&lt;/p&gt;

&lt;p&gt;Well, in the Software Engineering field, we too have some tedious tasks to keep on doing daily to maintain the output product. Here comes GitHub, or more specifically &lt;strong&gt;GitHub Actions&lt;/strong&gt;, to provide us a solution to automate any number of repetitive tasks and start the process with something just as simple as a mouse click! Impressive, right? Buckle up and get ready, because your mind is about to be blown away.&lt;br&gt;
&lt;a href="https://i.giphy.com/media/11LK0CKzYtkaic/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/11LK0CKzYtkaic/giphy.gif" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  How did GitHub Actions help me?
&lt;/h3&gt;

&lt;p&gt;Let me tell you my story from the 3rd-person point of view perspective. So, Shehab is an Open-Source enthusiast who created a GitHub repository called &lt;a href="https://github.com/Shehab7osny/DiffCpp" rel="noopener noreferrer"&gt;DiffCpp&lt;/a&gt; almost a year ago. At this moment in time, DiffCpp has a lot of users, forks, and stars (well, this is not the case for now, but hopefully it might be shortly). Anyway, this GitHub repo currently requires regular maintenance and updates to be alive. Since Shehab is a slothful person who avoids doing monotonous tasks, he decided to use existing &lt;a href="https://github.com/marketplace?type=actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt; to build a perfect workflow to automate any kind of work needed to ensure that the codebase will not be broken in whatever way before releasing it.&lt;/p&gt;

&lt;p&gt;So, he decided to brainstorm and list out all of the possible sets of tasks needed to get the job done. He found out that these tasks can be categorized as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Documentation&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check the &lt;strong&gt;Formatting&lt;/strong&gt; of the Codebase 

&lt;ul&gt;
&lt;li&gt;Since this is a C++ project, &lt;a href="https://clang.llvm.org/docs/ClangFormat.html" rel="noopener noreferrer"&gt;Clang-Format&lt;/a&gt; will be used.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Generate &lt;strong&gt;Documentation&lt;/strong&gt; 

&lt;ul&gt;
&lt;li&gt;Since this is a C++ project, &lt;a href="https://www.doxygen.nl/index.html" rel="noopener noreferrer"&gt;Doxygen&lt;/a&gt; will be used.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Generate &lt;strong&gt;Release Notes&lt;/strong&gt; to notify the user with changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Testing&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check for a &lt;strong&gt;Successful Build&lt;/strong&gt; on top of:

&lt;ul&gt;
&lt;li&gt;Linux (Ubuntu)&lt;/li&gt;
&lt;li&gt;Windows&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;a href="https://github.com/google/googletest" rel="noopener noreferrer"&gt;Google Test&lt;/a&gt; for:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unit Testing&lt;/strong&gt;: Test the logic of each API on its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Block Testing&lt;/strong&gt;: Test the logic of the package as a whole. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Check the &lt;strong&gt;Benchmark&lt;/strong&gt; of the package APIs using &lt;a href="https://github.com/google/benchmark" rel="noopener noreferrer"&gt;Google Benchmark&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well obviously, this is much to do, but cautious! &lt;strong&gt;SPOILER ALERT&lt;/strong&gt; is on the way, and let me just tell you not only that GitHub allowed me to do all of the previously listed tasks with &lt;u&gt;ZERO&lt;/u&gt; effort but it also provided me with this charming pipeline visualization at the end of the process.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkh0wd6y8e6xxwz2aghr.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkh0wd6y8e6xxwz2aghr.PNG" alt="Visualization Graph"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  How I created this workflow?
&lt;/h3&gt;

&lt;p&gt;For simplicity, let’s consider the following scenario. I woke up this morning, grabbed a cup of coffee, and checked out my GitHub account just to find out that someone created an issue in the DiffCpp repo mentioning the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input = 🔵
Expected Output = 🔴
Actual Output = ⚪
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This needs an immediate fix. So, I decided to offer &lt;strong&gt;$10,000,000&lt;/strong&gt; (I wish I had this amount of money in real life) for the first contributor who solves the issue. Well, for the first thought, you may think that this will solve the issue but have you imagined how many pull requests would I get per minute?&lt;br&gt;
&lt;a href="https://i.giphy.com/media/If9DvbHHowI1SWKLae/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/If9DvbHHowI1SWKLae/giphy.gif" alt="Alt text of image"&gt;&lt;/a&gt;&lt;br&gt;
Apart from the number of pull requests, I wouldn't even be able to check all of them to find out which ones get the job done, this would take me forever! Thanks to Google Test that allowed me to add a new test with something just as simple as these 2 lines of code:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output = Input(🔵);
EXPECT_EQ(Output, 🔴);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;So, here comes GitHub Actions (in collaboration with Google Test) to solve the problem. So, I decided to build a workflow to check each submitted pull request for the following: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Successful Build 🔧&lt;br&gt;

  YAML snippet (Click to Expand)
  &lt;br&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;build-linux&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Linux&lt;/span&gt;
  &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
  &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout Repository&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cmake .&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Make&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;make&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload Linux Artifact&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v2&lt;/span&gt;
    &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DiffCpp-Linux&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./DiffCpp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
For windows build, the same steps would be used using windows-specific CMake commands.&lt;/p&gt;

&lt;p&gt;Actions Used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/actions/checkout" rel="noopener noreferrer"&gt;actions/checkout@v2&lt;/a&gt; is used to checkout my GitHub repo.
&lt;p&gt; Here is a request from the GitHub Team &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/actions/upload-artifact" rel="noopener noreferrer"&gt;actions/upload-artifact@v2&lt;/a&gt; is used to allow the user to download the built binaries later.
&lt;/li&gt;
&lt;/ul&gt;

&lt;/p&gt;
&lt;/li&gt;


&lt;li&gt;
&lt;p&gt;Code Formatting 📝&lt;br&gt;

  YAML snippet (Click to Expand)
  &lt;br&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;clang-format-check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Format Check&lt;/span&gt;
  &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
  &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout Repository&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check Codebase Format&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;RafikFarhad/clang-format-github-action@v1.0.1&lt;/span&gt;
    &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;src/*.cpp,include/*.h,test/*.cpp"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
Actions Used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/RafikFarhad/clang-format-github-action" rel="noopener noreferrer"&gt;RafikFarhad/clang-format-github-action@v1.0.1&lt;/a&gt; is used to check the format of the submitted code using clang-format.
&lt;/li&gt;
&lt;/ul&gt;

&lt;/p&gt;
&lt;/li&gt;


&lt;li&gt;
&lt;p&gt;Unit and Block Testing 📋&lt;br&gt;

  YAML snippet (Click to Expand)
  &lt;br&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;verification&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Unit and Block Testing&lt;/span&gt;
  &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
  &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
  &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout Repository&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cache GoogleTest Package&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cached-gtest&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/cache@v2&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;cache-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cache-gtest-repo&lt;/span&gt;
    &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;googletest&lt;/span&gt;
      &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ runner.os }}-build-${{ env.cache-name }}&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install GoogleTest&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;steps.cached-gtest.outputs.cache-hit != 'true'&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mkdir googletest &amp;amp;&amp;amp;&lt;/span&gt;
         &lt;span class="s"&gt;git clone https://github.com/google/googletest.git&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cmake -DBUILD_TESTS=ON .&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Make&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;make&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Unit Tests&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./DiffCpp_tst&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
Actions Used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/actions/cache" rel="noopener noreferrer"&gt;actions/cache@v2&lt;/a&gt; is used to cache the output of the specified step. This will allow GitHub to skip the specified action if it has been already done before.&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fof04vscc42ms5682nmei.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fof04vscc42ms5682nmei.PNG" alt="Cache"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you are using any verification method other than GoogleTest, you can simply use the uploaded artifact from the build job and pass it to this one. GitHub is great isn't it? Anyway, for C++ projects, GoogleTest is perfect for verification. You will even have the ability to check the test results from the GitHub Actions log as it is shown right here 👇&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1tffqdii0afub66ztq0.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1tffqdii0afub66ztq0.PNG" alt="GoogleTest"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When these checks pass successfully, the following will be shown in the pull request itself to facilitate direct merge.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feritrlw4xq5w7vgfyehl.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feritrlw4xq5w7vgfyehl.PNG" alt="Pull Request Check"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Moreover, you can feast your eyes on the charming visualization of this pipeline showing the complete flow of the code review right here 👇&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88fbr3o4u2cj57yfumi6.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88fbr3o4u2cj57yfumi6.PNG" alt="Pull Request Pipeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are not done yet! Additionally, GitHub can even notify me when someone submits a valid pull request that solves the issue. So, I will be able to successfully check over millions of pull requests effortlessly.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4ibos9tfyqcbyfs2cy2.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4ibos9tfyqcbyfs2cy2.PNG" alt="Notification"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well, now it is time to generate a release, but again I have neither intention nor energy to do any other work (as if I have done any). Thus, I decided to build another workflow, based on the previous one, that will be in charge of generating the release from A to Z and can be triggered with a simple mouse click.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/26ufnwz3wDUli7GU0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/26ufnwz3wDUli7GU0/giphy.gif" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First things first, my strategy will be based on DRY (Don't Repeat Yourself). Thus, I decided to make use of what is called &lt;strong&gt;Reusable Workflows&lt;/strong&gt;. Yes! it is exactly as fascinating as you read, GitHub has just introduced a new feature of reusing workflows, many thanks to &lt;a class="mentioned-user" href="https://dev.to/blackgirlbytes"&gt;@blackgirlbytes&lt;/a&gt; for her awesome blog post about the feature.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/github" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F2575%2F3da37f64-b46e-4fa5-bf86-01b63ba5f57b.png" alt="GitHub"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F302741%2F5ed2ea8e-056a-4065-9bed-57d24a96b607.png" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/github/github-actions-you-can-build-reusable-workflows-4gc7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;GitHub Actions: You Can Build Reusable Workflows!&lt;/h2&gt;
      &lt;h3&gt;Rizèl Scarlett for GitHub ・ Nov 17 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#actionshackathon21&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#devops&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;p&gt;So, I needed to add the following tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Generate Documentation for the Codebase 📜&lt;br&gt;

  YAML snippet (Click to Expand)
  &lt;br&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;doxygen-doc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Doxygen Documentation&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://shehab7osny.github.io/DiffCpp/include/&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Generate Documentation&lt;/span&gt;
  &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;codebase&lt;/span&gt;
  &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
  &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout Repository&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Doxygen&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mattnotmitt/doxygen-action@v1&lt;/span&gt;
    &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;working-directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;include/'&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to GitHub Pages&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;peaceiris/actions-gh-pages@v3&lt;/span&gt;
    &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;github_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
      &lt;span class="na"&gt;publish_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./include/html&lt;/span&gt;
      &lt;span class="na"&gt;destination_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./include&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
Actions Used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/mattnotmitt/doxygen-action" rel="noopener noreferrer"&gt;mattnotmitt/doxygen-action@v1&lt;/a&gt; is used to build doxygen docs.
&lt;p&gt; Currently documentation is only available for the include directory but hopefully I will expand it later. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/peaceiris/actions-gh-pages" rel="noopener noreferrer"&gt;peaceiris/actions-gh-pages@v3&lt;/a&gt; is used to deploy html output of doxygen into GitHub pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The environment specified here has a url of Doxygen output displayed just right in the workflow visualization graph itself.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjc6sj9goxiis5vowtzyx.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjc6sj9goxiis5vowtzyx.PNG" alt="URL Documentation"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This job has a single dependency&lt;/em&gt; ➡️ &lt;em&gt;codebase formatting&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;The generated URL will consist of detailed code documentation as follows: &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff8fxh8uucj4bn6dupanp.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff8fxh8uucj4bn6dupanp.PNG" alt="Doxygen Documentation"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Compute the Benchmark 📈&lt;br&gt;
&lt;a href="https://i.giphy.com/media/0TJrlyCotQvie6vL4E/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/0TJrlyCotQvie6vL4E/giphy.gif" alt="Alt text of image"&gt;&lt;/a&gt;&lt;br&gt;
For those of you who don't know, &lt;strong&gt;Benchmarking&lt;/strong&gt; means measuring the performance of a certain program with respect to time.&lt;br&gt;

  YAML snippet (Click to Expand)
  &lt;br&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;benchmarking&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Benchmark Results&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://shehab7osny.github.io/DiffCpp/dev/bench&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Benchmark (Performance)&lt;/span&gt;
  &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;verification&lt;/span&gt;
  &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
  &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout Repository&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cache Google Benchmark Package&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cached-benchmark&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/cache@v2&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;cache-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cache-gbench-repo&lt;/span&gt;
    &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;benchmark&lt;/span&gt;
      &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ runner.os }}-build-${{ env.cache-name }}&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Google Benchmark&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;steps.cached-benchmark.outputs.cache-hit != 'true'&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mkdir benchmark &amp;amp;&amp;amp;&lt;/span&gt;
        &lt;span class="s"&gt;git clone https://github.com/google/benchmark.git benchmark&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cmake -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_BENCH=ON .&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Make&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;make&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Benchmark&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ls &amp;amp;&amp;amp; ./DiffCpp_BENCH --benchmark_format=json | tee benchmark_result.json&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Store benchmark result&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;benchmark-action/github-action-benchmark@v1&lt;/span&gt;
    &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;tool&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;googlecpp'&lt;/span&gt;
      &lt;span class="na"&gt;output-file-path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;benchmark_result.json&lt;/span&gt;
      &lt;span class="na"&gt;github-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
      &lt;span class="na"&gt;fail-on-alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;comment-on-alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;auto-push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
Actions Used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/benchmark-action/github-action-benchmark" rel="noopener noreferrer"&gt;benchmark-action/github-action-benchmark@v1&lt;/a&gt; is used to convert the JSON results from Google Benchmark into a statistical graph.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/actions/cache" rel="noopener noreferrer"&gt;actions/cache@v2&lt;/a&gt; is used to cache the output of the specified step. In this case the step of checking out Google Benchmark repo is cached.
&lt;/li&gt;
&lt;/ul&gt;

&lt;/p&gt;
&lt;/li&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This job has a single dependency&lt;/em&gt; ➡️ &lt;em&gt;verification&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;The generated URL will consist of Benchmark Graph as follows: &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5vp40b1bqhvgidtpvdi.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5vp40b1bqhvgidtpvdi.PNG" alt="Benchmark"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;li&gt;
&lt;p&gt;Create a new Release (with &lt;strong&gt;Release Notes&lt;/strong&gt;) 📭&lt;br&gt;

  YAML snippet (Click to Expand)
  &lt;br&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;release-project&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Release Project&lt;/span&gt;
  &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;benchmarking&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;doxygen-doc&lt;/span&gt;
  &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
  &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Download Linux Artifact&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/download-artifact@v2&lt;/span&gt;
    &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DiffCpp-Linux&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Download Windows Artifact&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/download-artifact@v2&lt;/span&gt;
    &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DiffCpp-Windows&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create GitHub Release&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;create-new-release&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/github-script@v4.0.2&lt;/span&gt;
    &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;github-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{secrets.GITHUB_TOKEN}}&lt;/span&gt;
      &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;await github.request(`POST /repos/${{ github.repository }}/releases`, {&lt;/span&gt;
          &lt;span class="s"&gt;tag_name: "${{ github.event.inputs.release_ver }}",&lt;/span&gt;
          &lt;span class="s"&gt;generate_release_notes: true&lt;/span&gt;
        &lt;span class="s"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
Actions Used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/actions/download-artifact" rel="noopener noreferrer"&gt;actions/download-artifact@v2&lt;/a&gt; is used to download the previously uploaded artifact in case it is needed to be packed in the release.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/mattnotmitt/doxygen-action" rel="noopener noreferrer"&gt;actions/github-script@v4.0.2&lt;/a&gt; is used to create a new release and generate an &lt;strong&gt;Automated Release Notes&lt;/strong&gt; along with it.&lt;/li&gt;
&lt;/ul&gt;



&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This job has two dependencies&lt;/em&gt; &lt;br&gt;
➡️ &lt;em&gt;benchmarking&lt;/em&gt;&lt;br&gt;
➡️ &lt;em&gt;doxygen-doc&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In case you are new to Auto Generate Release Notes, don't hesitate to check out this charming video created by &lt;a class="mentioned-user" href="https://dev.to/mishmanners"&gt;@mishmanners&lt;/a&gt; , many thanks for her. Anyway, I decided to take this feature to a new level and include it in an automated action itself. So, I'm literally automating an automated task!&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8ryjj5x6FlQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;


&lt;p&gt;Here is a snapshot of the auto-generated release notes: &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0z5qj10ei2s0mlqq1ib.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0z5qj10ei2s0mlqq1ib.PNG" alt="Release Notes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Besides, the built artifacts will be ready for download (both for Linux and Windows)&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9e2f4rhrtmt4hv1wqvk9.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9e2f4rhrtmt4hv1wqvk9.PNG" alt="Artifacts"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Finally, after the completion of all these tasks, we can have a look on this charming visualization of the pipeline showing the complete flow of the release process right here 👇&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkh0wd6y8e6xxwz2aghr.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkh0wd6y8e6xxwz2aghr.PNG" alt="Visualization Graph"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Submission Category:
&lt;/h2&gt;

&lt;p&gt;Maintainer Must Haves&lt;/p&gt;

&lt;p&gt;In conclusion, I just want to point out that relating this workflow with laziness is for nothing but simplicity of illustration. However, in real life, developers commonly tend to avoid such monotonous tasks so that they can keep focused on the development itself rather than dealing with numerous amount of tasks for verification and release purposes. So, from my point of view, using this workflow in any project is a must, and will help developers to focus more on introducing new features to the project while making sure that the codebase is not broken.&lt;/p&gt;


&lt;h2&gt;
  
  
  Yaml File or Link to Code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Reusable Workflows

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Shehab7osny/DiffCpp/blob/main/.github/workflows/build.yml" rel="noopener noreferrer"&gt;build.yml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shehab7osny/DiffCpp/blob/main/.github/workflows/codebase.yml" rel="noopener noreferrer"&gt;codebase.yml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shehab7osny/DiffCpp/blob/main/.github/workflows/testing.yml" rel="noopener noreferrer"&gt;testing.yml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Main Workflows:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Shehab7osny/DiffCpp/blob/main/.github/workflows/code-review.yml" rel="noopener noreferrer"&gt;code-review.yml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shehab7osny/DiffCpp/blob/main/.github/workflows/release.yml" rel="noopener noreferrer"&gt;release.yml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the DiffCpp repo&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Shehab7osny" rel="noopener noreferrer"&gt;
        Shehab7osny
      &lt;/a&gt; / &lt;a href="https://github.com/Shehab7osny/DiffCpp" rel="noopener noreferrer"&gt;
        DiffCpp
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Diff tool for Windows/Linux implemented in C++
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shehab7osny/diffCpp/workflows/Linux%20Build/badge.svg"&gt;&lt;img src="https://github.com/Shehab7osny/diffCpp/workflows/Linux%20Build/badge.svg" alt="Build Status"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/Shehab7osny/diffCpp/workflows/Windows%20Build/badge.svg"&gt;&lt;img src="https://github.com/Shehab7osny/diffCpp/workflows/Windows%20Build/badge.svg" alt="Build Status"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/Shehab7osny/diffCpp/workflows/Tests/badge.svg"&gt;&lt;img src="https://github.com/Shehab7osny/diffCpp/workflows/Tests/badge.svg" alt="coverage"&gt;&lt;/a&gt;
&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6cd0120cc4c5ac11d28b2c60f76033b52db98dac641de3b2644bb054b449d60c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;DiffCpp&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;This package is used to compare two files line by line and show the differences.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Build and Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Linux&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;mkdir build
cd build
cmake ..
make
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Windows&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;mkdir build
cd build
cmake ..
cmake --build .
cd Debug/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Linux&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;./DiffCpp File_1_Path File_2_Path [/N] [/A] [/W]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Windows&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;DiffCpp File_1_Path File_2_Path [/N] [/A] [/W]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Main Arguments&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Argument&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;File_1_Path&lt;/td&gt;
&lt;td&gt;This represents the old version of the file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File_2_Path&lt;/td&gt;
&lt;td&gt;This represents the new version of the file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Optional Arguments&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Argument&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;/N&lt;/td&gt;
&lt;td&gt;Option to add line number to the displayed output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/A&lt;/td&gt;
&lt;td&gt;Option to display the updates only and ignore common matches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/W&lt;/td&gt;
&lt;td&gt;Option to ignore whitespaces difference while comparing files&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Sample Use Case&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;File 1 (recursion_Old.py)&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-python notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;def&lt;/span&gt; &lt;span class="pl-en"&gt;tri_recursion&lt;/span&gt;(&lt;span class="pl-s1"&gt;k&lt;/span&gt;):
  &lt;span class="pl-k"&gt;if&lt;/span&gt;(&lt;span class="pl-s1"&gt;k&lt;/span&gt; &lt;span class="pl-c1"&gt;&amp;gt;&lt;/span&gt; &lt;span class="pl-c1"&gt;0&lt;/span&gt;):
    &lt;span class="pl-s1"&gt;result&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-s1"&gt;k&lt;/span&gt; &lt;span class="pl-c1"&gt;+&lt;/span&gt; &lt;span class="pl-en"&gt;tri_recursion&lt;/span&gt;(&lt;span class="pl-s1"&gt;k&lt;/span&gt; &lt;span class="pl-c1"&gt;-&lt;/span&gt; &lt;span class="pl-c1"&gt;1&lt;/span&gt;)
  &lt;span class="pl-k"&gt;else&lt;/span&gt;:
    &lt;span class="pl-s1"&gt;result&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-c1"&gt;1&lt;/span&gt;
  &lt;span class="pl-k"&gt;return&lt;/span&gt; &lt;span class="pl-s1"&gt;result&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;File 2 (recursion_New.py)&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-python notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;def&lt;/span&gt; &lt;span class="pl-en"&gt;tri_recursion&lt;/span&gt;(&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Shehab7osny/DiffCpp" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open Source projects using (hosting) the workflow ➡️ &lt;a href="https://github.com/Shehab7osny/DiffCpp" rel="noopener noreferrer"&gt;DiffCpp&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open Source projects used in the workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/google/googletest" rel="noopener noreferrer"&gt;Google Test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/benchmark" rel="noopener noreferrer"&gt;Google Benchmark&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Existing Actions that have been used in the workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/actions/checkout" rel="noopener noreferrer"&gt;actions/checkout@v2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/actions/upload-artifact" rel="noopener noreferrer"&gt;actions/upload-artifact@v2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/RafikFarhad/clang-format-github-action" rel="noopener noreferrer"&gt;RafikFarhad/clang-format-github-action@v1.0.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/actions/cache" rel="noopener noreferrer"&gt;actions/cache@v2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mattnotmitt/doxygen-action" rel="noopener noreferrer"&gt;mattnotmitt/doxygen-action@v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/peaceiris/actions-gh-pages" rel="noopener noreferrer"&gt;peaceiris/actions-gh-pages@v3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/benchmark-action/github-action-benchmark" rel="noopener noreferrer"&gt;benchmark-action/github-action-benchmark@v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/actions/download-artifact" rel="noopener noreferrer"&gt;actions/download-artifact@v2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mattnotmitt/doxygen-action" rel="noopener noreferrer"&gt;actions/github-script@v4.0.2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;This project is licensed under the terms of the MIT license.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Honorable mention&lt;br&gt;
&lt;/p&gt;

&lt;p&gt; Many thanks to &lt;a href="https://twitter.com/MylesBorins" rel="noopener noreferrer"&gt;@MylesBorins&lt;/a&gt; and &lt;a class="mentioned-user" href="https://dev.to/bdougieyo"&gt;@bdougieyo&lt;/a&gt; for their ultimate useful info about GitHub's new feature &lt;strong&gt;Automated Release Notes&lt;/strong&gt; that has been applied in this project. You can check their video right here 👇&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/88FWrfHCIqo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Some enhancements requested from the GitHub team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allow some sort of caching the step of checking out the repository to avoid applying the same step several times.&lt;/li&gt;
&lt;li&gt;Allow reusable workflows (YAML files) to be called from a &lt;strong&gt;child directory&lt;/strong&gt; under the &lt;strong&gt;workflows&lt;/strong&gt; directory itself. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>actionshackathon21</category>
      <category>github</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
