Skip to main content

🐳 Docker Usage Guide

TestPig now includes a built-in CLI utility that makes running tests in Docker containers seamless. No more unknown values for git information!

Game Changer

The testpig-git-env command automatically detects your CI environment and provides proper git information to Docker containers. It's included with any TestPig reporter!

Quick Start​

If you have any TestPig reporter installed, you automatically get the testpig-git-env command:

# Replace your docker run command:
docker run --rm my-test-image

# With this:
docker run --rm $(npx testpig-git-env) my-test-image

That's it! TestPig will automatically:

  • ✅ Detect your CI environment (GitHub Actions, GitLab CI, etc.)
  • ✅ Fall back to local git commands when not in CI
  • ✅ Work on Windows, macOS, and Linux
  • ✅ Provide consistent git information to your tests

Choose Your Workflow​

TestPig's testpig-git-env supports multiple workflows to fit your needs:

Use CaseFormatCommand Example
Docker Rundocker (default)docker run --rm $(npx testpig-git-env) my-image
Docker Composeenvnpx testpig-git-env --format=env > .env && docker compose --env-file .env run tests
Shell Exportexporteval "$(npx testpig-git-env --format=export)" && docker compose run tests
Debuggingjsonnpx testpig-git-env --format=json --verbose
Pick What Works for You
  • Docker Run: Use the default format
  • Docker Compose: Use --format=env for environment files or --format=export for shell variables
  • CI/CD: Any format works - choose based on your pipeline setup

How It Works​

The testpig-git-env utility:

  1. Detects CI Environment: Automatically recognizes GitHub Actions, GitLab CI, CircleCI, Jenkins, Travis CI, and more
  2. Extracts Git Information: Gets branch, commit, author, and email from CI variables or git commands
  3. Outputs Docker Flags: Provides properly formatted -e flags for Docker

Example Output​

$ npx testpig-git-env
-e TESTPIG_GIT_BRANCH="main" -e TESTPIG_GIT_COMMIT="abc123..." -e TESTPIG_GIT_AUTHOR="John Doe" -e TESTPIG_GIT_EMAIL="[email protected]" -e TESTPIG_CI_PROVIDER="github"

Output Formats​

The CLI supports multiple output formats for different use cases:

# Docker flags (default)
npx testpig-git-env
# Output: -e TESTPIG_GIT_BRANCH="main" -e TESTPIG_GIT_COMMIT="abc123..."

# Environment file format
npx testpig-git-env --format=env
# Output: TESTPIG_GIT_BRANCH=main
# TESTPIG_GIT_COMMIT=abc123...

# Shell export format
npx testpig-git-env --format=export
# Output: export TESTPIG_GIT_BRANCH="main"
# export TESTPIG_GIT_COMMIT="abc123..."

# JSON format
npx testpig-git-env --format=json
# Output: {"branch": "main", "commit": "abc123..."}

Usage Examples by Format​

Docker Run (Default Format)​

Perfect for docker run commands:

# macOS/Linux
docker run --rm $(npx testpig-git-env) my-test-image

# Windows PowerShell
$env_vars = npx testpig-git-env
docker run --rm $env_vars my-test-image

# Windows Command Prompt
for /f "delims=" %i in ('npx testpig-git-env') do docker run --rm %i my-test-image

Docker Compose Workflows​

Environment File Approach​

# Step 1: Generate environment file
npx testpig-git-env --format=env > .testpig.env

# Step 2: Use with any Docker Compose command
docker compose --env-file .testpig.env run tests
docker compose --env-file .testpig.env up cypress

Shell Export Approach​

# Export to current shell and run
eval "$(npx testpig-git-env --format=export)" && docker compose run tests

# Or export once, run multiple times
eval "$(npx testpig-git-env --format=export)"
docker compose run unit-tests
docker compose run integration-tests

Local Development Examples​

Choose the method that fits your workflow:

CI/CD Examples​

GitHub Actions​

name: Test
on: [push, pull_request]

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'

- name: Install dependencies
run: npm ci

