DEV Community

Guillermo Garcia
Guillermo Garcia

Posted on • Originally published at ahioros.info on

Github Actions y Dockerfile Multi-Stage

Vamos a pasar el pipeline que hicimos en Azure Devops a Github Actions.

¿Qué es Github Actions?

Es una plataforma de integración continua (CI) y Continuous Delivery (CD) para el desarrollo de código.

Este servicio que proporciona GitHub tiene costo, pero cuenta con una versión gratis.

A la escritura de este post el plan gratis te da lo siguiente:

- Storage: 500 MB
- 2,000 Minutos (per month)
Enter fullscreen mode Exit fullscreen mode

Tip, al igual que Azure DevOps (agent pools), en GitHub Actions puedes configurar self-hosted runners para que se ejecuten en tu propio servidor/equipo y esto es libre de los minutos que te dan gratis. Hay ciertos requisitos por ejemplo: si vas a usar docker, debe ser en un equipo con Linux, te dejo toda la información aquí.

Nota Si quieres saber cómo hacer un self-hosted runner, deja tu comentario y te enseñaré a hacerlo.

Mientras que en Azure DevOps se llaman pipelines, en Github Actions se llaman workflows.

Nota: El ejemplo que estoy mostrándo consta de dos repositorios:

a. El repositorio con el código de la aplicación. Este repositorio es en el que realizamos las configuraciones del workflow
Enter fullscreen mode Exit fullscreen mode

Link aquí

b. El repositorio con el código de los manifests para kubernetes.
Enter fullscreen mode Exit fullscreen mode

Link aquí

Configuración de Github Actions Workflows

Prerequisitos

En el ejemplo que vamos a desarrollar tenemos que hacer unas configuraciones:

    1. Configurar permisos de GitHub Actions workflow:

    Ve a repo settings -> Actions -> General -> Workflow Permissions:
Enter fullscreen mode Exit fullscreen mode

Image description


    2. Crear PAT (Personal Access Token):

    Ve a tu GitHub perfil -> Settings -> Developer settings -> Personal access tokens -> Tokens(classic):

Enter fullscreen mode Exit fullscreen mode

Image description


    3. Crear secrets para el repositorio:

    Ve a tu repo settings -> Secrets and variables -> Actions -> Repository Secrets:

Enter fullscreen mode Exit fullscreen mode

Image description

Nota: Donde puedes ver que tengo el usuario y el password con el que me voy a conectar hacia mi docker registry, en este caso es dockerhub.com. El API_TOKEN_GITHUB es el Personal Access Token que creamos en el paso 2.

4. Tener un repositorio donde están los manifest de kubernetes, ejemplo:
Enter fullscreen mode Exit fullscreen mode
    https://github.com/ahioros/deploy-workflow-react-example
Enter fullscreen mode Exit fullscreen mode

Para crear un workflow se deben crear unas carpetas en nuestro proyecto de Github.

    .github/workflows/workflow-react-example.yml
Enter fullscreen mode Exit fullscreen mode

El contenido de nuestro archivo yaml es el siguiente:

    ---
    name: workflow-react-example
    on:
      push:
        branches:
        - master

    jobs:
      CI:
        runs-on: ubuntu-latest

        steps:

        - name: checkout
          uses: actions/checkout@v4.1.0

        - name: Install Node.js
          uses: actions/setup-node@v4.0.0
          with:
            node-version: 15.x

        - name: npm install
          run: npm install

        - name: npm lint
          run: npm run lint

        - name: npm prettier
          run: npm install prettier && npx prettier . --write && npm run prettier

        - name: npm test
          run: CI=true npm run test

        - name: npm build
          run: npm run build

      Build_Docker_Image_ReactApp:
        needs:
        - CI

        runs-on: ubuntu-latest

        steps:

        - name: checkout
          uses: actions/checkout@v4.1.0

        - name: BuildAndPush
          uses: docker/login-action@v3.3.0
          with:
            username: "${{ secrets.DOCKERHUBCONNECTION_DOCKER_USERNAME }}"
            password: "${{ secrets.DOCKERHUBCONNECTION_DOCKER_PASSWORD }}"

        - name: Build the Docker image
          run: docker build . --file "Dockerfile" -t ahioros/rdicidr:${{ github.run_id }}

        - name: Create latest image as well
          run: docker tag ahioros/rdicidr:${{ github.run_id }} ahioros/rdicidr:latest

        - name: Push Docker image with the version number
          run: docker push ahioros/rdicidr:${{ github.run_id }}

        - name: Push the latest tag
          run: docker push ahioros/rdicidr:latest

        - name: Logout
          run: docker logout

      Deployment:
        needs:
        - Build_Docker_Image_ReactApp

        runs-on: ubuntu-latest
        steps:

        - name: checkout
          uses: actions/checkout@v4.1.0
          with:
            token: ${{ secrets.GITHUB_TOKEN }}
            repository: ahioros/deploy-workflow-react-example
            fetch-depth: 0
            persist-credentials: false

        - name: Deploy
          run: |-
            TAG=${{ github.run_id }}
            EXP="image: ahioros/rdicidr:[0-9]+"
            REP="image: ahioros/rdicidr:$TAG"
            sed -E -i "s|$EXP|$REP|g" k8s/02-deployment.yaml
            git config user.name "Argo CD"
            git config user.email "ArgoCD@example.com"
            git checkout master --
            git add --all
            git commit -m "Deployment ID: ${{ github.run_id }}"
          shell: bash

        - name: Push changes
          uses: ad-m/github-push-action@master
          with:
            repository: ahioros/deploy-workflow-react-example
            GITHUB_TOKEN: ${{ secrets.API_TOKEN_GITHUB }}
    ---
Enter fullscreen mode Exit fullscreen mode

El workflow es el mismo que el pipeline que se hizo en Azure Devops

Azure:

CodeValidation -> Containerized -> Deploy

Github Actions:

CI -> Build_Docker_Image_ReactApp -> Deployment

Aquí te dejo el repositorio de Azure para que lo compares:

https://dev.azure.com/guillermogarcialedezma/DockerHub%20Test/

Cada vez que hagas un cambio en el código y lo subas/empujes (push) al branch de master, el workflow se ejecutará.
Recuerda que esto es solo un ejemplo y no es recomendable subir/empujar directamente a tu rama/branch principal main/master.

En nuestro siguiente post haremos la configuración de Argo CD, para automatizar el despliegue en kubernetes con Github Actions.

NOTA: Mira el Dockerfile ya que ahora lo hice multi-stage para que tenga un menor peso.

Antes la imagen pesaba 1.09GB
Ahora la imagen pesa: 188MB

Image description

Image description

Top comments (0)