Observação: Executores hospedados em GitHub não são atualmente compatíveis com GitHub Enterprise Server. Você pode ver mais informações sobre suporte futuro planejado no Itinerário público do GitHub.
Introdução
Este guia mostra os exemplos do seu fluxo de trabalho que configuram um contêiner de serviço usando a imagem redis
do Docker Hub. O fluxo de trabalho executa um script para criar um cliente Redis e preencher os dados do cliente. Para testar se o fluxo de trabalho cria e preenche o cliente Redis, o script imprime os dados do cliente no console.
Observação: se seus fluxos de trabalho usam ações do contêiner Docker, contêineres de trabalho ou contêineres de serviço, você deve usar um executor do Linux:
- Se você estiver usando executores hospedados em GitHub, você deverá usar um executor do Ubuntu.
- Se você estiver usando executores auto-hospedados, você deve usar uma máquina Linux, pois seu executor e o Docker precisam ser instalados.
Pré-requisitos
Você deve estar familiarizado com como os contêineres de serviço funcionam com GitHub Actions e as diferenças de rede entre trabalhos em execução diretamente no executor ou em um contêiner. Para obter mais informações, consulte "About service containers."
Também pode ser útil ter um entendimento básico de YAML, a sintaxe para GitHub Actions e Redis. Para obter mais informações, consulte:
- "Aprenda GitHub Actions"
- "Introdução ao Redis" na documentação do Redis
Executar trabalhos em contêineres
A configuração de tarefas a serem executadas em um contêiner simplifica as configurações de rede entre o trabalho e os contêineres do serviço. Docker contêineres na mesma rede de ponte definida pelo usuário expõe todas as portas umas para as outras, então você não precisa mapear nenhuma das portas de contêiner de serviço para o host Docker. Você pode acessar o contêiner de serviço do contêiner de trabalho usando a etiqueta que você configurar no fluxo de trabalho.
Você pode copiar este arquivo de fluxo de trabalho para o diretório .github/workflows
do repositório e modificá-lo conforme necessário.
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@v2
# 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:
# O nome do host usado para comunicar-se com o contêiner de serviço do Redis
REDIS_HOST: redis
# The default Redis port
REDIS_PORT: 6379
Configurar o trabalho do contêiner
Este fluxo de trabalho configura um trabalho que é executado em node:10.18-jessie
e usa o contêiner ubuntu-latest
GitHub-do executor hospedado como host do Docker para o contêiner. Para obter mais informações sobre o contêiner node:10.18-jessie
, consulte a node image no Docker Hub.
O fluxo de trabalho configura um contêiner de serviço com a etiqueta redis
. Todos os serviços devem ser executados em um contêiner, por isso cada serviço requer que você especifique o contêiner image
. Este exemplo usa a imagem de contêiner redis
, e inclui opções de check up de saúde do sistema para certificar-se de que o serviço esteja funcionando. Para obter mais informações, consulte a redis image no Docker Hub.
trabalhos:
# Etiqueta do trabalho do contêiner
container-job:
# Os contêineres devem ser executados em sistemas operacionais baseados no Linux
runs-on: ubuntu-latest
# Imagem do Docker Hub em que o `container-job` é executado
contêiner: node:10.18-jessie
# Contêineres de serviço a serem executados com `container-job`
serviços:
# Etiqueta usada para acessar o contêiner de serviço
redis:
# Imagem do Docker Hub
imagem: redis
# Define verificações gerais até a inicialização do redis
opções: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
Configurar as etapas
O fluxo de trabalho executa as seguintes etapas:
- Verifica o repositório no executor
- Instala dependências
- Executa um script para criar um cliente
steps:
# Downloads a copy of the code in your repository before running CI tests
- name: Check out repository code
uses: actions/checkout@v2
# 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:
# O nome do host usado para comunicar-se com o contêiner de serviço do Redis
REDIS_HOST: redis
# A porta-padrão do Redis
REDIS_PORT: 6379
O script client.js procura as variáveis de ambiente REDIS_HOST
e REDIS_PORT
para criar o cliente. O fluxo de trabalho define essas duas variáveis de ambiente como parte da etapa "Connect to Redis" para torná-las disponíveis para o script client.js. Para obter mais informações sobre o script, consulte "Testing the Redis service container."
O nome do host do serviço Redis é a etiqueta que você configurou no seu fluxo de trabalho, nesse caso redis
. Uma vez que os contêineres do Docker na mesma rede da ponte definida pelo usuário abrem todas as portas por padrão, você poderá acessar o contêiner de serviço na porta-padrão 6379 do Redis.
Executar trabalhos diretamente na máquina executora
Ao executar um trabalho diretamente na máquina executora, você deverá mapear as portas no contêiner de serviço com as portas no host do Docker. Você pode acessar os contêineres de serviço do host do Docker usando localhost
e o número da porta do host do Docker.
Você pode copiar este arquivo de fluxo de trabalho para o diretório .github/workflows
do repositório e modificá-lo conforme necessário.
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@v2
# 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:
# O nome do host usado para comunicar-se com o contêiner de serviço Reds
REDIS_HOST: localhost
# A porta-padrão do Redis
REDIS_PORT: 6379
Configurar o trabalho executor
O exemplo usa o ubuntu-latest
GitHub-runner hospedado como o host Docker.
O fluxo de trabalho configura um contêiner de serviço com a etiqueta redis
. Todos os serviços devem ser executados em um contêiner, por isso cada serviço requer que você especifique o contêiner image
. Este exemplo usa a imagem de contêiner redis
, e inclui opções de check up de saúde do sistema para certificar-se de que o serviço esteja funcionando. Para obter mais informações, consulte a redis image no Docker Hub.
O fluxo de trabalho mapeia a porta 6379 no contêiner de serviço do Redis com o host do Docker. Para obter mais informações sobre a palavra-chave portas
, consulte "Sobre contêineres de serviço".
trabalhos:
# Etiqueta do trabalho executor
runner-job:
# Você deve usar um ambiente do Linux ao usar contêineres de serviço ou trabalhos de contêiner
runs-on: ubuntu-latest
# Contêineres de serviço a serem executados com `runner-job`
serviços:
# Etiqueta usada para acessar o contêiner de serviço
redis:
# Imagem do Docker Hub
imagem: redis
# Define as verificações gerais até a inicialização do redis
opções: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
portas:
# Mapeia a porta 6379 no contêiner de serviço com o host
- 6379:6379
Configurar as etapas
O fluxo de trabalho executa as seguintes etapas:
- Verifica o repositório no executor
- Instala dependências
- Executa um script para criar um cliente
steps:
# Downloads a copy of the code in your repository before running CI tests
- name: Check out repository code
uses: actions/checkout@v2
# 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:
# O nome do host usado para comunicar-se com o contêiner de serviço Redis
REDIS_HOST: localhost
# A porta-padrão Redis
REDIS_PORT: 6379
O script client.js procura as variáveis de ambiente REDIS_HOST
e REDIS_PORT
para criar o cliente. O fluxo de trabalho define essas duas variáveis de ambiente como parte da etapa "Connect to Redis" para torná-las disponíveis para o script client.js. Para obter mais informações sobre o script, consulte "Testing the Redis service container."
O nome do host é localhost
ou 127.0.0.1
.
Testar o contêiner de serviço Redis
Você pode testar o seu fluxo de trabalho usando o script a seguir, que cria um cliente Redis e adiciona uma tabela com alguns dados com espaços reservados. Em seguida, o script imprime no terminal os valores armazenados no cliente Redis. O seu script pode usar qualquer linguagem que você desejar, mas este exemplo usa Node.js e o módulo npm redis
. Para obter mais informações, consulte o módulo redis npm.
Você pode modificar o client.js para incluir qualquer operação necessária para o seu fluxo de trabalho. Neste exemplo, o script cria a instância do cliente Redis, cria uma tabela, adiciona dados de espaços reservados e, em seguida, recupera os dados.
Adicione um novo arquivo chamado client.js ao seu repositório com o seguinte código.
const redis = require("redis");
// Cria um novo cliente Redis
// Se REDIS_HOST não for definido, o host-padrão será localhost
// Se REDIS_PORT não for definido, a porta-padrão será 6379
const redisClient = redis.createClient({
host: process.env.REDIS_HOST,
port: process.env.REDIS_PORT
});
redisClient.on("error", function(err) {
console.log("Error " + err);
});
// Define a chave "octocat" como um valor de "Mona the octocat"
redisClient.set("octocat", "Mona the Octocat", redis.print);
// Define uma chave como "octocat", campo de "species", e "value" como "Cat and Octopus"
redisClient.hset("species", "octocat", "Cat and Octopus", redis.print);
// Define uma chave como "octocat", campo de "species", e "value" como "Dinosaur and Octopus"
redisClient.hset("species", "dinotocat", "Dinosaur and Octopus", redis.print);
// Define uma chave como "octocat", campo de "species", e "value" como "Cat and Robot"
redisClient.hset(["species", "robotocat", "Cat and Robot"], redis.print);
// Obtém todos os campos na chave "species"
redisClient.hkeys("species", function (err, replies) {
console.log(replies.length + " replies:");
replies.forEach(function (reply, i) {
console.log(" " + i + ": " + reply);
});
redisClient.quit();
});
O script cria um novo cliente Redis, usando o método createClient
, que aceita um host
e um parâmetro da porta
. O script usa as variáveis do ambiente REDIS_HOST
e REDIS_PORT
para definir o endereço IP e a porta do cliente. Se o host
e a porta
não forem definidos, o host-padrão será localhost
e a porta-padrão será 6379.
O script usa os métodos set
e hset
para preencher o banco de dados com algumas chaves, campos e valores. Para confirmar se o cliente Redis contém os dados, o script imprime o conteúdo do banco de dados no registro do console.
Ao executar este fluxo de trabalho, você deve ver a saída a seguir na etapa "Conectar-se ao Redis", confirmando que você criou o cliente Redis e adicionou os dados:
Resposta: OK
Resposta: 1
Resposta: 1
Resposta: 1
3 respostas:
0: octocat
1: dinotocat
2: robotocat