👋 We've unified all of GitHub's product documentation in one place! Check out the content for REST API, GraphQL API, and Developers. Learn more on the GitHub blog.


Frecuentemente publicamos actualizaciones de nuestra documentación. Es posible que la traducción de esta página esté en curso. Para conocer la información más actual, visita la documentación en inglés. Si existe un problema con las traducciones en esta página, por favor infórmanos.

Crear contenedores de servicios PostgreSQL

Puedes crear un contenedor de servicios PostgreSQL para usar en tu flujo de trabajo. En esta guía se muestran ejemplos de cómo crear un servicio PostgreSQL para trabajos que se ejecutan en contenedores o, directamente, en la máquina del ejecutor.

En este artículo

¿Pudiste encontrar lo que estabas buscando?

Introducción

En esta guía se muestran ejemplos de flujos de trabajo que configuran un contenedor de servicios mediante la imagen postgres de Docker Hub. El flujo de trabajo ejecuta un script para crear un cliente de PostgreSQL y rellenarlo con datos. Para probar que el flujo de trabajo crea y rellena el cliente de PostgreSQL, el script imprime los datos del cliente en la consola.

Nota: Si tus flujos de trabajo utilizan acciones de contenedor de Docker o contenedores de servicio, entonces debes utilizar un ejecutor de Linux:

  • Si estás utilizando ejecutores hospedados en GitHub, debes utilizar el ejecutor ubuntu-latest.
  • Si estás utilizando ejecutores auto-hospedados, debes utilizar una máquina Linux como tu ejecutor, y ésta debe tener Docker instalado.

Prerrequisitos

Debes familiarizarte con la forma en la que trabajan los contenedores de servicio con GitHub Actions y las diferencias de conexión de red entre los jobs que se están ejecutando directamente en el ejecutor y las que lo hacen en un contenedor. Para obtener más información, consulta la sección "Acerca de los contenedores de servicios".

También puede ser útil tener un conocimiento básico de YAML, la sintaxis para las GitHub Actions, y de PostgreSQL. Para obtener más información, consulta:

Ejecutar trabajos en contenedores

La configuración de jobs para su ejecución en un contenedor simplifica las configuraciones de red entre el job y los contenedores de servicio. Los contenedores de Docker en el mismo puente de red definido por el usuario exponen todos los puertos entre ellos, así que no necesitas mapear ninguno de los puertos para contenedores de servicio en el alojamiento de Docker. Puedes acceder al contenedor de servicio desde el contenedor del job utilizando la etiqueta que configuras en el flujo de trabajo.

Puedes copiar este archivo de flujo de trabajo al directorio .github/workflows de tu repositorio y modificarlo como lo requieras.

name: PostgreSQL service example
on: push

Jobs:
  # Etiqueta del trabajo del contenedor
  container-job:
    # Los contenedores deben ejecutarse en sistemas operativos basados en Linux
    runs-on: Ubuntu-latest
    # Imagen de Docker Hub que ejecuta 'container-job ' en
    el contenedor: node:10.18-jessie

    # Contenedores de servicios para ejecutar con servicios de 'container-job ':
      # Etiqueta usada para acceder al contenedor de servicios
      Postgres:
        # Imagen de Docker Hub
        image: postgres
        # Proporciona la contraseña para Postgres
        env:
          POSTGRES_PASSWORD: postgres
        # Establece chequeos de estado para esperar hasta que postgres inicie las
        opciones: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    Steps:
      # Descarga una copia del código en tu repositorio antes de ejecutar pruebas de CI
      - name: Check out repository code
        uses: actions/checkout@v2

      # Realiza una instalación limpia de todas las dependencias en el archivo 'package.json'
      # Para obtener más información, consulta https://docs.npmjs.com/cli/ci.html
      - name: Install dependencies
        run: npm ci

      - name: Connect to PostgreSQL
        # Ejecuta un script que crea un cliente de PostgreSQL, rellena
        # el cliente con datos y recupera datos
        run: node client.js
        # Variable de entorno utilizada por el script 'client.js' para crear un nuevo cliente de PostgreSQL.
        env:
          # Nombre del host utilizado para comunicarse con el contenedor de servicios PostgreSQL
          POSTGRES_HOST: Postgres
          # Puerto PostgreSQL predeterminado
          POSTGRES_PORT: 5432

