<?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>Forem: Kris foster</title>
    <description>The latest articles on Forem by Kris foster (@kriscfoster).</description>
    <link>https://forem.com/kriscfoster</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%2F766548%2F8319bd83-d722-4701-9deb-61dba5cfa52a.jpeg</url>
      <title>Forem: Kris foster</title>
      <link>https://forem.com/kriscfoster</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kriscfoster"/>
    <language>en</language>
    <item>
      <title>PR Celebration GitHub Workflow 🎉🎉🎉</title>
      <dc:creator>Kris foster</dc:creator>
      <pubDate>Sat, 04 Dec 2021 09:23:48 +0000</pubDate>
      <link>https://forem.com/kriscfoster/pr-celebration-github-workflow-451k</link>
      <guid>https://forem.com/kriscfoster/pr-celebration-github-workflow-451k</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IQ8yze4z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/17026751/144413207-cf86613a-18c9-439b-a09b-a8a4e6359042.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IQ8yze4z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/17026751/144413207-cf86613a-18c9-439b-a09b-a8a4e6359042.png" alt="GitHub Celebration IOT Workflow" width="880" height="714"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  My Workflow
&lt;/h3&gt;

&lt;p&gt;Pull requests deserve to be celebrated 🎉! This workflow integrates with smart devices to celebrate when a pull request is created. This introduces some fun into the process &amp;amp; could help with team morale. It's especially nice when teams haven't seen each-other due to the pandemic. The celebration includes the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Turn on 🟢 &lt;strong&gt;smart bulb&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Play celebration music 🎵 on &lt;strong&gt;smart speaker&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Wait 10 seconds to &lt;strong&gt;enjoy the music&lt;/strong&gt; 🕺.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Send request to &lt;strong&gt;Raspberry Pi&lt;/strong&gt; 🥧 to take a celebration photo:&lt;br&gt;
a. Raspberry Pi &lt;strong&gt;takes the photo&lt;/strong&gt; 📸.&lt;br&gt;
b. Raspberry Pi &lt;strong&gt;uploads the photo&lt;/strong&gt; to cloud storage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Post message&lt;/strong&gt; with the celebration picture to the pull request 🎉🎉🎉.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Video Demo of Workflow in Action
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/LYscH7z0g6M"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

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

&lt;p&gt;Interesting IoT&lt;/p&gt;

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

&lt;h4&gt;
  
  
  Workflow Yaml
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PR Celebration&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&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;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;16.x&lt;/span&gt;&lt;span class="pi"&gt;]&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;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;Use Node.js ${{ matrix.node-version }}&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/setup-node@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;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ matrix.node-version }}&lt;/span&gt;
        &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;npm'&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 dependencies&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;npm ci&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 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;npm test&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;Turn office light on with green&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;kriscfoster/tplink-action@v1.4&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;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TPLINK_EMAIL }}&lt;/span&gt;
        &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TPLINK_PASSWORD }}&lt;/span&gt;
        &lt;span class="na"&gt;deviceType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HS100"&lt;/span&gt;
        &lt;span class="na"&gt;deviceId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TPLINK_DEVICE_ID }}&lt;/span&gt;
        &lt;span class="na"&gt;operation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;powerOn"&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;Play celebration song with Spotify&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;fjogeleit/http-request-action@v1.8.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;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://api.spotify.com/v1/me/player/play?device_id=${{ secrets.SPOTIFY_DEVICE_ID }}&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PUT&lt;/span&gt;
        &lt;span class="na"&gt;contentType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;
        &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;context_uri&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;${{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;secrets.SPOTIFY_CONTEXT_URI&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;offset&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;:{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;position&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;:0},&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;position_ms&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;:0}"&lt;/span&gt;
        &lt;span class="na"&gt;bearerToken&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SPOTIFY_PLAYER_API_TOKEN }}&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;Enjoy song for 10 seconds&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;sleep 10s&lt;/span&gt;
      &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bash&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;Take celebration picture&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;retrieve_celebration_picture&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;echo "::set-output name=id::$(curl -H Authorization:${{ secrets.AUTHORIZATION_TOKEN }} ${{ secrets.PI_ENDPOINT }} | jq .id | tr -d '"')"&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;Post celebration picture&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;octokit/request-action@v2.1.0&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;route&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;POST /repos/${{ github.repository_owner }}/${{ github.event.repository.name }}/issues/${{ github.event.number }}/comments&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.repository_owner }}&lt;/span&gt;
        &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.event.repository.name }}&lt;/span&gt;
        &lt;span class="na"&gt;issue_number&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.event.number }}&lt;/span&gt;
        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tests&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Passed,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;it's&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;time&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;celebrate!:tada::tada::tada:&amp;lt;br&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&amp;gt;![image](https://drive.google.com/uc?export=view&amp;amp;id=${{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;steps.retrieve_celebration_picture.outputs.id&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}})"&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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Link to Code
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kriscfoster"&gt;
        kriscfoster
      &lt;/a&gt; / &lt;a href="https://github.com/kriscfoster/pr-celebration-github-workflow"&gt;
        pr-celebration-github-workflow
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
PR Celebration GitHub Workflow 🎉🎉🎉
&lt;/h1&gt;
&lt;p&gt;This is an entry for the 2021 GitHub Actions Hackathon.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://user-images.githubusercontent.com/17026751/144413207-cf86613a-18c9-439b-a09b-a8a4e6359042.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IQ8yze4z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/17026751/144413207-cf86613a-18c9-439b-a09b-a8a4e6359042.png" alt="GitHub Celebration IOT Workflow"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
My Workflow&lt;/h3&gt;
&lt;p&gt;Pull requests deserve to be celebrated 🎉! This workflow integrates with smart devices to celebrate when a pull request is created. This introduces some fun into the process &amp;amp; could help with team morale. The celebration includes the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Turn on 🟢 &lt;strong&gt;smart bulb&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Play celebration music 🎵 on &lt;strong&gt;smart speaker&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait 10 seconds to &lt;strong&gt;enjoy the music&lt;/strong&gt; 🕺.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Send request to &lt;strong&gt;Raspberry Pi&lt;/strong&gt; 🥧 to take a celebration photo.&lt;/p&gt;
&lt;p&gt;a. Raspberry Pi &lt;strong&gt;takes the photo&lt;/strong&gt; 📸.&lt;/p&gt;
&lt;p&gt;b. Raspberry Pi &lt;strong&gt;uploads the photo&lt;/strong&gt; to cloud storage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Post message&lt;/strong&gt; with the celebration picture to the pull request 🎉🎉🎉.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
Video Demo&lt;/h3&gt;
&lt;p&gt;You can see a video demo of the GitHub workflow in action &lt;a href="https://youtu.be/LYscH7z0g6M" rel="nofollow"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
Submission Category:&lt;/h3&gt;
&lt;p&gt;Interesting IoT&lt;/p&gt;
&lt;h3&gt;
Yaml File or Link to Code&lt;/h3&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kriscfoster/pr-celebration-github-workflow"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h4&gt;
  
  
  How was this Made?
