Skip to main content

Création de conteneurs de service PostgreSQL

Vous pouvez crĂ©er un conteneur de service PostgreSQL Ă  utiliser dans votre workflow. Ce guide montre des exemples de crĂ©ation d’un service PostgreSQL pour des travaux qui s’exĂ©cutent dans des conteneurs ou directement sur la machine d’exĂ©cuteur.

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 :

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.

YAML
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.

YAML
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 :

  1. Il extrait le dĂ©pĂŽt sur l’exĂ©cuteur.
  2. Il installe des dépendances.
  3. Il exécute un script pour créer un client.
YAML
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.

YAML
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 Â».

YAML
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 :

  1. Il extrait le dĂ©pĂŽt sur l’exĂ©cuteur.
  2. Il installe des dépendances.
  3. Il exécute un script pour créer un client.
YAML
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.

JavaScript
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' } ]