Use pip with JFrog CLI

Run pip install with Artifactory integration and optional build-info collection.

This topic covers the following tasks:

When to Use

Use jf pip if your Python project uses pip with requirements.txt for dependency management. For Pipenv-based projects (with Pipfile), use jf pipenv. For Poetry-based projects (with pyproject.toml), use jf poetry.

Prerequisites

  • pip must be installed (Python 3.6+), and the pip binary must be available in your $PATH. On macOS and Linux systems where only pip3 is installed, create a symlink before using jf pip:
    sudo ln -s $(which pip3) /usr/local/bin/pip
  • Run jf pip-config in the project directory before the first install.
  • Configure a server with jf config add or jf c add. If your access token is a reference token (non-JWT), also supply a username to enable basic authentication for pip:
    jf config add --user=<username> --access-token=<token> --url=<platform-url>
  • Authentication to Artifactory is required.
  • Using a Python virtual environment is required for accurate build-info. Packages installed outside a clean virtual environment before the first jf pip install will be missing from build-info records. See Recording All Dependencies for details.

Configuration: jf pip-config

Generate pip build configuration for dependency resolution and deployment. Run this once per project before your first install.

To configure pip for Artifactory:

Synopsis

jf pip-config [options]

Aliases: pipc

Configuration Options

FlagDefaultDescription
--globalfalseSet to true for global configuration (all projects). Specific projects can override.
--repo-deployRepository for artifacts deployment
--repo-resolveRepository for dependencies resolution
--server-id-deployArtifactory server ID for deployment. Configure with jf config add.
--server-id-resolveArtifactory server ID for resolution. Configure with jf config add.

Configuration Examples

View Help

jf pip-config --help

Non-Interactive Configuration with Flags

jf pip-config --server-id-resolve=<server-id> --repo-resolve=<repo-name> --server-id-deploy=<server-id> --repo-deploy=<repo-name>

Where:

  • <server-id>: The server ID configured using jf config add
  • <repo-name>: The name of the repository in Artifactory

For example:

jf pip-config --server-id-resolve=my-server --repo-resolve=pypi-virtual --server-id-deploy=my-server --repo-deploy=pypi-local

Why Run Config First?

You must run jf pip-config before jf pip install. The config command creates .jfrog/projects/pip.yaml which directs pip to resolve from and deploy to Artifactory repositories. Without it, jf pip does not know where to fetch packages.

👍

Shortcut

: In CI/CD, pass all flags non-interactively so the config step is fully automated and reproducible.

Configuration Notes

  • Covers twine too: This config also applies to jf twine upload for publishing Python packages.
  • Run once per project: Re-run when changing repository assignments.
  • Resolution and deployment: Use --repo-resolve for installing packages and --repo-deploy for publishing.

Expected Output

$ jf pip-config --server-id-resolve=my-server --repo-resolve=pypi-virtual --server-id-deploy=my-server --repo-deploy=pypi-local
[Info] pip build config successfully created.

How to Verify

After running, confirm the configuration exists:

cat .jfrog/projects/pip.yaml

Build: jf pip

Run pip install with Artifactory integration and optional build-info collection.

To run pip with Artifactory integration:

Synopsis

jf pip <pip-arguments> [options]

Aliases: none

Arguments

ArgumentRequiredDescription
<pip-arguments>YesArguments and options for the pip command (for example, install, freeze)

Build Options

FlagDefaultDescription
--build-nameBuild name for build-info. Requires --build-number.
--build-numberBuild number for build-info. Requires --build-name.
--moduleOptional module name for build-info. Requires --build-name and --build-number.
--projectJFrog Artifactory project key

Build Examples

View Help

jf pip --help

Install Dependencies with Build-Info

jf pip install -r requirements.txt --build-name=<build-name> --build-number=<build-number>

Where:

  • <build-name> is a name for the build (for example, my-python-app)
  • <build-number> is a number or identifier for the build run (for example, 1)

For example:

jf pip install -r requirements.txt --build-name=my-python-app --build-number=1

Install a Single Package

jf pip install <package-name>

For example:

jf pip install requests

Expected Output

A successful jf pip install prints the standard pip output followed by a build-info summary when --build-name and --build-number are provided:

[Info] Running pip install
Collecting requests
  Downloading requests-2.28.2-py3-none-any.whl (62 kB)
...
Successfully installed requests-2.28.2
[Info] Collecting build info...
[Info] Build info collected.