- name: Run tests in Docker
run: |
docker run --rm $(npx testpig-git-env) my-test-image

GitLab CI​

test:
image: docker:latest
services:
- docker:dind
before_script:
- apk add --no-cache nodejs npm
- npm ci
script:
- docker run --rm $(npx testpig-git-env) my-test-image

CircleCI​

version: 2.1
jobs:
test:
docker:
- image: cimg/node:18
steps:
- checkout
- setup_remote_docker
- run:
name: Install dependencies
command: npm ci
- run:
name: Run Docker tests
command: docker run --rm $(npx testpig-git-env) my-test-image

Docker Compose​

With Docker Compose, you have multiple convenient options:

Generate an environment file and use it with Docker Compose:

# Generate environment file
npx testpig-git-env --format=env > .testpig.env

# Use with Docker Compose
docker compose --env-file .testpig.env run tests
# docker-compose.yml
version: '3.8'
services:
tests:
image: my-test-image
environment:
# These will be automatically loaded from .testpig.env
- TESTPIG_GIT_BRANCH
- TESTPIG_GIT_COMMIT
- TESTPIG_GIT_AUTHOR
- TESTPIG_GIT_EMAIL
- TESTPIG_CI_PROVIDER

Method 2: Shell Export​

Export variables to your shell environment:

# Export variables to current shell
eval "$(npx testpig-git-env --format=export)"

# Now run Docker Compose (variables are available)
docker compose up tests
# docker-compose.yml
version: '3.8'
services:
tests:
image: my-test-image
environment:
# These will be picked up from the shell environment
- TESTPIG_GIT_BRANCH=${TESTPIG_GIT_BRANCH}
- TESTPIG_GIT_COMMIT=${TESTPIG_GIT_COMMIT}
- TESTPIG_GIT_AUTHOR=${TESTPIG_GIT_AUTHOR}
- TESTPIG_GIT_EMAIL=${TESTPIG_GIT_EMAIL}
- TESTPIG_CI_PROVIDER=${TESTPIG_CI_PROVIDER}

Method 3: One-liner Shell Export​

# Generate and apply environment variables in one command
eval "$(npx testpig-git-env --format=export)" && docker compose run tests

Method 4: Manual Override (When Needed)​

Only specify environment variables if you want to override the automatic detection:

# Generate base environment file
npx testpig-git-env --format=env > .testpig.env

# Add custom overrides to the file
echo "TESTPIG_GIT_AUTHOR=Release Bot" >> .testpig.env

# Use with Docker Compose
docker compose --env-file .testpig.env run tests

Advanced Usage​

Debug Mode​

See exactly what's being detected:

# Debug with JSON output
npx testpig-git-env --verbose --json

# Debug with any format
npx testpig-git-env --verbose --format=env

Example debug output:

{
"branch": "feature/docker-support",
"commit": "abc123def456789...",
"author": "John Doe",
"email": "[email protected]",
"provider": "github",
"isCI": true
}

CLI Options​

The testpig-git-env command supports these options:

OptionDescriptionExample
--format=FORMATOutput format: docker, env, export, json--format=env
--jsonJSON output (shorthand for --format=json)--json
--verboseShow debug information--verbose
--helpShow help message--help

Manual Overrides​

The testpig-git-env utility automatically detects git information, but you can override specific values when needed:

# Override just the branch (other values auto-detected)
export TESTPIG_GIT_BRANCH="custom-branch"
docker run --rm $(npx testpig-git-env) my-test-image

# Override multiple values (remaining values auto-detected)
export TESTPIG_GIT_BRANCH="hotfix"
export TESTPIG_GIT_AUTHOR="Release Bot"
docker run --rm $(npx testpig-git-env) my-test-image
Automatic + Override

You only need to set environment variables for values you want to override. All other git information will be automatically detected and provided by testpig-git-env.

Available Override Variables​