Configurar el trabajo del ejecutador

Este flujo de trabajo configura un job que se ejecuta en el contenedor node:10.18-jessie y utiiza el ejecutor ubuntu-latest hospedado en GitHub como el alojamiento de Docker para el contenedor. Para obtener más información acerca del contenedor node:10.18-jessie, consulta la imagen del nodo en Docker Hub.

El flujo de trabajo configura un contenedor de servicio con la etiqueta postgres. Todos los servicios se deben ejecutar en un contenedor, entonces cada servicio requiere que especifiques la image del mismo. Este ejemplo utiliza la imagen del contenedor postgres, proporciona la cotraseña predeterminada de PostgreSQL, e incluye las opciones de revisión de estado para garantizar que el servicio se está ejecutando. Para obtener más información, consulta la imagen de postgre en Docker Hub.

jobs:
  # Etiqueta del trabajo del contenedor
  container-job:
    # Los contenedores deben ejecutarse en sistemas operativos basados en Linux
    runs-on: ubuntu-latest
    # Imagen de Docker Hub que `container-job` ejecuta en el contenedor: node:10.18-jessie

    # Contenedores de servicios para ejecutar con servicios de `container-job`:
      # Etiqueta utilizada para acceder al contenedor de servicios
      redis:
        # Imagen de Docker Hub
        image: redis
        # Establece revisiones de estado para esperar hasta que Redis inicie las
        opciones: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

Configurar los pasos

El flujo de trabajo realiza los siguientes pasos:

  1. Verifica el repositorio en el ejecutor
  2. Instala las dependencias
  3. Ejecuta un script para crear un cliente
steps:
  # Descarga una copia del código en tu repositorio antes de ejecutar pruebas de CI
  - name: Check out repository code
    uses: actions/checkout@v2

  # Realiza una instalación limpia de todas las dependencias en el archivo 'package.json'
  # Para obtener más información, consulta https://docs.npmjs.com/cli/ci.html
  - name: Install dependencies
    run: npm ci

  - name: Connect to PostgreSQL
    # Ejecuta un script que crea un cliente de PostgreSQL, rellena
    # el cliente con datos y recupera datos
    run: node client.js
    # Variable de entorno utilizada por el script 'client.js ' para crear
    # un nuevo cliente de PostgreSQL.
    env:
      # Nombre del host utilizado para comunicarse con el contenedor de servicios PostgreSQL
      POSTGRES_HOST: Postgres
      # Puerto PostgreSQL predeterminado
      POSTGRES_PORT: 5432

El script client.js busca las variables del ambiente de POSTGRES_HOST y POSTGRES_PORT para crear al cliente. El flujo de trabajo configura estas dos variables de ambiente como parte del paso "Conectar a PostgreSQL" para hacerlos disponibles para el script client.js. Para obtener más información acerca del script, consulta "Probar el contenedor de servicio de PostgreSQL".

El nombre del host del servicio PostgreSQL es la etiqueta que configuraste en tu flujo de trabajo, en este caso, postgres. Dado que los contenedores de Docker de la misma red de puentes definida por el usuario abren todos los puertos por defecto, podrás acceder al contenedor de servicios en el puerto 5432 PostgreSQL predeterminado.

Ejecutar trabajos directamente en la máquina del ejecutor

Cuando ejecutes un trabajo directamente en la máquina del ejecutor, deberás asignar los puertos del contenedor de servicios a los puertos del host de Docker. Puedes acceder a los contenedores de servicios desde el host de Docker utilizando localhost y el número de puerto del host de Docker.

