<?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: Juan Diaz</title>
    <description>The latest articles on DEV Community by Juan Diaz (@1diazdev).</description>
    <link>https://dev.to/1diazdev</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%2F738388%2F7542a50f-061e-4c02-928b-efffc611426c.jpeg</url>
      <title>DEV Community: Juan Diaz</title>
      <link>https://dev.to/1diazdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/1diazdev"/>
    <language>en</language>
    <item>
      <title>Automatiza tus commits diarios con GitHub Actions</title>
      <dc:creator>Juan Diaz</dc:creator>
      <pubDate>Mon, 25 Dec 2023 23:41:17 +0000</pubDate>
      <link>https://dev.to/1diazdev/automatiza-tus-commits-diarios-con-github-actions-5ejc</link>
      <guid>https://dev.to/1diazdev/automatiza-tus-commits-diarios-con-github-actions-5ejc</guid>
      <description>&lt;p&gt;Un día me propuse un desafío: &lt;strong&gt;hacer un commit diario en GitHub durante todo un año&lt;/strong&gt;. Ahora que ya tengo la disciplina de escribir código de manera constante. Se me ocurrió que quiero automatizar este proceso, y así mismo aprender a hacerlo. Pero ¿cómo podría automatizar un commit diario en GitHub? ¿Será que existe alguna herramienta o script que pueda usar para hacer commits automáticos? Estas eran las preguntas claves que debía resolver.&lt;/p&gt;

&lt;p&gt;Después de investigar un poco, encontré que puedo automatizar este proceso utilizando &lt;strong&gt;GitHub Actions&lt;/strong&gt;, que es una herramienta de &lt;em&gt;CI/CD&lt;/em&gt; integrada en GitHub. Sin más preámbulos, en este artículo te mostraré un ejemplo de cómo podrías configurar un flujo de trabajo para hacer un commit diario a tu repositorio de manera automática.&lt;/p&gt;

&lt;p&gt;Primero, necesitarás un &lt;strong&gt;script que realice el commit&lt;/strong&gt;. Aquí hay un ejemplo simple de un &lt;strong&gt;script de Shell&lt;/strong&gt; que podría hacer esto (.github/scripts/auto_commit.sh):&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;#.github/scripts/auto_commit.sh&lt;/span&gt;

&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="c"&gt;# Crea un nuevo archivo con la fecha y hora actual como contenido. Si ya existe un archivo, reemplaza el contenido con la fecha y hora actual.&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; commit.txt

&lt;span class="c"&gt;# Agrega el nuevo archivo al staging area&lt;/span&gt;
git add commit.txt

&lt;span class="c"&gt;# Hace un commit con un mensaje&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Commit automatizado"&lt;/span&gt;

&lt;span class="c"&gt;# Empuja los cambios a GitHub&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego, necesitarás &lt;strong&gt;crear un archivo del flujo de trabajo ("workflow") de GitHub Actions para ejecutar este script una vez al día&lt;/strong&gt;. Este archivo define una serie de pasos que se ejecutan automáticamente en respuesta a eventos específicos de GitHub, como un push o un pull request. Aquí hay un ejemplo de cómo podría ser ese archivo del flujo de trabajo (.github/workflows/daily-commit.yml):&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;Daily Commit&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;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&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;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt; &lt;span class="c1"&gt;# Esto se ejecutará todos los días a medianoche&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;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;Run script&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;bash /path/to/your/auto_commit_script.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este flujo de trabajo se ejecutará todos los días a medianoche y ejecutará tu script, que hará un commit y lo empujará a tu repositorio.&lt;/p&gt;

&lt;p&gt;Nota: Asegúrate de reemplazar &lt;code&gt;/path/to/your/repo&lt;/code&gt; y &lt;code&gt;/path/to/your/script.sh&lt;/code&gt; con las rutas reales a tu repositorio y a tu script, respectivamente. Además, este script asume que estás trabajando en la rama &lt;code&gt;main&lt;/code&gt;. Si estás trabajando en una rama diferente, reemplaza main con el nombre de tu rama.&lt;/p&gt;

