---
updatedAt: 2026-08-20T07:50:24.000Z
agentTools:
  siteIndex: https://docs.jfrog.com/llms.txt
  projectIndex: https://docs.jfrog.com/security/llms.txt
---

# Jenkins

Frogbot integrates with Jenkins using the **Generic Webhook Trigger** plugin to respond to PR and push events from your Git provider.

## Prerequisites

* Install the [Generic Webhook Trigger](https://plugins.jenkins.io/generic-webhook-trigger/) plugin in Jenkins.
* Configure a webhook in your Git provider (GitHub, GitLab, Bitbucket Server, or Azure Repos) that points to your Jenkins instance.

## Setup

### Step 1: Configure Credentials

In Jenkins, go to **Manage Jenkins > Credentials** and add:

| Credential         | Type        | ID                |
| ------------------ | ----------- | ----------------- |
| JFrog Platform URL | Secret text | `JF_URL`          |
| JFrog access token | Secret text | `JF_ACCESS_TOKEN` |
| JFrog username     | Secret text | `JF_USER`         |
| JFrog password     | Secret text | `JF_PASSWORD`     |
| Git provider token | Secret text | `JF_GIT_TOKEN`    |

Set either `JF_ACCESS_TOKEN` or both `JF_USER` and `JF_PASSWORD`.

### Step 2: Create a PR Scan Pipeline

Create a `Jenkinsfile` for PR scanning:

```groovy
pipeline {
    // Use your agent with installed package manager (npm, go, python, etc.)
    agent { label '<YOUR_AGENT_LABEL>' }
    
    triggers {
        // Webhook trigger - uncomment ONE provider block below based on your Git provider
        GenericTrigger(
            genericVariables: [
                // GitHub - Uncomment for GitHub
                //[key: 'JF_GIT_REPO', value: '$.repository.name'],
                //[key: 'JF_GIT_PULL_REQUEST_ID', value: '$.number'],
                //[key: 'JF_GIT_OWNER', value: '$.repository.owner.login'],
                //[key: 'JF_GIT_BASE_BRANCH', value: '$.pull_request.base.ref'],

                // GitLab - Uncomment for GitLab
                //[key: 'JF_GIT_REPO', value: '$.project.name'],
                //[key: 'JF_GIT_PULL_REQUEST_ID', value: '$.object_attributes.iid'],
                //[key: 'JF_GIT_OWNER', value: '$.project.namespace'],
                //[key: 'JF_GIT_BASE_BRANCH', value: '$.object_attributes.target_branch'],

                // Bitbucket Server - Uncomment for Bitbucket
                //[key: 'JF_GIT_REPO', value: '$.pullRequest.fromRef.repository.slug'],
                //[key: 'JF_GIT_PULL_REQUEST_ID', value: '$.pullRequest.id'],
                //[key: 'JF_GIT_OWNER', value: '$.pullRequest.fromRef.repository.project.key'],
                //[key: 'JF_GIT_BASE_BRANCH', value: '$.pullRequest.toRef.displayId'],

                // Azure Repos - Uncomment for Azure Repos
                //[key: 'JF_GIT_REPO', value: '$.resource.repository.name'],
                //[key: 'JF_GIT_PULL_REQUEST_ID', value: '$.resource.pullRequestId'],
                //[key: 'JF_GIT_OWNER', value: '$.resource.repository.project.name'],
                //[key: 'JF_GIT_BASE_BRANCH', value: '$.resource.targetRefName'],
                //[key: 'JF_GIT_PROJECT', value: '$.resource.repository.project.name'],
            ],
            causeString: 'Pull Request Webhook',
            // Webhook URL: https://<JENKINS_URL>/generic-webhook-trigger/invoke?token=<YOUR_WEBHOOK_TOKEN>
            token: '<YOUR_WEBHOOK_TOKEN>'
        )
    }
    
    environment {
        // [Mandatory] JFrog Platform URL
        // Example: 'https://mycompany.jfrog.io/'
        JF_URL = credentials('<YOUR_JF_URL_CREDENTIAL_ID>')
        
        // [Mandatory] JFrog Access Token with Xray read permissions
        JF_ACCESS_TOKEN = credentials('<YOUR_JF_ACCESS_TOKEN_CREDENTIAL_ID>')
        
        // [Mandatory] Git access token with repo permissions
        JF_GIT_TOKEN = credentials('<YOUR_GIT_TOKEN_CREDENTIAL_ID>')
        
        // [Mandatory] Git provider: 'github', 'gitlab', 'bitbucketServer', 'azureRepos'
        JF_GIT_PROVIDER = '<YOUR_GIT_PROVIDER>'
        
        // [Mandatory for on-prem Git] API endpoint
        // Examples: 'https://api.github.com', 'https://gitlab.company.com/api/v4'
        JF_GIT_API_ENDPOINT = '<YOUR_GIT_API_ENDPOINT>'
    }
    
    stages {
        stage('Frogbot Scan Pull Request') {
            steps {
                sh """
                    curl -fL "https://releases.jfrog.io/artifactory/frogbot/v3/[RELEASE]/getFrogbot.sh" | sh
                    ./frogbot scan-pull-request
                """
            }
        }
    }
}
```

### Step 3: Create a Commit Scan Pipeline

Create a separate `Jenkinsfile` for commit scanning (typically triggered by cron or push):

```groovy
pipeline {
    // Use your agent with installed package manager (npm, go, python, etc.)
    agent { label '<YOUR_AGENT_LABEL>' }
    
    triggers {
        // Scheduled scan - runs daily at midnight
        cron('0 0 * * *')
        
        // Webhook trigger - uncomment ONE provider block below based on your Git provider
        GenericTrigger(
            genericVariables: [
                // GitHub Push - Uncomment for GitHub
                //[key: 'JF_GIT_REPO', value: '$.repository.name'],
                //[key: 'JF_GIT_OWNER', value: '$.repository.owner.login'],
                //[key: 'JF_GIT_BASE_BRANCH', value: '$.ref'],

                // GitLab Push - Uncomment for GitLab
                //[key: 'JF_GIT_REPO', value: '$.project.name'],
                //[key: 'JF_GIT_OWNER', value: '$.project.namespace'],
                //[key: 'JF_GIT_BASE_BRANCH', value: '$.ref'],

                // Bitbucket Push - Uncomment for Bitbucket Server
                //[key: 'JF_GIT_REPO', value: '$.repository.slug'],
                //[key: 'JF_GIT_OWNER', value: '$.repository.project.key'],
                //[key: 'JF_GIT_BASE_BRANCH', value: '$.changes[0].ref.displayId'],

                // Azure Repos Push - Uncomment for Azure Repos
                //[key: 'JF_GIT_REPO', value: '$.resource.repository.name'],
                //[key: 'JF_GIT_OWNER', value: '$.resource.repository.project.name'],
                //[key: 'JF_GIT_BASE_BRANCH', value: '$.resource.refUpdates[0].name'],
                //[key: 'JF_GIT_PROJECT', value: '$.resource.repository.project.name'],
            ],
            causeString: 'Push Webhook',
             regexpFilterText: '$ref',
            //TRIGGERS ONLY ON MASTER/MAIN
             regexpFilterExpression: '^refs/heads/(master|main)$',
            // Webhook URL: https://<JENKINS_URL>/generic-webhook-trigger/invoke?token=<YOUR_WEBHOOK_TOKEN>
            token: '<YOUR_WEBHOOK_TOKEN>'
        )
    }
    
    environment {
        // [Mandatory] JFrog Platform URL
        // Example: 'https://mycompany.jfrog.io/'
        JF_URL = credentials('<YOUR_JF_URL_CREDENTIAL_ID>')
        
        // [Mandatory] JFrog Access Token with Xray read permissions
        JF_ACCESS_TOKEN = credentials('<YOUR_JF_ACCESS_TOKEN_CREDENTIAL_ID>')
        
        // [Mandatory] Git access token with repo permissions
        JF_GIT_TOKEN = credentials('<YOUR_GIT_TOKEN_CREDENTIAL_ID>')
        
        // [Mandatory] Git provider: 'github', 'gitlab', 'bitbucketServer', 'azureRepos'
        JF_GIT_PROVIDER = '<YOUR_GIT_PROVIDER>'
        
        // [Mandatory for on-prem Git] API endpoint
        // Examples: 'https://api.github.com', 'https://gitlab.company.com/api/v4'
        JF_GIT_API_ENDPOINT = '<YOUR_GIT_API_ENDPOINT>'
    }
    
    stages {
        stage('Frogbot Scan Repository') {
            steps {
                sh """
                    curl -fL "https://releases.jfrog.io/artifactory/frogbot/v3/[RELEASE]/getFrogbot.sh" | sh
                    ./frogbot scan-repository
                """
            }
        }
    }
}
```

## Webhook Configuration by Git Provider

| Git Provider         | Webhook Events                             | Payload Field Mappings                                                                                  |
| -------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------- |
| **GitHub**           | Pull requests (opened, synchronize)        | `$.repository.name`, `$.pull_request.number`, `$.repository.owner.login`                                |
| **GitLab**           | Merge request events                       | `$.project.path`, `$.object_attributes.iid`, `$.project.namespace`                                      |
| **Bitbucket Server** | Pull request (opened, source updated)      | `$.pullRequest.toRef.repository.slug`, `$.pullRequest.id`, `$.pullRequest.toRef.repository.project.key` |
| **Azure Repos**      | Pull request created, Pull request updated | `$.resource.repository.name`, `$.resource.pullRequestId`, `$.resource.repository.project.name`          |

Adjust the `genericVariables` in the `GenericTrigger` configuration to match your Git provider's webhook payload structure.