Puedes copiar este archivo de flujo de trabajo al directorio .github/workflows de tu repositorio y modificarlo como lo requieras.

name: PostgreSQL Service Example
on: push

Jobs:
  # Etiqueta del trabajo del ejecutador
  runner-job:
    # Debes usar un entorno Linux cuando uses contenedores de servicios o trabajos del contenedor
    runs-on: ubuntu-latest

    # Contenedores de servicios para ejecutar con servicios de 'runner-job':
      # Etiqueta usada para acceder al contenedor de servicios
      postgres:
        # Imagen de Docker Hub
        image: postgres
        # Proporciona la contraseña para postgres
        env:
          POSTGRES_PASSWORD: Postgres
        # Establece chequeos de estado para esperar hasta que postgres inicie las
        opciones: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          # Asigna el puerto tcp 5432 del contenedor de servicios al host
          -5432:5432

    Steps:
      # Descarga una copia del código en tu repositorio antes de ejecutar pruebas de CI
      - name: Check out repository code
        uses: actions/checkout@v2

      # Realiza una instalación limpia de todas las dependencias en el archivo 'package.json'
      # Para obtener más información, consulta https://docs.npmjs.com/cli/ci.html
      - name: Install dependencies
        run: npm ci

      - name: Connect to PostgreSQL
        # Ejecuta un script que crea un cliente de PostgreSQL, rellena
        # el cliente con datos y recupera datos
        Run: node client.js
        # Variable de entorno utilizada por el script 'client.js' para crear
        # un nuevo cliente de PostgreSQL.
        env:
          # Nombre del host utilizado para comunicarse con el contenedor de servicios PostgreSQL
          POSTGRES_HOST: localhost
          # Puerto PostgreSQL predeterminado
          POSTGRES_PORT: 5432

Configurar el trabajo del ejecutor

El ejemplo utiliza el ejecutor ubuntu-latest hospedado en GitHub como el hospedaje de Docker.

El flujo de trabajo configura un contenedor de servicio con la etiqueta postgres. Todos los servicios se deben ejecutar en un contenedor, entonces cada servicio requiere que especifiques la image del mismo. Este ejemplo utiliza la imagen del contenedor postgres, proporciona la cotraseña predeterminada de PostgreSQL, e incluye las opciones de revisión de estado para garantizar que el servicio se está ejecutando. Para obtener más información, consulta la imagen de postgre en Docker Hub.

El flujo de trabajo asigna el puerto 5432 del contenedor de servicios PostgreSQL al host de Docker. Para obtener más información acerca de la palabra clave ports, consulta "Acerca de los contenedores de servicio".

jobs:
  # Etiqueta del trabajo del ejecutador
  Runner-Job:
    # Debes usar un entorno Linux cuando uses contenedores de servicios o trabajos del contenedor
    runs-on: ubuntu-latest

    # Contenedores de servicios para ejecutar con servicios 'runner-job':
      # Etiqueta usada para acceder al contenedor de servicios
      Postgres:
        # Imagen de Docker Hub
        image: postgres
        # Proporciona la contraseña para postgres
        Env:
          POSTGRES_PASSWORD: postgres
        # Establece chequeos de estado para esperar hasta que postgres inicie las
        opciones: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        Ports:
          # Asigna el puerto tcp 5432 del contenedor de servicios al host
          -5432:5432

Configurar los pasos

El flujo de trabajo realiza los siguientes pasos:

  1. Verifica el repositorio en el ejecutor
  2. Instala las dependencias
  3. Ejecuta un script para crear un cliente