&lt;p&gt;Además, necesitarás &lt;strong&gt;configurar las credenciales de Git&lt;/strong&gt; en el flujo de trabajo de GitHub Actions para que puedas empujar a tu repositorio. Puedes hacer esto utilizando un &lt;strong&gt;token&lt;/strong&gt; de acceso personal de GitHub y configurándolo como una &lt;strong&gt;variable de entorno&lt;/strong&gt; en tu flujo de trabajo.&lt;/p&gt;

&lt;p&gt;Es importante tener en cuenta que &lt;strong&gt;no es una buena práctica almacenar las credenciales de Git en texto plano&lt;/strong&gt;. Sin embargo, en este caso, no hay forma de evitarlo, ya que el flujo de trabajo de GitHub Actions se ejecuta en un entorno aislado y no tienes acceso a las credenciales de Git almacenadas en tu máquina local. Por lo tanto, &lt;em&gt;necesitarás crear un token de acceso personal de GitHub&lt;/em&gt; y &lt;em&gt;configurarlo como una variable de entorno&lt;/em&gt; en tu flujo de trabajo.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo configurar las credenciales de Git?
&lt;/h2&gt;

&lt;p&gt;Para &lt;em&gt;configurar las credenciales de Git&lt;/em&gt; en el flujo de trabajo de GitHub Actions, necesitarás un &lt;strong&gt;token de acceso personal de GitHub&lt;/strong&gt;. Aquí te explico cómo hacerlo:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Genera un &lt;strong&gt;&lt;code&gt;token de acceso personal en GitHub&lt;/code&gt;&lt;/strong&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ve a la configuración de tu cuenta de GitHub (haz clic en tu foto de perfil en la esquina superior derecha y selecciona &lt;strong&gt;&lt;code&gt;"Settings"&lt;/code&gt;&lt;/strong&gt; (Configuración) ).&lt;/li&gt;
&lt;li&gt;En el menú de la izquierda, selecciona &lt;strong&gt;&lt;code&gt;"Developer settings"&lt;/code&gt;&lt;/strong&gt; (Configuración de desarrollador).&lt;/li&gt;
&lt;li&gt;Luego, selecciona &lt;strong&gt;&lt;code&gt;"Personal access tokens"&lt;/code&gt;&lt;/strong&gt; (Tokens de acceso personal).&lt;/li&gt;
&lt;li&gt;Haz clic en &lt;strong&gt;&lt;code&gt;"Generate new token"&lt;/code&gt;&lt;/strong&gt; (Generar nuevo token).&lt;/li&gt;
&lt;li&gt;Dale un &lt;strong&gt;nombre descriptivo&lt;/strong&gt; a tu token.&lt;/li&gt;
&lt;li&gt;Selecciona los &lt;strong&gt;permisos&lt;/strong&gt; que necesitas para tu flujo de trabajo, en este caso, necesitarás el &lt;strong&gt;&lt;code&gt;permiso repo&lt;/code&gt;&lt;/strong&gt; y haz clic en &lt;strong&gt;&lt;code&gt;"Generate token"&lt;/code&gt;&lt;/strong&gt; (Generar token).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Configura el token&lt;/strong&gt; de acceso personal &lt;strong&gt;como una variable de entorno&lt;/strong&gt; en tu flujo de trabajo:
&lt;/h3&gt;