VariableDescriptionExample
TESTPIG_GIT_BRANCHGit branch namemain, feature/auth
TESTPIG_GIT_COMMITFull commit SHAabc123def456789...
TESTPIG_GIT_AUTHORAuthor nameJohn Doe
TESTPIG_GIT_EMAILAuthor email[email protected]
TESTPIG_CI_PROVIDERCI provider namegithub, gitlab, local

Supported CI Providers​

The utility automatically detects these CI environments:

  • GitHub Actions (GITHUB_ACTIONS, GITHUB_RUN_ID)
  • GitLab CI (GITLAB_CI, CI_PIPELINE_ID)
  • CircleCI (CIRCLECI, CIRCLE_WORKFLOW_ID)
  • Jenkins (JENKINS_URL, BUILD_NUMBER)
  • Travis CI (TRAVIS, TRAVIS_JOB_ID)
  • Generic CI (CI=true, CONTINUOUS_INTEGRATION=true)

Troubleshooting​

Issue: Command not found​

npx testpig-git-env
# Error: command not found

Solution: Make sure you have a TestPig reporter installed:

npm install @testpig/jest-reporter
# or
npm install @testpig/cypress-reporter
# or any other @testpig/* package

Issue: Permission denied on Windows​

# Use PowerShell instead of CMD
$env_vars = npx testpig-git-env
docker run --rm $env_vars my-test-image

Issue: Git commands fail in container​

The utility detects git information on the host machine, not inside the container. This is intentional and correct behavior.

Issue: All values show as "unknown"​

Enable debug mode to see what's happening:

npx testpig-git-env --verbose --json

Common causes:

  • Not in a git repository
  • Git not installed on host
  • CI environment variables not set properly

Issue: Environment file not working with Docker Compose​

# Check the generated environment file
cat .testpig.env

# Verify Docker Compose can read it
docker compose --env-file .testpig.env config

Issue: Shell export not persisting​

# Make sure to use eval with quotes
eval "$(npx testpig-git-env --format=export)"

# Verify variables are set
echo $TESTPIG_GIT_BRANCH

Best Practices​

1. Use in npm scripts​

{
"scripts": {
"test:docker": "docker run --rm $(npx testpig-git-env) my-test-image",
"test:docker:debug": "npx testpig-git-env --verbose && npm run test:docker",
"test:compose": "npx testpig-git-env --format=env > .testpig.env && docker compose --env-file .testpig.env run tests",
"test:compose:export": "eval \"$(npx testpig-git-env --format=export)\" && docker compose run tests"
}
}

2. Create shell aliases​

# Add to your .bashrc or .zshrc
alias docker-test='docker run --rm $(npx testpig-git-env)'
alias compose-test='eval "$(npx testpig-git-env --format=export)" && docker compose run tests'

# Usage:
docker-test my-test-image
compose-test

3. Environment file workflow​

# Create a reusable environment file
npx testpig-git-env --format=env > .testpig.env

# Add to .gitignore (contains current git state)
echo ".testpig.env" >> .gitignore

# Use across multiple compose commands
docker compose --env-file .testpig.env run tests
docker compose --env-file .testpig.env run integration-tests

4. CI Pipeline Templates​

Create reusable CI templates with TestPig Docker support built-in.

Migration Guide​

Before (manual environment variables)​

docker run --rm \
-e GIT_BRANCH="$(git rev-parse --abbrev-ref HEAD)" \
-e GIT_COMMIT="$(git rev-parse HEAD)" \
-e GIT_AUTHOR="$(git config user.name)" \
my-test-image

After (automatic detection)​

docker run --rm $(npx testpig-git-env) my-test-image

The new approach:

  • ✅ Works across all supported CI providers (GitHub, GitLab, Jenkins, Travis, CircleCI - More coming soon!)
  • ✅ Handles edge cases (PRs, detached HEAD, etc.)
  • ✅ Provides consistent variable names
  • ✅ Includes debug and override capabilities
  • ✅ Works on all platforms

Framework-Specific Examples​

For specific examples with your testing framework, see:

Getting Help​

If you encounter issues with Docker usage:

Ready to run your tests in Docker with proper git information? Let's go! 🚀