steps:
  # Descarga una copia del código en tu repositorio antes de ejecutar pruebas de CI
  - name: Check out repository code
    uses: actions/checkout@v2

  # Realiza una instalación limpia de todas las dependencias en el archivo 'package. JSON'
  # Para obtener más información, consulta https://docs.npmjs.com/cli/ci.html
  - name: Install dependencies
    run: npm ci

  - name: Connect to PostgreSQL
    # Ejecuta un script que crea un cliente de PostgreSQL, rellena
    # el cliente con datos y recupera datos
    Run: node Client. js
    # Variable de entorno utilizada por el script 'client.js' para crear
    # un nuevo cliente de PostgreSQL.
    env:
      # Nombre del host utilizado para comunicarse con el contenedor de servicios PostgreSQL
      POSTGRES_HOST: localhost
      # Puerto PostgreSQL predeterminado
      POSTGRES_PORT: 5432

El script client.js busca las variables del ambiente de POSTGRES_HOST y POSTGRES_PORT para crear al cliente. El flujo de trabajo configura estas dos variables de ambiente como parte del paso "Conectar a PostgreSQL" para hacerlos disponibles para el script client.js. Para obtener más información acerca del script, consulta "Probar el contenedor de servicio de PostgreSQL".

El nombre del hospedaje es localhost o 127.0.0.1.

Probar el contenedor de servicios de PostgreSQL

Puedes probar tu flujo de trabajo usando el siguiente script, que crea un cliente de PostgreSQL y agrega una tabla nueva con algunos datos de marcador de posición. Luego, el script le imprime los valores almacenados en el cliente de PostgreSQL al terminal. Tu script puede usar el lenguaje que quieras, pero este ejemplo usa Node.js y el módulo npm de pg. Para obtener más información, consulta el módulo npm de pg.

Puedes modificar client.js para incluir cualquier operación de PostgreSQL que necesite tu flujo de trabajo. En este ejemplo, el script crea la instancia de cliente de PostgreSQL, crea una tabla, agrega datos de marcador de posición y luego recupera los datos.

Agrega a tu repositorio un archivo nuevo llamado client.js con el siguiente código.

const { Client } = require('pg');

const pgclient = new Client({
    host: process.env.POSTGRES_HOST,
    port: process.env.POSTGRES_PORT,
    user: 'postgres',
    password: 'postgres',
    database: 'postgres'
});

pgclient.connect();

const table = 'CREATE TABLE student(id SERIAL PRIMARY KEY, firstName VARCHAR(40) NOT NULL, lastName VARCHAR(40) NOT NULL, age INT, address VARCHAR(80), email VARCHAR(40))'
const text = 'INSERT INTO student(firstname, lastname, age, address, email) VALUES($1, $2, $3, $4, $5) RETURNING *'
const values = ['Mona the', 'Octocat', 9, '88 Colin P Kelly Jr St, San Francisco, CA 94107, United States', 'octocat@github.com']

pgclient.query(table, (err, res) => {
    if (err) throw err
});

pgclient.query(text, values, (err, res) => {
    if (err) throw err
});

pgclient.query('SELECT * FROM student', (err, res) => {
    if (err) throw err
    console.log(err, res.rows) // Print the data in student table
    pgclient.end()
});

El script crea un nuevo Client (cliente) de PostgreSQL, que acepta un host y un parámetro de port (puerto). El script usa las variables de entorno POSTGRES_HOST y POSTGRES_PORT para establecer la dirección IP y el puerto del cliente. Si host y port no están definidos, el host predeterminado es localhost y el puerto predeterminado es 5432.

El script crea una tabla y la rellena con datos de marcador de posición. Para probar que la base de datos de PostgreSQL contenga los datos, el script imprime los contenidos de la tabla en el registro de la consola.

Cuando ejecutes este flujo de trabajo, debes ver el siguiente resultado en el paso "Connect to PostgreSQL" (Conectar con PostgreSQL) que confirma que creaste el cliente de PostgreSQL y agregaste los datos:

null [ { id: 1,
    firstname: 'Mona the',
    lastname: 'Octocat',
    age: 9,
    address:
     '88 Colin P Kelly Jr St, San Francisco, CA 94107, United States',
    email: 'octocat@github.com' } ]

¿Pudiste encontrar lo que estabas buscando?

Pregunta a una persona

¿No puedes encontrar lo que estás buscando?

Contáctanos