How to Run a Postgres Service in a Jenkins Pipeline
Jenkins runs sidecar services with the Docker Pipeline plugin's docker.image().withRun, which starts and links a container around your steps.
Use the Docker Pipeline plugin's sidecar pattern: withRun starts a container, gives you its handle, and tears it down when the block exits.
Postgres sidecar
Start Postgres, wait for it, run tests against it, then it is automatically removed.
Jenkinsfile
pipeline {
agent any
stages {
stage('Test') {
steps {
script {
docker.image('postgres:16').withRun(
'-e POSTGRES_PASSWORD=postgres -p 5432:5432'
) { c ->
sh 'until pg_isready -h localhost -p 5432; do sleep 1; done'
withEnv(['DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres']) {
sh 'npm ci && npm test'
}
}
}
}
}
}
}Gotchas
- Requires the Docker Pipeline plugin and a Docker daemon on the agent.
- Wait for the DB to accept connections (
pg_isreadyloop) before connecting -withRunreturns as soon as the container starts. - If your build runs inside a container, link via the inner network alias instead of
localhost.
Related guides
How to Run a Postgres Service Container in GitHub ActionsRun a Postgres (or Redis) service container in GitHub Actions with services:, health checks, and port mapping…
How to Archive Build Artifacts in a Jenkins PipelineArchive build artifacts in a Jenkins pipeline with archiveArtifacts, publish test reports with junit, and pas…