&lt;p&gt;En tu archivo del flujo de trabajo (.github/workflows/daily-commit.yml), debes agregar una &lt;em&gt;nueva etapa&lt;/em&gt; antes de la etapa &lt;strong&gt;&lt;code&gt;Run script&lt;/code&gt;&lt;/strong&gt; para &lt;strong&gt;configurar las credenciales de Git&lt;/strong&gt;. Aquí te muestro cómo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opción 1:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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 Git credentials&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;git config --global user.name "your-username"&lt;/span&gt;
    &lt;span class="s"&gt;git config --global user.email "your-email@example.com"&lt;/span&gt;
    &lt;span class="s"&gt;git config --global credential.helper store&lt;/span&gt;
    &lt;span class="s"&gt;echo "https://$TOKEN:x-oauth-basic@github.com" &amp;gt; ~/.git-credentials&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;TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.YOUR_GITHUB_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Nota:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reemplaza &lt;strong&gt;"your-username"&lt;/strong&gt; y &lt;strong&gt;"&lt;a href="mailto:your-email@example.com"&gt;your-email@example.com&lt;/a&gt;"&lt;/strong&gt; con tu nombre de usuario de GitHub y tu correo electrónico.&lt;/li&gt;
&lt;li&gt;En la última línea, &lt;code&gt;TOKEN&lt;/code&gt; es una variable de entorno que contiene tu token de acceso personal. Necesitarás agregar este token a las &lt;strong&gt;"Secrets"&lt;/strong&gt; de tu repositorio en GitHub (más sobre esto más adelante).&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Opción 2:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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 Git credentials&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;git config --global user.name ""your-username"&lt;/span&gt;
    &lt;span class="s"&gt;git config --global user.email "your-email@example.com"&lt;/span&gt;
    &lt;span class="s"&gt;git remote set-url origin https://${{ secrets.YOUR_GITHUB_TOKEN }}@github.com/username/repo.git&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Nota:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Al igual que en opción 1, reemplaza &lt;strong&gt;"your-username"&lt;/strong&gt; y &lt;strong&gt;"&lt;a href="mailto:your-email@example.com"&gt;your-email@example.com&lt;/a&gt;"&lt;/strong&gt; con tu nombre de usuario de GitHub y tu correo electrónico.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Así debería estar quedando el archivo de workflow de GitHub Actions&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/daily-commit.yml&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;Daily Commit&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;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&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;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&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;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 Git credentials&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;git config --global user.name ""your-username"&lt;/span&gt;
          &lt;span class="s"&gt;git config --global user.email "your-email@example.com"&lt;/span&gt;
          &lt;span class="s"&gt;git remote set-url origin https://${{ secrets.YOUR_GITHUB_TOKEN }}@github.com/username/repo.git&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
  
  
  ¿Cuáles son las diferencias entre las opciones 1 y 2?
&lt;/h4&gt;

