Introdução
Este guia mostra exemplos de fluxo de trabalho que configuram um contêiner de serviço usando a imagem postgres do Docker Hub. O fluxo de trabalho executa um script para criar um cliente PostgreSQL e preencher os dados do cliente. Para testar se o fluxo de trabalho cria e preenche o cliente PostgreSQL, o script imprime os dados do cliente no console.
Nota: se seus fluxos de trabalho usam ações do contêiner Docker ou recipientes de serviço, você deve usar um executor 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 PostgreSQL. Para obter mais informações, consulte:
- "Aprenda GitHub Actions"
- "Tutorial do PostgreSQL" na documentação do PostgreSQL
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.
nome: exemplo de serviço PostgreSQL
em: push
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
postgres:
# Imagem do Docker Hub
imagem: postgres
# Fornece a senha para postgres
env:
POSTGRES_PASSWORD: postgres
# Define verificações gerais até a inicialização do postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
etapas:
# Faz o download de uma cópia do código no seu repositório antes de executar testes de CI
- nome: Verifica o código do repositório
usa: actions/checkout@v2
# Realiza uma instalação limpa de todas as dependências no arquivo `package.json`
# Para obter mais informações, consulte https://docs.npmjs.com/cli/ci.html
- nome: Instalar dependências
executar: npm ci
- nome: Conectar-se ao PostgreSQL
# Executa um script que cria um cliente PostgreSQL client, preenche
# os dados do cliente e recupera dados
executar: node client.js
# Variável de ambiente usada pelo script `client.js` para criar um novo PostgreSQL client.
env:
# O nome do host usado para comunicar-se com o contêiner de serviço do PostgreSQL
POSTGRES_HOST: postgres
# A porta-padrão do PostgreSQL
POSTGRES_PORT: 5432Configurar o trabalho executor
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 postgres. 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 do contêiner postgres, fornece a senha padrão do PostgreSQL, e inclui opções de check up de saúde para verificar se o serviço está em execução. Para obter mais informações, consulte a postgres 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
postgres:
# Imagem do Docker Hub
imagem: postgres
# Fornece a senha para o postgres
env:
POSTGRES_PASSWORD: postgres
# Define as verificações gerais até a inicialização do postgres
opções: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5Configurar 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
etapas:
# Faz o download de uma cópia do código no seu repositório antes de executar testes de CI
- nome: Verifica o código do repositório
usa: actions/checkout@v2
# Executa uma instalação limpa de todas as dependências no arquivo `package.json`
# Para obter mais informações, consulte https://docs.npmjs.com/cli/ci.html
- Nome: Instalar dependências
executar: npm ci
- nome: Conectar-se ao PostgreSQL
# Executa um script que cria um cliente PostgreSQL client, preenche
# os dados do cliente e recupera dados
executar: node client.js
# Variável do ambiente usada pelo script `client.js` script para criar
# um novo cliente PostgreSQL.
env:
# O nome do host usado para comunicar-se com o contêiner de serviço do PostgreSQL
POSTGRES_HOST: postgres
# A porta-padrão do PostgreSQL
POSTGRES_PORT: 5432O script client.js procura as variáveis de ambiente POSTGRES_HOST e POSTGRES_PORT para criar o cliente. O fluxo de trabalho define essas duas variáveis de ambiente como parte do passo "Connect to PostgreSQL" para torná-las disponíveis para o script client.js. Para obter mais informações sobre o script, consulte "Testing the PostgreSQL service container."
O nome do host do serviço do PostgreSQL é a etiqueta que você configurou no seu fluxo de trabalho, nesse caso, postgres. 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 5432 do PostgreSQL.
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.
nome: Exemplo de serviço do PostgreSQL
em: push
trabalhos:
# Etiqueta do trabalho executor
runner-job:
# Você deve usar um ambiente do Linux ao usar os contêineres de serviço ou os trabalhos do contêiner
runs-on: ubuntu-latest
# Os serviços dos contêineres a serem executados com `runner-job`
serviços:
# Etiqueta usada para acessar o contêiner de serviço
postgres:
# Imagem do Docker Hub
imagem: postgres
# Fornece a senha para postgres
env:
POSTGRES_PASSWORD: postgres
# Define verificações gerais até a inicialização do postgres
opções: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
portas:
# Mapeia a porta port 5432 tcp no contêiner de serviço com o host
- 5432:5432
etapas:
# Faz o download de uma cópia do código no seu repositório antes de executar um teste de CI
- nome: Verifica o código do repositório
usa: actions/checkout@v2
# Realiza uma instalação limpa de todas as dependências no arquivo `package.json`
# Para obter mais informações, consulte https://docs.npmjs.com/cli/ci.html
- nome: Instalar dependências
executar: npm ci
- nome: Conectar-se ao PostgreSQL
# Executa um script que cria um cliente PostgreSQL, preenche
# os dados do cliente e recupera dados
executar: node client.js
# Variável de ambiente usada pelo script `client.js` para criar
# um novo cliente PostgreSQL.
env:
# O nome do host usado para comunicar-se com o contêiner de serviço PostgreSQL
POSTGRES_HOST: localhost
# A porta-padrão do PostgreSQL
POSTGRES_PORT: 5432Configurar 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 postgres. 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 do contêiner postgres, fornece a senha padrão do PostgreSQL, e inclui opções de check up de saúde para verificar se o serviço está em execução. Para obter mais informações, consulte a postgres image no Docker Hub.
O fluxo de trabalho mapeia a porta 5432 no contêiner de serviço do PostgreSQL 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 os contêineres de serviço ou trabalhos do contêiner
runs-on: ubuntu-latest
# Contêineres de serviços a serem executados com `runner-job`
serviços:
# Etiqueta usada para acessar o contêiner de serviço
postgres:
# Imagem do Docker Hub
image: postgres
# Fornece a senha para postgres
env:
POSTGRES_PASSWORD: postgres
# Define verificações gerais até a inicialização do postgres
opções: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
portas:
# Mapeia a porta port 5432 tcp no contêiner de serviço com o host
- 5432:5432Configurar 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
etapas:
# Faz o download de uma cópia do código no seu repositório antes de executar testes de CI
- nome: Verifica o código do repositório
usa: actions/checkout@v2
# Executa uma instalação limpa de todas as dependências no arquivo `package.json`
# Para obter mais informações, consulte https://docs.npmjs.com/cli/ci.html
- Nome: Instalar dependências
executar: npm ci
- nome: Conectar-se ao PostgreSQL
# Executa um script que cria um cliente PostgreSQL client, preenche
# os dados do cliente e recupera dados
executar: node client.js
# Variável do ambiente usada pelo script `client.js` script para criar
# um novo cliente PostgreSQL.
env:
# O nome do host usado para comunicar-se com o contêiner de serviço do PostgreSQL
POSTGRES_HOST: localhost
# A porta-padrão do PostgreSQL
POSTGRES_PORT: 5432O script client.js procura as variáveis de ambiente POSTGRES_HOST e POSTGRES_PORT para criar o cliente. O fluxo de trabalho define essas duas variáveis de ambiente como parte do passo "Connect to PostgreSQL" para torná-las disponíveis para o script client.js. Para obter mais informações sobre o script, consulte "Testing the PostgreSQL service container."
O nome do host é localhost ou 127.0.0.1.
Testar o contêiner de serviço do PostgreSQL
Você pode testar o seu fluxo de trabalho usando o script a seguir, que cria um cliente PostgreSQL e adiciona uma tabela com alguns dados com espaços reservados. Em seguida, o script imprime no terminal os valores armazenados no cliente PostgreSQL. O seu script pode usar qualquer linguagem que você desejar, mas este exemplo usa Node.js e o módulo npm pg. Para obter mais informações, consulte módulo npm pg.
Você pode modificar o client.js para incluir qualquer operação do PostgreSQL exigida pelo seu fluxo de trabalho. Neste exemplo, o script cria a instância do cliente PostgreSQL, 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 { Client } = require('pg');
const pgclient = new Client({
host: process.env.POSTGRES_HOST,
porta: process.env.POSTGRES_PORT,
usuário: 'postgres',
senha: 'postgres',
banco de dados: '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()
});O script cria um novo Client PostgreSQL, que aceita um host e o parâmetro da porta. O script usa as variáveis de ambiente POSTGRES_HOST e POSTGRES_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á 5432.
O script cria uma tabela e preenche com dados de espaço reservado. Para testar se o banco de dados do PostgreSQL contém os dados, o script imprime o conteúdo da tabela no registro do console.
Ao executar este fluxo de trabalho, você deve ver a saída a seguir na etapa "Conectar-se ao PostgreSQL", que confirma que você criou o cliente PostgreSQL e adicionou dados:
null [ { id: 1,
primeiro nome: 'Mona the',
último nome: 'Octocat',
idade: 9,
endereço:
'88 Colin P Kelly Jr St, São Francisco, CA 94107, Estados Unidos',
e-mail: 'octocat@github.com' } ]