Nota: Los ejecutores hospedados en GitHub no son compatibles con GitHub Enterprise Server actualmente. Puedes encontrar más información sobre el soporte que se tiene planeado en el futuro en el Itinerario público de GitHub.
Introducción
En esta guía se muestran ejemplos de flujo de trabajo que configuran un contenedor de servicio mediante la imagen redis
de Docker Hub. El flujo de trabajo ejecuta un script para crear un cliente Redis y rellenar el cliente con datos. Para probar que el flujo de trabajo crea y rellena el cliente Redis, el script imprime los datos del cliente en la consola.
Nota: Si tus flujos de trabajo utilizan acciones de contenedor de Docker, contenedores de jobs o de servicio, entonces debes utilizar un ejecutor Linux:
- Si estás utilizando ejecutores hospedados en GitHub, debes utilizar un ejecutor de Ubuntu.
- 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 una comprensión básica de YAML, la sintaxis para GitHub Actions, y Redis. Para obtener más información, consulta:
- "Aprende sobre las GitHub Actions"
- "Comenzar con Redis"en la documentación de Redis
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: Redis container 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 `container-job` ejecuta en el contenedor: node:10.18-jessie
# Contenedores de servicio para ejecutar con `container-job`
services:
# Etiqueta usada para acceder al contenedor de servicio redis:
# Imagen del contenedor Docker Hub
image: redis
# Establece revisiones de estado para esperar hasta que Redis haya comenzado
options: >-
--health-cmd "redis-cli ping"
--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 Redis
# Ejecuta un script que crea un cliente Redis, 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 Redis.
env:
# El nombre del host utilizado para comunicarse con el contenedor de servicio Redis
REDIS_HOST: redis
# El puerto Redis predeterminado
REDIS_PORT: 6379
Configurar el trabajo del contenedor
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 reds
. 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 redis
, e incluye opciones de verificación de estado para garantizar que el servicio se está ejecutando. Para obtener más información, consulta la imagen de redis 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 servicio para ejecutar con `container-job`
services:
# Etiqueta utilizada para acceder al contenedor de servicio
redis:
# Imagen de Docker Hub
image: redis
# Establece revisiones de estado para esperar hasta que Redis haya comenzado
options: >-
--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:
- Verifica el repositorio en el ejecutor
- Instala las dependencias
- 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 Redis
# Ejecuta un script que crea un cliente Redis, 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 Redis.
env:
# El nombre del host utilizado para comunicarse con el contenedor del servicio Redis
REDIS_HOST: redis
# El puerto Redis predeterminado
REDIS_PORT: 6379
El script client.js busca las variables de ambiente REDIS_HOST
y REDIS_PORT
para crear al cliente. El flujo de trabajo configura esas dos variables de ambiente como parte del paso "Connect to Redis" para hacerlas disponibles para el script client.js. Para obtener más información acerca del script, consulta la sección "Probar el contenedor de servicio de Redis".
El nombre del host del servicio Redis es la etiqueta que configuraste en tu flujo de trabajo, en este caso, redis
. Dado que los contenedores Docker en la misma red de puentes definida por el usuario abren todos los puertos por defecto, podrás acceder al contenedor del servicio en el puerto Redis predeterminado 6379.
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: Redis runner example
on: push
jobs:
# Etiqueta del trabajo del ejecutor
runner-job:
# Debes usar un entorno Linux cuando utilices contenedores de servicio o trabajos de contenedor
runs-on: ubuntu-latest
# Contenedores de servicio para ejecutar con `runner-job`
services:
# Etiqueta usada para acceder al contenedor de servicio
redis:
# Imagen de Docker Hub
image: redis
# Establece revisiones de estado para esperar hasta que Redis haya comenzado
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Asigna el puerto 6379 en el contenedor de servicio al host
- 6379:6379
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 Redis
# Ejecuta un script que crea un cliente Redis, 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 Redis.
env:
# El nombre del host utilizado para comunicarse con el contenedor del servicio Redis
REDIS_HOST: localhost
# El puerto Redis predeterminado
REDIS_PORT: 6379
Configurar el trabajo del ejecutador
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 reds
. 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 redis
, e incluye opciones de verificación de estado para garantizar que el servicio se está ejecutando. Para obtener más información, consulta la imagen de redis en Docker Hub.
El flujo de trabajo asigna el puerto 6379 en el contenedor del servicio Redis al host 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 ejecutor
runner-job:
# Debes usar un entorno Linux cuando utilices contenedores de servicio o trabajos de contenedor
runs-on: ubuntu-latest
# Contenedores de servicio para ejecutar con `runner-job`
services:
# Etiqueta usada para acceder al contenedor de servicio
redis:
# Imagen de Docker Hub
image: redis
# Establece revisiones de estado para esperar hasta que Redis haya comenzado
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Asigna el puerto 6379 en el contenedor de servicio al host
- 6379:6379
Configurar los pasos
El flujo de trabajo realiza los siguientes pasos:
- Verifica el repositorio en el ejecutor
- Instala las dependencias
- Ejecuta un script para crear un cliente
steps:
# Descarga una copia del código en tu repositorio antes de ejecutra 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 Redis
# Ejecuta un script que crea un cliente Redis, 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 Redis.
env:
# El nombre del host utilizado para comunicarse con el contenedor del servicio Redis
REDIS_HOST: localhost
# El puerto Redis predeterminado
REDIS_PORT: 6379
El script client.js busca las variables de ambiente REDIS_HOST
y REDIS_PORT
para crear al cliente. El flujo de trabajo configura esas dos variables de ambiente como parte del paso "Connect to Redis" para hacerlas disponibles para el script client.js. Para obtener más información acerca del script, consulta la sección "Probar el contenedor de servicio de Redis".
El nombre del hospedaje es localhost
o 127.0.0.1
.
Probar el contenedor de servicio Redis
Puedes probar tu flujo de trabajo usando el siguiente script, que crea un cliente Redis y rellena el cliente con algunos datos del marcador de posición. Luego, el script imprime los valores almacenados en el cliente Redis en el terminal. Tu script puede usar cualquier lenguaje que desees, pero este ejemplo usa Node.js y el módulo de npm redis
. Para obtener más información, consulta el Módulo Redis de npm.
Puedes modificar client.js para incluir cualquier operación de Redis que necesite tu flujo de trabajo. En este ejemplo, el script crea la instancia del cliente Redis, 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 redis = require("redis");
// Crea un nuevo cliente Redis
// Si no se establece REDIS_HOST, el host predeterminado es localhost
// Si no se establece REDIS_PORT, el puerto predeterminado es 6379
const redisClient = redis.createClient({
host: process.env.REDIS_HOST,
port: process.env.REDIS_PORT
});
redisClient.on("error", function(err) {
console.log("Error " + err);
});
// Establece la clave "octocat" para un valor de "Mona the octocat"
redisClient.set("octocat", "Mona the Octocat", redis.print);
// Establece una clave "octocat", campo para "species" y "value" para "Cat and Octopus"
redisClient.hset("species", "octocat", "Cat and Octopus", redis.print);
// Establece una clave para "octocat", campo para "species" y "value" para "Dinosaur and Octopus"
redisClient.hset("species", "dinotocat", "Dinosaur and Octopus", redis.print);
// Establece una clave para "octocat", campo para "species" y "value" para "Cat and Robot"
redisClient.hset(["species", "robotocat", "Cat and Robot"], redis.print);
// Obtiene todos los campos en la clave "species"
redisClient.hkeys("species", function (err, replies) {
console.log(replies.length + " replies:");
replies.forEach(function (reply, i) {
console.log(" " + i + ": " + reply);
});
redisClient.quit();
});
El script crea un nuevo cliente Redis utilizando el método createClient
, que acepta un parámetro de host
y port
. El script usa el REDIS_HOST
y variables de entorno REDIS_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 6379.
El script usa los métodos set
y hset
para rellenar la base de datos con algunas claves, campos y valores. Para confirmar que el cliente Redis contiene los datos, el script imprime los contenidos de la base de datos en el registro de la consola.
Cuando ejecutas este flujo de trabajo, deberías ver el siguiente resultado en el paso "Conectar con Redis" que confirma que creaste el cliente Redis y agregaste datos:
Reply: OK
Reply: 1
Reply: 1
Reply: 1
3 replies:
0: octocat
1: dinotocat
2: robotocat