&lt;p&gt;La principal diferencia entre estos dos fragmentos de código es cómo se manejan las credenciales de Git:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;En la &lt;strong&gt;Opción 1&lt;/strong&gt;, se utiliza &lt;code&gt;git config --global credential.helper store&lt;/code&gt; para almacenar las credenciales de usuario en un archivo en su directorio local. Luego, se crea un archivo &lt;code&gt;.git-credentials&lt;/code&gt; en el directorio home del usuario con la URL que incluye el token de autenticación. Este método almacena las credenciales en un archivo en texto plano en su sistema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En la &lt;strong&gt;Opción 2&lt;/strong&gt;, se utiliza &lt;code&gt;git remote set-url origin&lt;/code&gt; para cambiar la URL del repositorio remoto 'origin' a una que incluya el token de autenticación. Este método no almacena las credenciales en su sistema, sino que las incluye en la URL del repositorio remoto.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ambos métodos tienen sus ventajas y desventajas. El almacenamiento de credenciales es más seguro, ya que no expone el token en la línea de comandos, pero puede ser menos seguro si otras personas tienen acceso a su sistema. El uso de la URL del repositorio remoto es menos seguro, ya que expone el token en la línea de comandos, pero puede ser más seguro si tu sistema es seguro y sólo tu tiene acceso a él.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Agrega tu token de acceso personal a las &lt;strong&gt;&lt;code&gt;"Secrets"&lt;/code&gt;&lt;/strong&gt; de tu repositorio:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ve a la página principal de tu repositorio en GitHub y selecciona &lt;strong&gt;&lt;code&gt;"Settings"&lt;/code&gt;&lt;/strong&gt; (Configuración).&lt;/li&gt;
&lt;li&gt;Luego, selecciona &lt;strong&gt;&lt;code&gt;"Secrets"&lt;/code&gt;&lt;/strong&gt; en el menú de la izquierda.&lt;/li&gt;
&lt;li&gt;Haz clic en &lt;strong&gt;&lt;code&gt;"New repository secret"&lt;/code&gt;&lt;/strong&gt; (Nuevo secreto del repositorio).&lt;/li&gt;
&lt;li&gt;Ingresa &lt;strong&gt;&lt;code&gt;YOUR_GITHUB_TOKEN&lt;/code&gt;&lt;/strong&gt; como el nombre del secreto y pega tu token de acceso personal en el campo &lt;strong&gt;&lt;code&gt;Value&lt;/code&gt;&lt;/strong&gt; (Valor).&lt;/li&gt;
&lt;li&gt;Haz clic en &lt;strong&gt;&lt;code&gt;"Add secret"&lt;/code&gt;&lt;/strong&gt; (Agregar secreto).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ahora, tu flujo de trabajo de GitHub Actions debería ser capaz de empujar a tu repositorio utilizando tu token de acceso personal.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Ejecuta tu flujo de trabajo de GitHub Actions manualmente:
&lt;/h3&gt;

&lt;p&gt;En el archivo del flujo de trabajo de GitHub Actions, debes agregar un &lt;strong&gt;evento&lt;/strong&gt; que permita ejecutar el flujo de trabajo manualmente. Aquí te muestro cómo:&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;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# This allows you to manually trigger the workflow&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora, puedes ejecutar tu flujo de trabajo de GitHub Actions manualmente haciendo clic en el botón &lt;strong&gt;&lt;code&gt;"Run workflow"&lt;/code&gt;&lt;/strong&gt; (Ejecutar flujo de trabajo) en la página principal de tu repositorio en GitHub.&lt;/p&gt;

&lt;p&gt;Así debería estar quedando el archivo de workflow de GitHub Actions&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/daily-commit.yml&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;Daily Commit&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;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&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;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# This allows you to manually trigger the workflow&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;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 Git credentials&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;git config --global user.name ""your-username"&lt;/span&gt;
          &lt;span class="s"&gt;git config --global user.email "your-email@example.com"&lt;/span&gt;
          &lt;span class="s"&gt;git remote set-url origin https://${{ secrets.YOUR_GITHUB_TOKEN }}@github.com/username/repo.git&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Error al ejecutar el script de Shell.
&lt;/h2&gt;

&lt;p&gt;Si llegaste hasta acá y aún no puedes ejecutar el script de Shell, asegúrate de que el script de Shell tenga &lt;strong&gt;&lt;code&gt;permisos de ejecución&lt;/code&gt;&lt;/strong&gt;. Puedes hacer esto agregando el siguiente comando a tu flujo de trabajo de GitHub Actions:&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="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 script&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;chmod +x ./.github/scripts/auto_commit.sh&lt;/span&gt;
    &lt;span class="s"&gt;bash ./.github/scripts/auto_commit.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Así debería estar quedando el archivo de workflow de GitHub Actions&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/daily-commit.yml&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;Daily Commit&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;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&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;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# This allows you to manually trigger the workflow&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;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 Git credentials&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;git config --global user.name ""your-username"&lt;/span&gt;
          &lt;span class="s"&gt;git config --global user.email "your-email@example.com"&lt;/span&gt;
          &lt;span class="s"&gt;git remote set-url origin https://${{ secrets.YOUR_GITHUB_TOKEN }}@github.com/username/repo.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;Run script&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;chmod +x ./.github/scripts/auto_commit.sh&lt;/span&gt;
          &lt;span class="s"&gt;bash ./.github/scripts/auto_commit.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Error después de correr GitHub Actions
