Introduction
Ce guide prĂ©sente des exemples de workflow qui configurent un conteneur de service Ă lâaide de lâimage Docker Hub postgres
. Le workflow exécute un script qui se connecte au service PostgreSQL, crée une table, puis la remplit avec des données. Pour tester que le workflow crée et remplit la table PostgreSQL, le script affiche les données de la table sur la console.
Remarque
Si vos flux de travail utilisent des actions de conteneurs Docker, des conteneurs de tùches ou des conteneurs de services, vous devez utiliser un programme d'exécution Linux :
- Si vous utilisez des exécuteurs hébergés sur GitHub, vous devez utiliser un exécuteur Ubuntu.
- Si vous utilisez des exĂ©cuteurs autohĂ©bergĂ©s, vous devez utiliser une machine Linux en tant quâexĂ©cuteur, et Docker doit ĂȘtre installĂ©.
Prérequis
Vous devez connaĂźtre le fonctionnement des conteneurs de service avec GitHub Actions et les diffĂ©rences de rĂ©seau entre une exĂ©cution directe des travaux sur lâexĂ©cuteur ou dans un conteneur. Pour plus dâinformations, consultez « Communication avec les conteneurs de service Docker ».
Vous pouvez Ă©galement trouver utile de disposer dâune connaissance Ă©lĂ©mentaire de YAML, de la syntaxe de GitHub Actions et de PostgreSQL. Pour plus dâinformations, consultez lâarticle suivant :
- Ăcriture de workflows
- « Tutoriel sur PostgreSQL » dans la documentation PostgreSQL
Exécution de travaux dans des conteneurs
La configuration de travaux Ă exĂ©cuter dans un conteneur simplifie la mise en rĂ©seau des configurations entre le travail et les conteneurs de service. Les conteneurs Docker dâun mĂȘme rĂ©seau de pont dĂ©fini par lâutilisateur exposent tous les ports les uns aux autres. Vous nâavez donc pas besoin de mapper les ports des conteneurs de service Ă lâhĂŽte Docker. Vous pouvez accĂ©der au conteneur de service Ă partir du conteneur de travaux Ă lâaide de lâĂ©tiquette que vous configurez dans le workflow.
Vous pouvez copier ce fichier de workflow dans le répertoire .github/workflows
de votre dépÎt et le modifier selon vos besoins.
name: PostgreSQL service 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:20-bookworm-slim # Service containers to run with `container-job` services: # Label used to access the service container postgres: # Docker Hub image image: postgres # Provide the password for postgres env: POSTGRES_PASSWORD: postgres # Set health checks to wait until postgres has started options: >- --health-cmd pg_isready --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 PostgreSQL # Runs a script that creates a PostgreSQL table, populates # the table with data, and then retrieves the data. run: node client.js # Environment variables used by the `client.js` script to create a new PostgreSQL table. env: # The hostname used to communicate with the PostgreSQL service container POSTGRES_HOST: postgres # The default PostgreSQL port POSTGRES_PORT: 5432
name: PostgreSQL service 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:20-bookworm-slim
# Service containers to run with `container-job`
services:
# Label used to access the service container
postgres:
# Docker Hub image
image: postgres
# Provide the password for postgres
env:
POSTGRES_PASSWORD: postgres
# Set health checks to wait until postgres has started
options: >-
--health-cmd pg_isready
--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 PostgreSQL
# Runs a script that creates a PostgreSQL table, populates
# the table with data, and then retrieves the data.
run: node client.js
# Environment variables used by the `client.js` script to create a new PostgreSQL table.
env:
# The hostname used to communicate with the PostgreSQL service container
POSTGRES_HOST: postgres
# The default PostgreSQL port
POSTGRES_PORT: 5432
Configuration du travail de lâexĂ©cuteur pour les travaux dans des conteneurs
Ce flux de travail configure un travail qui s'exécute dans le conteneur node:20-bookworm-slim
et utilise l'exécuteur ubuntu-latest
GitHub-hosted comme hĂŽte Docker pour le conteneur. Pour plus dâinformations sur le conteneur node:20-bookworm-slim
, consultez lâimage node sur Docker Hub.
Le workflow configure un conteneur de service avec lâĂ©tiquette postgres
. Tous les services doivent sâexĂ©cuter dans un conteneur ; ainsi, chaque service exige que vous spĂ©cifiiez le conteneur image
. Cet exemple utilise lâimage conteneur postgres
, fournit le mot de passe PostgreSQL par dĂ©faut et inclut des options de contrĂŽle dâintĂ©gritĂ© pour vous assurer que le service est en cours dâexĂ©cution. Pour plus dâinformations, consultez lâimage postgres sur 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:20-bookworm-slim # Service containers to run with `container-job` services: # Label used to access the service container postgres: # Docker Hub image image: postgres # Provide the password for postgres env: POSTGRES_PASSWORD: postgres # Set health checks to wait until postgres has started options: >- --health-cmd pg_isready --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:20-bookworm-slim
# Service containers to run with `container-job`
services:
# Label used to access the service container
postgres:
# Docker Hub image
image: postgres
# Provide the password for postgres
env:
POSTGRES_PASSWORD: postgres
# Set health checks to wait until postgres has started
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
Configuration des étapes pour les travaux dans des conteneurs
Le workflow effectue les étapes suivantes :
- Il extrait le dĂ©pĂŽt sur lâexĂ©cuteur.
- Il installe des dépendances.
- Il exécute un script pour créer un client.
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 PostgreSQL # Runs a script that creates a PostgreSQL table, populates # the table with data, and then retrieves the data. run: node client.js # Environment variable used by the `client.js` script to create # a new PostgreSQL client. env: # The hostname used to communicate with the PostgreSQL service container POSTGRES_HOST: postgres # The default PostgreSQL port POSTGRES_PORT: 5432
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 PostgreSQL
# Runs a script that creates a PostgreSQL table, populates
# the table with data, and then retrieves the data.
run: node client.js
# Environment variable used by the `client.js` script to create
# a new PostgreSQL client.
env:
# The hostname used to communicate with the PostgreSQL service container
POSTGRES_HOST: postgres
# The default PostgreSQL port
POSTGRES_PORT: 5432
Le script client.js recherche les variables dâenvironnement POSTGRES_HOST
et POSTGRES_PORT
pour crĂ©er le client. Le workflow dĂ©finit ces deux variables dâenvironnement dans le cadre de lâĂ©tape « Se connecter Ă PostgreSQL » pour les rendre disponibles pour le script client.js. Pour plus dâinformations sur le script, consultez Test du conteneur de service PostgreSQL.
Le nom dâhĂŽte du service PostgreSQL est lâĂ©tiquette que vous avez configurĂ©e dans votre workflow ; dans le cas prĂ©sent, postgres
. Ătant donnĂ© que les conteneurs Docker se trouvant sur le mĂȘme rĂ©seau de pont dĂ©fini par lâutilisateur ouvrent tous les ports par dĂ©faut, vous pourrez accĂ©der au conteneur de service sur le port PostgreSQL par dĂ©faut 5432.
ExĂ©cution de travaux directement sur la machine de lâexĂ©cuteur
Lorsque vous exĂ©cutez un travail directement sur la machine de lâexĂ©cuteur, vous devez mapper les ports du conteneur de service aux ports sur lâhĂŽte Docker. Vous pouvez accĂ©der aux conteneurs de service Ă partir de lâhĂŽte Docker Ă lâaide de localhost
et du numĂ©ro de port de lâhĂŽte Docker.
Vous pouvez copier ce fichier de workflow dans le répertoire .github/workflows
de votre dépÎt et le modifier selon vos besoins.
name: PostgreSQL Service 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 postgres: # Docker Hub image image: postgres # Provide the password for postgres env: POSTGRES_PASSWORD: postgres # Set health checks to wait until postgres has started options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: # Maps tcp port 5432 on service container to the host - 5432:5432 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 PostgreSQL # Runs a script that creates a PostgreSQL table, populates # the table with data, and then retrieves the data run: node client.js # Environment variables used by the `client.js` script to create # a new PostgreSQL table. env: # The hostname used to communicate with the PostgreSQL service container POSTGRES_HOST: localhost # The default PostgreSQL port POSTGRES_PORT: 5432
name: PostgreSQL Service 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
postgres:
# Docker Hub image
image: postgres
# Provide the password for postgres
env:
POSTGRES_PASSWORD: postgres
# Set health checks to wait until postgres has started
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Maps tcp port 5432 on service container to the host
- 5432:5432
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 PostgreSQL
# Runs a script that creates a PostgreSQL table, populates
# the table with data, and then retrieves the data
run: node client.js
# Environment variables used by the `client.js` script to create
# a new PostgreSQL table.
env:
# The hostname used to communicate with the PostgreSQL service container
POSTGRES_HOST: localhost
# The default PostgreSQL port
POSTGRES_PORT: 5432
Configuration du travail dâexĂ©cuteur pour les travaux directement sur lâordinateur de lâexĂ©cuteur
L'exemple s'appuie sur l'exécuteur ubuntu-latest
GitHub-hosted en tant qu'hĂŽte Docker.
Le workflow configure un conteneur de service avec lâĂ©tiquette postgres
. Tous les services doivent sâexĂ©cuter dans un conteneur ; ainsi, chaque service exige que vous spĂ©cifiiez le conteneur image
. Cet exemple utilise lâimage conteneur postgres
, fournit le mot de passe PostgreSQL par dĂ©faut et inclut des options de contrĂŽle dâintĂ©gritĂ© pour vous assurer que le service est en cours dâexĂ©cution. Pour plus dâinformations, consultez lâimage postgres sur Docker Hub.
Le workflow mappe le port 5432 sur le conteneur de service PostgreSQL Ă lâhĂŽte Docker. Pour plus dâinformations sur le mot clĂ© ports
, consultez « Communication avec les conteneurs de service Docker ».
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 postgres: # Docker Hub image image: postgres # Provide the password for postgres env: POSTGRES_PASSWORD: postgres # Set health checks to wait until postgres has started options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: # Maps tcp port 5432 on service container to the host - 5432:5432
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
postgres:
# Docker Hub image
image: postgres
# Provide the password for postgres
env:
POSTGRES_PASSWORD: postgres
# Set health checks to wait until postgres has started
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Maps tcp port 5432 on service container to the host
- 5432:5432
Configuration des Ă©tapes pour les travaux directement sur lâordinateur de lâexĂ©cuteur
Le workflow effectue les étapes suivantes :
- Il extrait le dĂ©pĂŽt sur lâexĂ©cuteur.
- Il installe des dépendances.
- Il exécute un script pour créer un client.
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 PostgreSQL # Runs a script that creates a PostgreSQL table, populates # the table with data, and then retrieves the data run: node client.js # Environment variables used by the `client.js` script to create # a new PostgreSQL table. env: # The hostname used to communicate with the PostgreSQL service container POSTGRES_HOST: localhost # The default PostgreSQL port POSTGRES_PORT: 5432
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 PostgreSQL
# Runs a script that creates a PostgreSQL table, populates
# the table with data, and then retrieves the data
run: node client.js
# Environment variables used by the `client.js` script to create
# a new PostgreSQL table.
env:
# The hostname used to communicate with the PostgreSQL service container
POSTGRES_HOST: localhost
# The default PostgreSQL port
POSTGRES_PORT: 5432
Le script client.js recherche les variables dâenvironnement POSTGRES_HOST
et POSTGRES_PORT
pour crĂ©er le client. Le workflow dĂ©finit ces deux variables dâenvironnement dans le cadre de lâĂ©tape « Se connecter Ă PostgreSQL » pour les rendre disponibles pour le script client.js. Pour plus dâinformations sur le script, consultez Test du conteneur de service PostgreSQL.
Le nom dâhĂŽte est localhost
ou 127.0.0.1
.
Test du conteneur de service PostgreSQL
Vous pouvez tester votre workflow Ă lâaide du script suivant, qui se connecte au service PostgreSQL et ajoute une nouvelle table avec des donnĂ©es dâespace rĂ©servĂ©. Le script affiche ensuite les valeurs stockĂ©es dans la table PostgreSQL dans le terminal. Votre script peut utiliser nâimporte quel langage souhaitĂ©, mais cet exemple utilise Node.js et le module npm pg
. Pour plus dâinformations, consultez le module npm pg.
Vous pouvez modifier client.js pour inclure toutes les opérations PostgreSQL nécessaires à votre workflow. Dans cet exemple, le script se connecte au service PostgreSQL, ajoute une table à la base de données postgres
, insĂšre des donnĂ©es dâespace rĂ©servĂ©, puis rĂ©cupĂšre les donnĂ©es.
Ajoutez un nouveau fichier appelé client.js à votre dépÎt avec le code suivant.
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() });
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()
});
Le script crĂ©e une connexion au service PostgreSQL et utilise les variables dâenvironnement POSTGRES_HOST
et POSTGRES_PORT
pour spĂ©cifier lâadresse P et le port du service PostgreSQL. Si host
et port
ne sont pas dĂ©finis, lâhĂŽte par dĂ©faut est localhost
et le port par défaut est 5432.
Le script crĂ©e une table et la remplit avec des donnĂ©es dâespace rĂ©servĂ©. Pour tester que la base de donnĂ©es postgres
contient les données, le script imprime le contenu de la table dans le journal de la console.
Lorsque vous exĂ©cutez ce workflow, vous devez voir la sortie suivante dans lâĂ©tape « Se connecter Ă PostgreSQL », ce qui confirme que vous avez correctement créé la table PostgreSQL et ajoutĂ© des donnĂ©es :
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' } ]