Einführung
Dieser Leitfaden enthält Workflowbeispiele, in denen ein Dienstcontainer unter Verwendung des Docker Hub-Images postgres
konfiguriert wird. Der Workflow führt ein Skript aus, das eine Verbindung mit dem PostgreSQL-Dienst herstellt, eine Tabelle erstellt und diese Tabelle dann mit Daten auffüllt. Um zu testen, ob der Workflow die PostgreSQL-Tabelle erstellt und mit Daten auffüllt, gibt das Skript die Daten aus der Tabelle in der Konsole aus.
Note
Wenn bei deinen Workflows Docker-Containeraktionen, Auftragscontainer oder Dienstcontainer verwendet werden, musst du einen Linux-Runner nutzen:
- Wenn du GitHub-gehostete Runner verwendest, musst du einen Ubuntu-Runner verwenden.
- Wenn du selbst gehostete Läufer verwendest, musst du einen Linux-Rechner als deinen Läufer verwenden und Docker muss installiert sein.
Voraussetzungen
Du solltest damit vertraut sein, wie Service-Container mit GitHub Actions arbeiten und die Netzwerkunterschiede kennen zwischen dem Laufen lassen von Aufträgen direkt auf dem Läufer oder in einem Container. Weitere Informationen findest du unter Informationen zu Service-Containern.
Es kann Dir auch helfen, YAML, die Syntax für GitHub Actions und PostgreSQL grundlegende zu verstehen. Weitere Informationen finden Sie unter:
- Schreiben von Workflows
- PostgreSQL-Tutorial in der PostgreSQL-Dokumentation
Jobs in Containern ausführen
Das Konfigurieren von Aufträgen für die Ausführung in einem Container vereinfacht die Netzwerkkonfigurationen zwischen dem Auftrag und den Dienstcontainern. Docker-Container im gleichen benutzerdefinierten Bridge-Netzwerk exponieren gegenseitig alle Ports, sodass Du keinen der Servicecontainer-Ports dem Docker-Host zuordnen musst. Mit der im Workflow konfigurierten Kennzeichnung kannst Du vom Auftrags-Container her auf den Dienst-Container zugreifen.
Du kannst diese Workflowdatei in das .github/workflows
-Verzeichnis deines Repositorys kopieren und nach Bedarf ändern.
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
Konfigurieren des Runnerauftrags für Aufträge in Containern
Dieser Workflow konfiguriert einen Auftrag, der im Container node:20-bookworm-slim
ausgeführt wird, und nutzt den GitHub-gehosteten Runner ubuntu-latest
als Docker-Host für den Container. Weitere Informationen zum Container node:20-bookworm-slim
findest Du im Knotenimage auf Docker Hub.
Der Workflow konfiguriert einen Dienstcontainer mit der Bezeichnung postgres
. Alle Dienste müssen in einem Container ausgeführt werden, daher erfordert jeder Dienst die Angabe des Containers image
. Dieses Beispiel verwendet das postgres
-Containerimage, stellt das standardmäßige PostgreSQL-Passwort bereit und enthält Optionen für Systemdiagnosen, um sicherzustellen, dass der Dienst ausgeführt wird. Weitere Informationen findest du unter postgres-Image auf 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
Konfigurieren der Schritte für Aufträge in Containern
Der Workflow führt die folgenden Schritte aus:
- Auschecken des Repository auf dem Läufer
- Installieren von Abhängigkeiten
- Ausführen eines Script, um einen Client zu erstellen
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
Das client.js-Skript sucht nach den Umgebungsvariablen POSTGRES_HOST
und POSTGRES_PORT
, um den Client zu erstellen. Der Workflow legt diese beiden Umgebungsvariablen im Rahmen des Schritts „Mit PostgreSQL verbinden“ fest, um sie dem client.js-Skript zur Verfügung zu stellen. Weitere Informationen zum Skript findest du unter Testen des PostgreSQL-Dienstcontainers.
Der Hostname des PostgreSQL-Diensts ist die Bezeichnung, die du in deinem Workflow konfiguriert hast (in diesem Fall: postgres
). Da Docker-Container im gleichen benutzerdefinierten Bridge-Netzwerk standardmäßig alle Ports öffnen, kannst Du auf den Service-Container durch den standardmäßigen PostgreSQL-Port 5432 zugreifen.
Jobs direkt auf der Runner-Maschine ausführen
Wenn Du einen Job direkt auf der Runner-Maschine ausführst, musst Du die Ports des Service-Containers den Ports des Docker-Hosts zuordnen. Du kannst vom Docker-Host aus auf Dienstcontainer zugreifen, indem du localhost
und die Portnummer des Docker-Hosts verwendest.
Du kannst diese Workflowdatei in das .github/workflows
-Verzeichnis deines Repositorys kopieren und nach Bedarf ändern.
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
Konfigurieren des Runnerauftrags für Aufträge direkt auf dem Runnercomputer
Im Beispiel wird der GitHub-gehostete Runner ubuntu-latest
als Docker-Host verwendet.
Der Workflow konfiguriert einen Dienstcontainer mit der Bezeichnung postgres
. Alle Dienste müssen in einem Container ausgeführt werden, daher erfordert jeder Dienst die Angabe des Containers image
. Dieses Beispiel verwendet das postgres
-Containerimage, stellt das standardmäßige PostgreSQL-Passwort bereit und enthält Optionen für Systemdiagnosen, um sicherzustellen, dass der Dienst ausgeführt wird. Weitere Informationen findest du unter postgres-Image auf Docker Hub.
Der Workflow ordnet Port 5432 des PostgreSQL-Service-Containers dem Docker-Host zu. Weitere Informationen zum Schlüsselwort ports
findest du unter Informationen zu Service-Containern.
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
Konfigurieren der Schritte für Aufträge direkt auf dem Runnercomputer
Der Workflow führt die folgenden Schritte aus:
- Auschecken des Repository auf dem Läufer
- Installieren von Abhängigkeiten
- Ausführen eines Script, um einen Client zu erstellen
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
Das client.js-Skript sucht nach den Umgebungsvariablen POSTGRES_HOST
und POSTGRES_PORT
, um den Client zu erstellen. Der Workflow legt diese beiden Umgebungsvariablen im Rahmen des Schritts „Mit PostgreSQL verbinden“ fest, um sie dem client.js-Skript zur Verfügung zu stellen. Weitere Informationen zum Skript findest du unter Testen des PostgreSQL-Dienstcontainers.
Der Hostname ist localhost
oder 127.0.0.1
.
Den PostgreSQL-Service-Container testen
Du kannst deinen Workflow mithilfe des folgenden Skripts testen, das eine Verbindung mit dem PostgreSQL-Dienst herstellt und eine neue Tabelle mit einigen Platzhalterdaten hinzufügt. Anschließend gibt das Skript die in der PostgreSQL-Tabelle gespeicherten Werte im Terminal aus. Für das Skript kann eine beliebige Sprache verwendet werden. In diesem Beispiel werden jedoch Node.js und das npm-Modul pg
genutzt. Weitere Informationen findest du unter dem npm-Modul „pg“.
Du kannst client.js anpassen, um alle PostgreSQL-Vorgänge einzuschließen, die für deinen Workflow erforderlich sind. In diesem Beispiel stellt das Skript eine Verbindung mit dem PostgreSQL-Dienst her, fügt der Datenbank postgres
eine Tabelle hinzu, fügt einige Platzhalterdaten ein, und ruft anschließend die Daten ab.
Füge deinem Repository eine neue Datei namens client.js mit dem folgenden Code hinzu.
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()
});
Das Skript erstellt eine neue Verbindung mit dem PostgreSQL-Dienst und verwendet die Umgebungsvariablen POSTGRES_HOST
und POSTGRES_PORT
, um die IP-Adresse und den Port des PostgreSQL-Diensts anzugeben. Wenn host
und port
nicht definiert sind, werden der Standardhost localhost
und der Standardport 5432 verwendet.
Das Skript erstellt eine Tabelle und füllt sie mit Platzhalterdaten auf. Um zu testen, ob die Datenbank postgres
die Daten enthält, gibt das Skript den Inhalt der Tabelle im Konsolenprotokoll aus.
Wenn du diesen Workflow ausführst, sollte im Schritt „Connect to PostgreSQL“ (Verbindung mit PostgreSQL herstellen) die folgende Ausgabe angezeigt werden, die bestätigt, dass die Erstellung der PostgreSQL-Tabelle und das Hinzufügen von Daten erfolgreich waren:
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' } ]