&lt;/h2&gt;

&lt;p&gt;En este punto, el script de Shell ya corre, pero genera un error al intentar hacer el commit y empujar los cambios a tu repositorio. Aquí hay un ejemplo de lo que podría verse en la pestaña &lt;strong&gt;&lt;code&gt;"Actions"&lt;/code&gt;&lt;/strong&gt; (Acciones) de tu repositorio en GitHub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Run &lt;span class="nb"&gt;chmod&lt;/span&gt; +x ./.github/scripts/auto_commit.sh
&lt;span class="o"&gt;[&lt;/span&gt;main 8a928cc] Commit automatizado
 1 file changed, 1 insertion&lt;span class="o"&gt;(&lt;/span&gt;+&lt;span class="o"&gt;)&lt;/span&gt;
 create mode 100644 commit.txt
remote: Write access to repository not granted.
fatal: unable to access &lt;span class="s1"&gt;'https://github.com/username/repoName.git/'&lt;/span&gt;: The requested URL returned error: 403
Error: Process completed with &lt;span class="nb"&gt;exit &lt;/span&gt;code 128.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este error significa que el &lt;strong&gt;flujo de trabajo&lt;/strong&gt; de GitHub Actions &lt;strong&gt;NO tiene los permisos&lt;/strong&gt; necesarios para escribir/empujar a tu repositorio. Esto puede suceder por varias razones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Puede ser que el &lt;strong&gt;token de acceso personal que configuraste NO tenga los permisos correctos&lt;/strong&gt;. Asegúrate de que el &lt;em&gt;token de acceso personal&lt;/em&gt; tenga el permiso &lt;strong&gt;repo&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Asegúrate que el &lt;em&gt;token de acceso personal&lt;/em&gt; esté &lt;strong&gt;bien escrito&lt;/strong&gt; en el archivo del flujo de trabajo y en las &lt;strong&gt;"Secrets"&lt;/strong&gt; de tu repositorio.&lt;/li&gt;
&lt;li&gt;Asegúrate que los &lt;em&gt;permisos a los trabajos&lt;/em&gt; estén bien asignados en el archivo del flujo de trabajo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Asignar permisos a los trabajos
&lt;/h4&gt;

&lt;p&gt;Necesitarás asignar los &lt;strong&gt;permisos a los trabajos&lt;/strong&gt; en un flujo de trabajo utilizando la palabra clave &lt;strong&gt;&lt;code&gt;"permissions"&lt;/code&gt;&lt;/strong&gt;. En este caso, debería asignar el permiso &lt;strong&gt;&lt;code&gt;"contents"&lt;/code&gt;&lt;/strong&gt; al trabajo que estás ejecutando en el script. Aquí te muestro cómo:&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;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Permisos para el flujo de trabajo - Esto es necesario para crear un commit&lt;/span&gt;
  &lt;span class="na"&gt;issues&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
  &lt;span class="na"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conoce más sobre los permisos de los trabajos en &lt;a href="https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs"&gt;Asignar permisos a los trabajos&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;En resumen, para automatizar tus commits diarios en GitHub con GitHub Actions, necesitarás un script que realice el commit y un flujo de trabajo de GitHub Actions que ejecute ese script una vez al día. Además, necesitarás configurar las credenciales de Git en el flujo de trabajo para que puedas empujar a tu repositorio. Esto se puede hacer utilizando un token de acceso personal de GitHub y configurándolo como una variable de entorno en tu flujo de trabajo. Finalmente, necesitarás asignar los permisos correctos a tu flujo de trabajo para que pueda crear un commit y empujar a tu repositorio. Aquí te dejo los archivos que necesitarás para hacer esto:&lt;/p&gt;

&lt;h2&gt;
  
  
  Flujo de Trabajo de GitHub Actions