If no build-info flags are used, only the standard pip output appears.

How to Verify

After install, confirm the dependency cache was written:

cat .jfrog/projects/deps.cache.json

To list installed packages:

pip list

Recording All Dependencies

JFrog CLI records installed packages as build-info dependencies. The recorded dependencies are packages installed during the jf pip install command execution. When running inside a Python environment that already has some packages installed, those packages will not be included in the build-info because they were not originally installed by JFrog CLI. A warning message will appear in the log.

To include all packages in the build-info:

  1. Prefer a clean virtual environment so every dependency is installed during jf pip install.

  2. If packages were installed before the first jf pip install, JFrog CLI may omit them from .jfrog/projects/deps.cache.json. Re-run install with --no-cache-dir and --force-reinstall so those packages are re-downloaded, recorded in build-info, and cached:

    jf pip install --no-cache-dir --force-reinstall -r requirements.txt --build-name=<build-name> --build-number=<build-number>

    Where:

    • <build-name>: Your build name (must match other steps in the pipeline)
    • <build-number>: Your build number or identifier

The details of installed packages are cached in .jfrog/projects/deps.cache.json at the project root; JFrog CLI uses this cache when assembling build-info.

Important Notes

  • pip commands: All standard pip arguments work (install, install -r requirements.txt, freeze, and others).
  • Build-info: Use --build-name and --build-number to collect installed package info, then publish with jf rt build-publish.
  • Publishing: jf pip is for installing packages. To publish Python packages to Artifactory, use jf twine.

Platform Notes

  • Windows: The .pypirc configuration file is located at %USERPROFILE%\.pypirc. On macOS/Linux it is at ~/.pypirc.
  • Virtual environments: On Windows, activate with .\venv\Scripts\activate. On macOS/Linux, use source venv/bin/activate.
  • pip vs pip3: jf pip internally invokes the pip binary directly. On systems where only pip3 is available (standard on macOS and Ubuntu 22.04+), you must either create a symlink (sudo ln -s $(which pip3) /usr/local/bin/pip) or use a virtual environment where pip is present alongside pip3. Note: using pip3 in your own shell does not affect what jf pip calls internally.

CI/CD Example (GitHub Actions)

# .github/workflows/build.yml
steps:
  - uses: actions/checkout@v4
  - name: Setup JFrog CLI
    uses: jfrog/setup-jfrog-cli@v4
    env:
      JF_URL: ${{ vars.JF_URL }}
      JF_ACCESS_TOKEN: ${{ secrets.JF_ACCESS_TOKEN }}
  - name: Setup Python
    uses: actions/setup-python@v5
    with:
      python-version: '3.12'
  - name: Configure pip
    run: jf pip-config --server-id-resolve=setup-jfrog-cli-server --repo-resolve=pypi-virtual
  - name: Install dependencies
    run: jf pip install -r requirements.txt --build-name=my-python-app --build-number=${{ github.run_number }}
  - name: Publish build info
    run: jf rt build-publish my-python-app ${{ github.run_number }}

Troubleshooting

SymptomCauseFix
no config file was foundjf pip-config was not runRun jf pip-config in the project directory
404 on jf pip installResolution repository does not exist or name is wrongVerify the repo name matches an existing PyPI virtual repository in Artifactory
401 / 403 errorsInvalid credentials or insufficient permissionsRe-run jf config add with a valid access token; check repo permissions
Build-info missing some dependenciesPackages were installed before JFrog CLI was usedRun jf pip install --no-cache-dir --force-reinstall -r requirements.txt inside a clean virtual environment
exec: "pip": executable file not found in $PATH when running jf pipjf pip requires the pip binary in $PATH; on macOS/Linux only pip3 may be installedCreate a symlink: sudo ln -s $(which pip3) /usr/local/bin/pip, or activate a virtual environment where pip is present. Using pip3 in your shell alone does not fix this.
pip not found when running pip directlyWrong Python/pip version or not in PATHUse pip3 or activate the correct Python virtual environment
[Warn] couldn't extract payload from Access Token before pip installAccess token is a reference token (non-JWT); pip requires basic authRe-configure the server with a username: jf config add --user=<username> --access-token=<token> --url=<url>
SSL certificate errorsCorporate proxy or self-signed certificatesUse --insecure-tls on jf config add, or configure your CA bundle

Enable debug logging: export JFROG_CLI_LOG_LEVEL=DEBUG


Related Topics