Use Pipenv with JFrog CLI

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

This topic covers the following tasks:

When to Use

Use jf pipenv if your Python project uses Pipenv (with Pipfile and Pipfile.lock) instead of pip with requirements.txt. For pip-based projects, use jf pip instead. For Poetry-based projects, use jf poetry.

Prerequisites

  • Pipenv must be installed. On macOS, the recommended method is brew install pipenv. Alternatively, use pip install pipenv — but note that on macOS this installs the pipenv binary to ~/Library/Python/X.Y/bin, which is not on $PATH by default. Verify with pipenv --version after installation; if the command is not found, add the install directory to your $PATH or use Homebrew instead.
  • Run jf pipenv-config in the project directory before the first install.
  • Configure a server with jf config add or jf c add.
  • Authentication to Artifactory is required. If you use a reference token (identity token) rather than a standard JWT access token, you must also provide a username when configuring the server — some package managers, including Pipenv, require basic authentication and do not support reference tokens alone.

Configuration: jf pipenv-config

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

To configure Pipenv for Artifactory:

Synopsis

jf pipenv-config [options]

Aliases: pipec

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 pipenv-config --help

Non-Interactive Configuration with Flags

jf pipenv-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 pipenv-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 pipenv-config before jf pipenv install. The config creates .jfrog/projects/pipenv.yaml for Artifactory integration. Without it, jf pipenv does not know where to fetch packages.

If you skip this step, you will see the error: no config file was found! Before running the 'jf pipenv' command on a project for the first time, the project should be configured with the 'jf pipenv-config' command.

👍

Shortcut

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

Configuration Notes

  • Run once per project: Re-run when changing repository assignments.
  • Alternative: If your project uses requirements.txt instead of Pipfile, use jf pip-config and jf pip instead.

Expected Output

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

How to Verify

After running, confirm the configuration exists:

cat .jfrog/projects/pipenv.yaml

The file should contain:

version: 1
type: pipenv
resolver:
    repo: <repo-resolve-value>
    serverId: <server-id>
deployer:
    repo: <repo-deploy-value>
    serverId: <server-id>

Build: jf pipenv

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

To run Pipenv with Artifactory integration:

Synopsis

jf pipenv <pipenv-arguments> [options]

Aliases: none

Arguments

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

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 pipenv --help

Install Dependencies with Build-Info

jf pipenv install --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 pipenv install --build-name=my-python-app --build-number=1

On success, Pipenv outputs the resolved and installed packages, followed by confirmation that Pipfile.lock was updated. JFrog CLI records the installed packages as build-info dependencies. No additional JFrog-specific output is printed unless there is a warning or error.

Install from Pipfile

jf pipenv install

On success, Pipenv outputs progress for virtual environment creation (if new), dependency resolution, and package installation. For example:

[Info] Running pipenv install
Installing dependencies from Pipfile.lock...
To activate this project's virtualenv, run pipenv shell.

Recording All Dependencies

JFrog CLI records installed packages as build-info dependencies. The recorded dependencies are packages installed during the jf pipenv 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.

To capture all dependencies in build-info when the environment was pre-populated:

  1. Remove the existing virtual environment:

    pipenv --rm
  2. Recreate the environment and install through JFrog CLI:

    jf pipenv install --build-name=<build-name> --build-number=<build-number>

    Where:

    • <build-name>: Your build name
    • <build-number>: Your build number or identifier

Package details are cached in .jfrog/projects/deps.cache.json for subsequent build-info assembly.

Important Notes

  • Pipenv commands: All standard Pipenv arguments work (install, lock, sync, and others).
  • Build-info: Use --build-name and --build-number, then publish with jf rt build-publish.

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: Install Pipenv
    run: pip install pipenv
  - name: Configure Pipenv
    run: jf pipenv-config --server-id-resolve=setup-jfrog-cli-server --repo-resolve=pypi-virtual
  - name: Install dependencies
    run: jf pipenv install --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 pipenv-config was not runRun jf pipenv-config in the project directory
404 on jf pipenv 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
[Warn] couldn't extract payload from Access TokenA reference (identity) token was used; Pipenv requires basic authenticationRe-run jf config add and supply both a username and a password or scoped access token. Reference tokens are not supported by Pipenv's package resolution layer.
Build-info missing some dependenciesPackages were installed before JFrog CLI was usedDelete the virtual environment (pipenv --rm), recreate it, then run jf pipenv install
Pipfile.lock out of syncLockfile was generated outside JFrog CLIRun jf pipenv lock to regenerate from Artifactory sources
command not found: pipenv after pip install pipenvOn macOS, pip install places scripts in a non-$PATH directoryUse brew install pipenv instead, or add ~/Library/Python/X.Y/bin to your $PATH

Enable debug logging: export JFROG_CLI_LOG_LEVEL=DEBUG


Related Topics