&lt;/h4&gt;

&lt;p&gt;I already had some smart devices so decided to use whatever I already had for the workflow.&lt;/p&gt;

&lt;h5&gt;
  
  
  Turning on Green Light 🟢
&lt;/h5&gt;

&lt;p&gt;I used a combination of a green bulb &amp;amp; a TP-Link smart plug for this. The TP-Link plug can be turned on/off using their API but I decided to wrap this functionality into an action that could be used by my workflow &amp;amp; utilized by other workflows in the future. I created this under &lt;a href="https://github.com/kriscfoster/tplink-action"&gt;tplink-action&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l8B5LQfG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/17026751/144415760-4bf71f7d-9823-4843-a93c-c7728d41ed10.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l8B5LQfG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/17026751/144415760-4bf71f7d-9823-4843-a93c-c7728d41ed10.jpg" alt="Image from iOS (9)" width="880" height="1173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Playing Music on Smart Speaker 🎵
&lt;/h5&gt;

&lt;p&gt;I used the spotify API directly for this component. Once authenticated, you can use the spotify API to play songs/playlists on a device associated with your account. I have a smart speaker that is connected to spotify so I just needed to make an API call to play celebration music on this speaker.&lt;/p&gt;

&lt;h5&gt;
  
  
  Taking &amp;amp; Uploading Photo with Raspberry Pi 🥧
&lt;/h5&gt;

&lt;p&gt;This was probably the most complicated part of the project. I built &amp;amp; expose an API from my Raspberry Pi. The code for this API is &lt;a href="https://github.com/kriscfoster/pr-celebration-github-workflow/tree/main/rpi-automation"&gt;here&lt;/a&gt;. When a request is made to an endpoint on this API, it takes a photo with a camera module on the Raspberry Pi &amp;amp; then uploads the photo to cloud storage. The API response contains the identifier of the photo in storage so the workflow knows how to use it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ecDzVhxS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/17026751/144416350-3a42ac00-0c35-4362-b275-b52939574abe.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ecDzVhxS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/17026751/144416350-3a42ac00-0c35-4362-b275-b52939574abe.jpg" alt="Image from iOS (10)" width="880" height="1173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Posting Photo as Comment on Pull Request 🎉
&lt;/h5&gt;

&lt;p&gt;I use the &lt;code&gt;octokit/request-action&lt;/code&gt; action to post the photo from cloud storage to the pull request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--su_NktPm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/17026751/144416136-95d1c2ea-56a4-428c-9155-518ed6a58111.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--su_NktPm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/17026751/144416136-95d1c2ea-56a4-428c-9155-518ed6a58111.png" alt="Screen Shot 2021-12-02 at 10 46 08" width="880" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.spotify.com/console/put-play"&gt;Spotify API Endpoint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kriscfoster/tplink-action"&gt;TP Link GitHub Action&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>actionshackathon21</category>
      <category>iot</category>
    </item>
  </channel>
</rss>
