Nota: Actualmente los ejecutores hospedados en GitHub no se admiten en GitHub Enterprise Server. Puede ver más información sobre la compatibilidad futura planeada en GitHub public roadmap.
Introducción
En esta guía se muestran ejemplos de flujos de trabajo que configuran un contenedor de servicios 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 en los flujos de trabajo se usan acciones de contenedor de Docker, contenedores de trabajos o de servicios, tendrá que utilizar un ejecutor de 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, vea «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 más información, consulte:
- "Más información sobre las Acciones de GitHub"
- "Introducción a 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.
Puede copiar este archivo de flujo de trabajo al directorio .github/workflows
del repositorio y modificarlo según sea necesario.
name: Redis container example on: push jobs: # Label of the container job container-job: # Containers must run in Linux based operating systems runs-on: ubuntu-latest # Docker Hub image that `container-job` executes in container: node:10.18-jessie # Service containers to run with `container-job` services: # Label used to access the service container redis: # Docker Hub image image: redis # Set health checks to wait until redis has started options: >- --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5 steps: # Downloads a copy of the code in your repository before running CI tests - name: Check out repository code uses: actions/checkout@v4 # Performs a clean installation of all dependencies in the `package.json` file # For more information, see https://docs.npmjs.com/cli/ci.html - name: Install dependencies run: npm ci - name: Connect to Redis # Runs a script that creates a Redis client, populates # the client with data, and retrieves data run: node client.js # Environment variable used by the `client.js` script to create a new Redis client. env: # The hostname used to communicate with the Redis service container REDIS_HOST: redis # The default Redis port REDIS_PORT: 6379
name: Redis container example
on: push
jobs:
# Label of the container job
container-job:
# Containers must run in Linux based operating systems
runs-on: ubuntu-latest
# Docker Hub image that `container-job` executes in
container: node:10.18-jessie
# Service containers to run with `container-job`
services:
# Label used to access the service container
redis:
# Docker Hub image
image: redis
# Set health checks to wait until redis has started
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
# Downloads a copy of the code in your repository before running CI tests
- name: Check out repository code
uses: actions/checkout@v4
# Performs a clean installation of all dependencies in the `package.json` file
# For more information, see https://docs.npmjs.com/cli/ci.html
- name: Install dependencies
run: npm ci
- name: Connect to Redis
# Runs a script that creates a Redis client, populates
# the client with data, and retrieves data
run: node client.js
# Environment variable used by the `client.js` script to create a new Redis client.
env:
# The hostname used to communicate with the Redis service container
REDIS_HOST: redis
# The default Redis port
REDIS_PORT: 6379
Configurar el trabajo del contenedor
Este flujo de trabajo configura un trabajo que se ejecuta en el contenedor node:10.18-jessie
y utiliza el ejecutor ubuntu-latest
hospedado en GitHub como el host de Docker para el contenedor. Para obtener más información acerca del contenedor node:10.18-jessie
, vea la imagen de nodo en Docker Hub.
El flujo de trabajo configura un contenedor de servicios con la etiqueta redis
. Todos los servicios se deben ejecutar en un contenedor, por lo que cada servicio requiere que especifiques la image
del mismo. En este ejemplo se utiliza la imagen de contenedor redis
, y se incluyen opciones de verificación de estado para garantizar que el servicio se está ejecutando. Anexa una etiqueta al nombre de la imagen para especificar una versión, como, por ejemplo, redis:6
. Para obtener más información, consulta la imagen de redis en Docker Hub.
jobs: # Label of the container job container-job: # Containers must run in Linux based operating systems runs-on: ubuntu-latest # Docker Hub image that `container-job` executes in container: node:10.18-jessie # Service containers to run with `container-job` services: # Label used to access the service container redis: # Docker Hub image image: redis # Set health checks to wait until redis has started options: >- --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5
jobs:
# Label of the container job
container-job:
# Containers must run in Linux based operating systems
runs-on: ubuntu-latest
# Docker Hub image that `container-job` executes in
container: node:10.18-jessie
# Service containers to run with `container-job`
services:
# Label used to access the service container
redis:
# Docker Hub image
image: redis
# Set health checks to wait until redis has started
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
Configuración de los pasos para el trabajo de contenedor
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: # Downloads a copy of the code in your repository before running CI tests - name: Check out repository code uses: actions/checkout@v4 # Performs a clean installation of all dependencies in the `package.json` file # For more information, see https://docs.npmjs.com/cli/ci.html - name: Install dependencies run: npm ci - name: Connect to Redis # Runs a script that creates a Redis client, populates # the client with data, and retrieves data run: node client.js # Environment variable used by the `client.js` script to create a new Redis client. env: # The hostname used to communicate with the Redis service container REDIS_HOST: redis # The default Redis port REDIS_PORT: 6379
steps:
# Downloads a copy of the code in your repository before running CI tests
- name: Check out repository code
uses: actions/checkout@v4
# Performs a clean installation of all dependencies in the `package.json` file
# For more information, see https://docs.npmjs.com/cli/ci.html
- name: Install dependencies
run: npm ci
- name: Connect to Redis
# Runs a script that creates a Redis client, populates
# the client with data, and retrieves data
run: node client.js
# Environment variable used by the `client.js` script to create a new Redis client.
env:
# The hostname used to communicate with the Redis service container
REDIS_HOST: redis
# The default Redis port
REDIS_PORT: 6379
El script client.js busca las variables de entorno REDIS_HOST
y REDIS_PORT
para crear el cliente. El flujo de trabajo configura esas dos variables de entorno como parte del paso "Connect to Redis" para que estén disponibles en el script client.js. Para más información sobre el script, vea "Prueba del contenedor del servicio Redis".
El nombre de host del servicio Redis es la etiqueta que configuró en su 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. Puede acceder a los contenedores de servicios desde el host de Docker mediante localhost
y el número de puerto del host de Docker.
Puede copiar este archivo de flujo de trabajo al directorio .github/workflows
del repositorio y modificarlo según sea necesario.
name: Redis runner example on: push jobs: # Label of the runner job runner-job: # You must use a Linux environment when using service containers or container jobs runs-on: ubuntu-latest # Service containers to run with `runner-job` services: # Label used to access the service container redis: # Docker Hub image image: redis # Set health checks to wait until redis has started options: >- --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5 ports: # Maps port 6379 on service container to the host - 6379:6379 steps: # Downloads a copy of the code in your repository before running CI tests - name: Check out repository code uses: actions/checkout@v4 # Performs a clean installation of all dependencies in the `package.json` file # For more information, see https://docs.npmjs.com/cli/ci.html - name: Install dependencies run: npm ci - name: Connect to Redis # Runs a script that creates a Redis client, populates # the client with data, and retrieves data run: node client.js # Environment variable used by the `client.js` script to create # a new Redis client. env: # The hostname used to communicate with the Redis service container REDIS_HOST: localhost # The default Redis port REDIS_PORT: 6379
name: Redis runner example
on: push
jobs:
# Label of the runner job
runner-job:
# You must use a Linux environment when using service containers or container jobs
runs-on: ubuntu-latest
# Service containers to run with `runner-job`
services:
# Label used to access the service container
redis:
# Docker Hub image
image: redis
# Set health checks to wait until redis has started
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Maps port 6379 on service container to the host
- 6379:6379
steps:
# Downloads a copy of the code in your repository before running CI tests
- name: Check out repository code
uses: actions/checkout@v4
# Performs a clean installation of all dependencies in the `package.json` file
# For more information, see https://docs.npmjs.com/cli/ci.html
- name: Install dependencies
run: npm ci
- name: Connect to Redis
# Runs a script that creates a Redis client, populates
# the client with data, and retrieves data
run: node client.js
# Environment variable used by the `client.js` script to create
# a new Redis client.
env:
# The hostname used to communicate with the Redis service container
REDIS_HOST: localhost
# The default Redis port
REDIS_PORT: 6379
Configurar el trabajo del ejecutor
En el ejemplo se usa el ejecutor hospedado en GitHub ubuntu-latest
como host de Docker.
El flujo de trabajo configura un contenedor de servicios con la etiqueta redis
. Todos los servicios se deben ejecutar en un contenedor, por lo que cada servicio requiere que especifiques la image
del mismo. En este ejemplo se utiliza la imagen de contenedor redis
, y se incluyen opciones de verificación de estado para garantizar que el servicio se está ejecutando. Anexa una etiqueta al nombre de la imagen para especificar una versión, como, por ejemplo, redis:6
. 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 sobre la palabra clave ports
, consulte "Acerca de los contenedores de servicios".
jobs: # Label of the runner job runner-job: # You must use a Linux environment when using service containers or container jobs runs-on: ubuntu-latest # Service containers to run with `runner-job` services: # Label used to access the service container redis: # Docker Hub image image: redis # Set health checks to wait until redis has started options: >- --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5 ports: # Maps port 6379 on service container to the host - 6379:6379
jobs:
# Label of the runner job
runner-job:
# You must use a Linux environment when using service containers or container jobs
runs-on: ubuntu-latest
# Service containers to run with `runner-job`
services:
# Label used to access the service container
redis:
# Docker Hub image
image: redis
# Set health checks to wait until redis has started
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Maps port 6379 on service container to the host
- 6379:6379
Configuración de los pasos para el trabajo de ejecutor
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: # Downloads a copy of the code in your repository before running CI tests - name: Check out repository code uses: actions/checkout@v4 # Performs a clean installation of all dependencies in the `package.json` file # For more information, see https://docs.npmjs.com/cli/ci.html - name: Install dependencies run: npm ci - name: Connect to Redis # Runs a script that creates a Redis client, populates # the client with data, and retrieves data run: node client.js # Environment variable used by the `client.js` script to create # a new Redis client. env: # The hostname used to communicate with the Redis service container REDIS_HOST: localhost # The default Redis port REDIS_PORT: 6379
steps:
# Downloads a copy of the code in your repository before running CI tests
- name: Check out repository code
uses: actions/checkout@v4
# Performs a clean installation of all dependencies in the `package.json` file
# For more information, see https://docs.npmjs.com/cli/ci.html
- name: Install dependencies
run: npm ci
- name: Connect to Redis
# Runs a script that creates a Redis client, populates
# the client with data, and retrieves data
run: node client.js
# Environment variable used by the `client.js` script to create
# a new Redis client.
env:
# The hostname used to communicate with the Redis service container
REDIS_HOST: localhost
# The default Redis port
REDIS_PORT: 6379
El script client.js busca las variables de entorno REDIS_HOST
y REDIS_PORT
para crear el cliente. El flujo de trabajo configura esas dos variables de entorno como parte del paso "Connect to Redis" para que estén disponibles en el script client.js. Para más información sobre el script, vea "Prueba del contenedor del servicio Redis".
El nombre de host 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. Su script puede usar el lenguaje que quiera, pero en este ejemplo se usa Node.js y el módulo npm redis
. Para obtener más información, consulte el módulo redis npm.
Puede modificar client.js para incluir las operaciones de Redis necesarias para el 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.
Agregue al repositorio un archivo nuevo llamado client.js con el siguiente código.
const redis = require("redis"); // Creates a new Redis client // If REDIS_HOST is not set, the default host is localhost // If REDIS_PORT is not set, the default port is 6379 const redisClient = redis.createClient({ url: `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}` }); redisClient.on("error", (err) => console.log("Error", err)); (async () => { await redisClient.connect(); // Sets the key "octocat" to a value of "Mona the octocat" const setKeyReply = await redisClient.set("octocat", "Mona the Octocat"); console.log("Reply: " + setKeyReply); // Sets a key to "species", field to "octocat", and "value" to "Cat and Octopus" const SetFieldOctocatReply = await redisClient.hSet("species", "octocat", "Cat and Octopus"); console.log("Reply: " + SetFieldOctocatReply); // Sets a key to "species", field to "dinotocat", and "value" to "Dinosaur and Octopus" const SetFieldDinotocatReply = await redisClient.hSet("species", "dinotocat", "Dinosaur and Octopus"); console.log("Reply: " + SetFieldDinotocatReply); // Sets a key to "species", field to "robotocat", and "value" to "Cat and Robot" const SetFieldRobotocatReply = await redisClient.hSet("species", "robotocat", "Cat and Robot"); console.log("Reply: " + SetFieldRobotocatReply); try { // Gets all fields in "species" key const replies = await redisClient.hKeys("species"); console.log(replies.length + " replies:"); replies.forEach((reply, i) => { console.log(" " + i + ": " + reply); }); await redisClient.quit(); } catch (err) { // statements to handle any exceptions } })();
const redis = require("redis");
// Creates a new Redis client
// If REDIS_HOST is not set, the default host is localhost
// If REDIS_PORT is not set, the default port is 6379
const redisClient = redis.createClient({
url: `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}`
});
redisClient.on("error", (err) => console.log("Error", err));
(async () => {
await redisClient.connect();
// Sets the key "octocat" to a value of "Mona the octocat"
const setKeyReply = await redisClient.set("octocat", "Mona the Octocat");
console.log("Reply: " + setKeyReply);
// Sets a key to "species", field to "octocat", and "value" to "Cat and Octopus"
const SetFieldOctocatReply = await redisClient.hSet("species", "octocat", "Cat and Octopus");
console.log("Reply: " + SetFieldOctocatReply);
// Sets a key to "species", field to "dinotocat", and "value" to "Dinosaur and Octopus"
const SetFieldDinotocatReply = await redisClient.hSet("species", "dinotocat", "Dinosaur and Octopus");
console.log("Reply: " + SetFieldDinotocatReply);
// Sets a key to "species", field to "robotocat", and "value" to "Cat and Robot"
const SetFieldRobotocatReply = await redisClient.hSet("species", "robotocat", "Cat and Robot");
console.log("Reply: " + SetFieldRobotocatReply);
try {
// Gets all fields in "species" key
const replies = await redisClient.hKeys("species");
console.log(replies.length + " replies:");
replies.forEach((reply, i) => {
console.log(" " + i + ": " + reply);
});
await redisClient.quit();
}
catch (err) {
// statements to handle any exceptions
}
})();
El script crea un nuevo cliente de Redis mediante el método createClient
, que acepta un parámetro host
y port
. El script usa las variables de entorno REDIS_HOST
y REDIS_PORT
para establecer la dirección IP y el puerto del cliente. Si host
y port
no están definidas, 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