&lt;/h2&gt;

&lt;p&gt;Aquí está el archivo del &lt;em&gt;flujo de trabajo&lt;/em&gt; (workflow) completo:&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="c1"&gt;# .github/workflows/daily-commit.yml&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;Daily Commit&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;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&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;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt; &lt;span class="c1"&gt;# Esto se ejecutará todos los días a medianoche&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# esto permite ejecutar el flujo de trabajo manualmente&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;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Otorga los permisos para el flujo de trabajo - Esto es necesario para crear un commit&lt;/span&gt;
      &lt;span class="na"&gt;issues&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
      &lt;span class="na"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&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 Git credentials&lt;/span&gt; &lt;span class="c1"&gt;# Configura las credenciales de Git&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;git config --global user.name ""your-username"&lt;/span&gt;
          &lt;span class="s"&gt;git config --global user.email "your-email@example.com"&lt;/span&gt;
          &lt;span class="s"&gt;git remote set-url origin https://${{ secrets.YOUR_GITHUB_TOKEN }}@github.com/username/repo.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;Run script&lt;/span&gt; &lt;span class="c1"&gt;# Ejecuta el script&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;chmod +x ./.github/scripts/auto_commit.sh&lt;/span&gt;
          &lt;span class="s"&gt;bash ./.github/scripts/auto_commit.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Script de Shell
&lt;/h2&gt;

&lt;p&gt;Aquí está el archivo del &lt;em&gt;script de Shell&lt;/em&gt; completo:&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;# .github/scripts/auto_commit.sh&lt;/span&gt;
&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="c"&gt;# Check if the file exists, if not, create it&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ./days/auto-commit.md &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"- &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;  "&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ./days/auto-commit.md
    &lt;span class="c"&gt;# it create a new file with the current date and time as a list item. the space after the date creates a line break&lt;/span&gt;
    &lt;span class="c"&gt;# the &amp;gt; operator creates a new file&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="c"&gt;# Append (add) the current date and time to the existing content of the file as a new list item&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"- &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;  "&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ./days/auto-commit.md
    &lt;span class="c"&gt;# the &amp;gt;&amp;gt; operator appends the output to the end of the file&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Add the new file to the staging area&lt;/span&gt;
git add ./days/auto-commit.md

&lt;span class="c"&gt;# Make a commit with a message&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Commit automatizado &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Push the changes to GitHub&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;git commit -m "Happy coding! 🚀"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>githubactions</category>
      <category>shell</category>
    </item>
    <item>
      <title>Install Docker &amp; Portainer on Raspberry Pi</title>
      <dc:creator>Juan Diaz</dc:creator>
      <pubDate>Thu, 28 Oct 2021 21:03:08 +0000</pubDate>
      <link>https://dev.to/1diazdev/install-docker-on-raspberry-pi-12ph</link>
      <guid>https://dev.to/1diazdev/install-docker-on-raspberry-pi-12ph</guid>
      <description>&lt;p&gt;This is one of the easiest way to install docker and Portainer on a Raspberry Pi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Update and upgrade your system.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    Sudo apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install &lt;strong&gt;git&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   Sudo apt &lt;span class="nb"&gt;install &lt;/span&gt;git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install &lt;strong&gt;Docker&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    1. Mkdir Downloads
    2. &lt;span class="nb"&gt;cd &lt;/span&gt;Downloads
    3. git clone https://github.com/novaspirit/pi-hosted
    4. &lt;span class="nb"&gt;cd &lt;/span&gt;pi-hosted
    5. &lt;span class="nb"&gt;ls
    &lt;/span&gt;6.   ./install_docker.sh    &lt;span class="c"&gt;#install docker&lt;/span&gt;
    7. &lt;span class="nb"&gt;exit&lt;/span&gt;   &lt;span class="c"&gt;#logout&lt;/span&gt;
    8. login
    9. &lt;span class="nb"&gt;groups&lt;/span&gt;  &lt;span class="c"&gt;# to check if docker is in the group&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install &lt;strong&gt;Portainer&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    1. &lt;span class="nb"&gt;cd &lt;/span&gt;Downloads/pi-hosted
    2. ./install_portainer.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reference:
&lt;/h2&gt;

&lt;p&gt;Thanks to &lt;a href="//novaspirit.com"&gt;Novaspirit tech&lt;/a&gt;, I can not only install docker with one script, but also setup my own home server and host plenty of apps. Follow his channel to see more tutorial.&lt;/p&gt;

</description>
      <category>docker</category>
    </item>
    <item>
      <title>How to Boot Raspberry Pi 4 From a USB SSD HDD</title>
      <dc:creator>Juan Diaz</dc:creator>
      <pubDate>Thu, 28 Oct 2021 20:38:34 +0000</pubDate>
      <link>https://dev.to/1diazdev/how-to-boot-raspberry-pi-4-from-a-usb-ssd-hdd-5ffa</link>
      <guid>https://dev.to/1diazdev/how-to-boot-raspberry-pi-4-from-a-usb-ssd-hdd-5ffa</guid>
      <description>&lt;p&gt;A Raspberry Pi is such a useful device so why don't give it more power by making it boot from an SSD instead of the default SD card?&lt;br&gt;
Raspberry Pi Desktop is the recommended OS for this tutorial. Visit the link to learn how to &lt;a href="https://www.raspberrypi.com/documentation/computers/getting-started.html"&gt;Setting up your Raspberry Pi&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Connect to Raspberry Pi over SSH&lt;br&gt;
Default username is pi &amp;amp; password is: raspberry&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh pi@YOUR_RPI_IP

&lt;/code&gt;&lt;/pre&gt;




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

&lt;p&gt;Update OS and firmware&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt full-upgrade
&lt;span class="nb"&gt;sudo &lt;/span&gt;rpi-update
&lt;/code&gt;&lt;/pre&gt;




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

&lt;p&gt;Reboot Raspberry Pi&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;




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

&lt;p&gt;How to Update EEPROM on Raspberry Pi 4 For USB Boot...&lt;/p&gt;

&lt;p&gt;Install latest bootloader&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;rpi-eeprom-update &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




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

&lt;p&gt;Launch this tool for final configurations&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;raspi-config
    advance options &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; boot order &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; USB
    advance options &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; bootloader Version &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; E1 - last version ROM
    display options &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Resolution &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; MODE 82 - 16:9
&lt;/code&gt;&lt;/pre&gt;




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

&lt;p&gt;Reboot Raspberry Pi&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;




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

&lt;p&gt;Copy SD to USB or SSD &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Connect to Pi using HDMI or VNC&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enable VNC in the Pi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Interface menu &amp;gt; VNC &amp;gt; enable. Using the code below:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo raspi-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to Menu &amp;gt; accessories &amp;gt; SD card copy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From SD (dev/mmcblk) to SSD&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;




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

&lt;p&gt;Once it Finish, Turn off the pi&lt;/p&gt;

&lt;p&gt;remove the SD and boot from SSD&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;poweroff
&lt;/code&gt;&lt;/pre&gt;




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

</description>
    </item>
    <item>
      <title>Hacktoberfest 2021</title>
      <dc:creator>Juan Diaz</dc:creator>
      <pubDate>Wed, 27 Oct 2021 18:34:52 +0000</pubDate>
      <link>https://dev.to/1diazdev/hacktoberfest-2021-3dk9</link>
      <guid>https://dev.to/1diazdev/hacktoberfest-2021-3dk9</guid>
      <description>&lt;p&gt;Hurry up! The Hacktoberfest is almost Over. &lt;/p&gt;

&lt;p&gt;I just register for the Sonar X Hacktoberfest 2021: The Future of JavaScript Webinar.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>hacktoberfest</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
