<?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: Nato Boram</title>
    <description>The latest articles on DEV Community by Nato Boram (@natoboram).</description>
    <link>https://dev.to/natoboram</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%2F93959%2F1e4f7717-f70a-4616-976c-e31c5eac1fc8.jpg</url>
      <title>DEV Community: Nato Boram</title>
      <link>https://dev.to/natoboram</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/natoboram"/>
    <language>en</language>
    <item>
      <title>How to publish ExDocs on GitHub Pages</title>
      <dc:creator>Nato Boram</dc:creator>
      <pubDate>Wed, 23 Feb 2022 20:26:35 +0000</pubDate>
      <link>https://dev.to/natoboram/how-to-publish-exdocs-on-github-pages-1kn2</link>
      <guid>https://dev.to/natoboram/how-to-publish-exdocs-on-github-pages-1kn2</guid>
      <description>&lt;p&gt;GitHub Pages allows you to publish static files, but it doesn't allow you to &lt;em&gt;generate&lt;/em&gt; these. This is a problem if you want to generate ExDocs for a private package or generate a static website with a web framework like Angular.&lt;/p&gt;

&lt;p&gt;The only way to have static files published on GitHub Pages is to put them on the repo, either in &lt;code&gt;/docs&lt;/code&gt; or in a branch named &lt;code&gt;gh-pages&lt;/code&gt;. Let's do this using GitHub Actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  SSH key
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#generating-a-new-ssh-key" rel="noopener noreferrer"&gt;Generating a new SSH key&lt;/a&gt; will allow you to push change to your Git repository from a GitHub Action. We'll use this to generate ExDocs and push them whenever there's a push on &lt;code&gt;master&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"gh-pages"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deploy key
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;A &lt;a href="https://docs.github.com/en/developers/overview/managing-deploy-keys#deploy-keys" rel="noopener noreferrer"&gt;deploy key&lt;/a&gt; is an SSH key that grants access to a single repository. GitHub attaches the public part of the key directly to your repository instead of a personal user account, and the private part of the key remains on your server.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Add the public key to the &lt;em&gt;Deploy keys&lt;/em&gt; in &lt;code&gt;/settings/keys&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F0doplivnsyxjrpog7q9d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F0doplivnsyxjrpog7q9d.png" alt="Deploy Key" width="768" height="118"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Action secrets
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Secrets are environment variables that are &lt;strong&gt;encrypted&lt;/strong&gt;. Anyone with&lt;br&gt;
&lt;strong&gt;collaborator&lt;/strong&gt; access to this repository can use these secrets for Actions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Add the private key to the &lt;em&gt;Repository secrets&lt;/em&gt; in &lt;code&gt;/settings/secrets/actions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fmf4ykz2s3y8zo83iqpct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fmf4ykz2s3y8zo83iqpct.png" alt="Repository Secrets" width="768" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Action
&lt;/h2&gt;

&lt;p&gt;With this setup, your GitHub Actions now have the ability to modify the repository. Depending on weather you want to put the docs in &lt;code&gt;/docs&lt;/code&gt; or in &lt;code&gt;gh-pages&lt;/code&gt;, the steps will be very similar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fp1yeh7vg8ou6vt7bluy1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fp1yeh7vg8ou6vt7bluy1.png" alt="Elixir GitHub Action" width="395" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using a GitHub Action, we'll execute these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate ExDocs in &lt;code&gt;/doc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Initialize a Git repository in &lt;code&gt;/doc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Link this new local repo to your repository&lt;/li&gt;
&lt;li&gt;Force push the whole directory to &lt;code&gt;gh-pages&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's an example of the GitHub Actions file.&lt;br&gt;
&lt;/p&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;GitHub Pages&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;push&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;master&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Push to gh-pages&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;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;Set up Elixir&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;erlef/setup-beam@988e02bfe678367a02564f65ca2e37726dc0268f&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;elixir-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.13.3"&lt;/span&gt; &lt;span class="c1"&gt;# Define the elixir version [required]&lt;/span&gt;
          &lt;span class="na"&gt;otp-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;24"&lt;/span&gt; &lt;span class="c1"&gt;# Define the OTP version [required]&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;Restore dependencies cache&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;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;deps&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 }}-mix-${{ hashFiles('**/mix.lock') }}&lt;/span&gt;
          &lt;span class="na"&gt;restore-keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ runner.os }}-mix-&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;mix deps.get&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;Force push to gh-pages&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;# Generate docs&lt;/span&gt;
          &lt;span class="s"&gt;mix docs&lt;/span&gt;

          &lt;span class="s"&gt;# Setup&lt;/span&gt;
          &lt;span class="s"&gt;cd doc&lt;/span&gt;
          &lt;span class="s"&gt;git init --initial-branch gh-pages&lt;/span&gt;
          &lt;span class="s"&gt;git remote add origin $ORIGIN&lt;/span&gt;
          &lt;span class="s"&gt;git config user.name "$NAME"&lt;/span&gt;
          &lt;span class="s"&gt;git config user.email "$EMAIL"&lt;/span&gt;
          &lt;span class="s"&gt;eval `ssh-agent -s`&lt;/span&gt;
          &lt;span class="s"&gt;ssh-add - &amp;lt;&amp;lt;&amp;lt; '${{ secrets.GH_PAGES_SSH }}'&lt;/span&gt;

          &lt;span class="s"&gt;# Push&lt;/span&gt;
          &lt;span class="s"&gt;git add .&lt;/span&gt;
          &lt;span class="s"&gt;git commit -m "mix docs"&lt;/span&gt;
          &lt;span class="s"&gt;git push --set-upstream origin gh-pages -f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this file, you'll have to replace the variables &lt;code&gt;$NAME&lt;/code&gt;, &lt;code&gt;$EMAIL&lt;/code&gt; and &lt;code&gt;$ORIGIN&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Once it's commited to &lt;code&gt;master&lt;/code&gt;, the GitHub Pages will be automatically deployed!&lt;/p&gt;

</description>
      <category>github</category>
      <category>elixir</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
