lunes, 12 de agosto de 2024

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](https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions).

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

    - Storage: 500 MB
    - 2,000 Minutos (per month)

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í](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners).

**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
[Link aquí](https://github.com/ahioros/workflow-react-example)

    b. El repositorio con el código de los manifests para kubernetes.
[Link aquí](https://github.com/ahioros/deploy-workflow-react-example)

## 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:
    2. Crear PAT (Personal Access Token):

    Ve a tu GitHub perfil -> Settings -> Developer settings -> Personal access tokens -> Tokens(classic):
    3. Crear secrets para el repositorio:

    Ve a tu repo settings -> Secrets and variables -> Actions -> Repository Secrets:
**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:

```bash
    https://github.com/ahioros/deploy-workflow-react-example
```

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

```bash
    .github/workflows/workflow-react-example.yml
```

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 }}
    ---

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**

No hay comentarios.: