Hivel
Hivel
Hivel
  • 👋Welcome to Hivel
  • 🚀Using Hivel
    • ⭐Cockpit Pro
      • ⬇️How to download reports
      • 🤝Meetings Breakdown
    • 🏃‍♀️Activity
    • ⛑️Work Item Breakdown
    • ➕Hivel Quadrant
    • 💰Investment
      • Issue Age
      • How to set up Products & Allocation tabs in the Investment Screen?
      • How to add Custom fields for Product and Allocation Label in Jira
    • 💎Performance Appraisal
    • 🎯Pull Request
      • Comments Categorization
      • Review Cycles
      • How to exclude outlier commits and PRs?
    • 🐞Quality (SonarQube)
    • ♨️Coding Hotspots
    • ⚽Goals
    • 👩‍🏫Process
    • 🖥️Coding
      • Understanding Rework, New Work, and Maintenance
    • 👨‍🎓Dev360
    • 🔔Slack Alerts and Notifications
  • Copilot Adoption
  • 📊Metrics & Definitions
    • 🚅Speed
      • Deployment Frequency
      • Coding Time
      • Review Time
      • Merge Time
      • Cycle Time
      • Pickup time
    • 💯Quality
      • Change Failure Rate
      • Maintenance
      • Rework
      • Mean Time to Restore (MTTR)
      • PRs merged without review
      • PR Reviewed
      • Flashy Reviews
      • PRs > 400 LoC
    • 📈Throughput
      • New Work%
      • How are Active Days calculated
      • PRs Open, PRs Ready to Review or Merge
  • 🔗Integrations
    • List of all integrations
    • GitHub
      • How do I Signup using GitHub?
      • How to integrate GitHub with Classic Token?
      • How to create Github fine-grained token for Hivel Integration?
      • How to reauthorize Github with a service account?
      • GitHub-Alternate SignUp Method Instructions
      • How to re-initiate GitHub integration with Hivel
    • Gitlab
      • Gitlab Server
      • Gitlab Cloud
      • How to ensure Gitlab token has access to required groups/repositories
    • BitBucket
      • BitBucket Integration
      • Validation at a metric level for BitBucket
    • Jira
      • How to integrate Jira Cloud with Hivel
      • How to Re-authorize Jira in Hivel?
        • Page
      • How to Integrate Jira with OAuth 2.0
      • How to Re-authorize Jira with OAuth 2.0
      • How to integrate Jira Server with Hivel
    • Azure DevOps
    • Google Calendar
      • How to integrate Google Calendar in Hivel
    • Microsoft Outlook
    • Slack
    • SonarQube
    • Okta
    • Jenkins
    • Jenkins Freestyle Integration with Ansible and Hivel Webhook
  • On-Prem Setup
    • On-Prem Installation Guide
    • Jira On-Prem
    • Gitlab On-Prem
    • SonarQube On-Prem
    • Application Setup Guide: User Sign-up and Integration
    • Creating a Bitbucket App Password
    • On-Prem Outlook Integration
  • Github Copilot Integration
  • ⚒️Setup
    • Sign Up
      • How to sign up to Hivel?
    • Users
      • How to invite more users to use Hivel?
      • How to add or update an user's email id?
      • How to merge users?
      • How to update the name of a user?
      • Can I see the data of a user or repo that I don’t have access to on my SCM tool?
      • How to archive users?
    • Teams
      • How to create teams?
      • How to delete a team?
      • How to modify a team?
      • How to create sub-teams?
    • Role-Based Access Control (RBAC)
    • ⚙️Configurations Explained
      • 🌴Branch Configurations
      • 🐞Hotfix Configurations
        • Track hotfixes via patch version pattern
      • Other Configurations
  • ⏭️Upcoming Features and Enhancements
  • Release Notes
    • Release Notes
      • Release Notes - October 2024
      • Release Notes - November 2024
      • Release Notes - December 2024
      • Release Notes - January 2025
      • Release Notes - February 2025
      • Release Notes - March 2025
      • Release Notes - April 2025
  • 🔐API Documentation
    • 🏁Tracking Releases and Incidents with Hivel
    • Deployment API
    • Create Incident API
  • 🌟Insights and Best Practices
    • Developer's Guide to Hivel
    • 🎖️Best Practices for Software Development Efficiency
    • 🧹Jira Best Practices
    • Tips and tricks to improve performance
      • How to improve Speed
        • What to do if my Cycle Time is high?
        • What to do if my Coding Time is high?
        • What to do if my Review Time is high?
        • What to do if my Merge Time is high?
      • How to improve Quality
        • What to do if my Rework is high?
        • What happens if there are too many Flashy Reviews and how to prevent them?
        • How to address and prevent unreviewed PRs
        • Strategies to Reduce Mean Time to Restore (MTTR)
        • Best Practices for Team Ownership in Code Review
        • How to identify root cases of high change failure rates?
        • Building a feedback loop for continuous code improvement
      • How to improve planning and throughput
        • Leveraging data for more effective sprint planning
        • What metrics can I use to prevent developer burnout?
      • How to track, manage, and reduce technical debt?
      • What are the impacts of context switching on developer productivity and how to reduce it?
      • How to build a data-driven culture of Engineering?
      • How to balance speed and quality?
  • FAQs
    • Why can't I remove a user from a team?
    • How to change a team owner?
    • How do we account for weekends in the metrics?
    • Are draft PRs considered for calculation of coding/cycle time?
    • Why do some metrics like PRs reviewed or merged have more than 100%?
    • How to mark leaves & absences?
    • Where can I see average PR sizes?
    • How do I link Pull Requests to Issues
    • Why is count of PRs reviewed or merged is different across screens?
    • Why is data of some members are not visible?
    • Why is there an abnormal spike in Cycle Time?
    • Why some of the repositories are not imported or synced?
    • How to get a report of monthwise developer activity metrics?
    • How can I see the progress against my goals?
    • How to see all the metrics by sprints or releases?
    • Why are commits done today are not reflecting immediately
    • Why Product and Allocation's previous data is not reflecting?
    • Why cannot I see cycle time against developers even though they have commits?
    • Why do some Jira issues show as spillover in Hivel even though they were completed in Jira?
    • Why is pickup time not included in cycle time?
    • How can I add a template in dashboards for my org to follow?
    • Can I get a detailed report of all the activity done by developer per day?
    • How do I exclude a PR from rework/maintenance/new work calculation?
    • Why don't I see delivery accuracy for Kanban boards?
    • Why do I see "NA" in the percentage change of a metric?
    • Why do I see "No existing user found" message while login
    • Why am I not able to select more than 6 months at a time?
    • Why does the filters change when I move to dashboards but in other screen it remains same?
    • How to validate the data on Hivel?
    • How to measure impact of Copilots using Hivel?
    • Easing into Kanban: How to set your team up for success
Powered by GitBook
On this page
  • System Requirements
  • Required Credentials for Integration
  • Retrieving Your Organization ID and API Key
  • Configuring Credentials in Jenkins
  • Changes to pipeline script

Was this helpful?

  1. Integrations

Jenkins

Integrating Jenkins with Hivel allows you to gain data-driven insights into your development workflow. Follow these steps to set up the integration correctly.

System Requirements

Before proceeding, ensure the following: ✅ You have Admin access to Jenkins. (Preferably, a DevOps engineer should handle this)

Check if the below plugins are installed on Jenkins. If not, install them.

Plugin Name

Description

Link

Status

HTTP Request Plugin

Enables making HTTP requests within Jenkins pipelines.

Need to install

Timestamper Plugin

Adds timestamps to Jenkins build logs for better debugging.

Need to install

Pipeline (Workflow Aggregator)

Provides the essential pipeline functionality in Jenkins.

Mostly Already installed

Git Plugin

Enables Jenkins to fetch and manage source code from Git repositories.

Mostly Already installed

Credentials Binding Plugin

Allows securely storing and using credentials in Jenkins pipelines.

Mostly Already installed

Groovy Plugin

Allows running Groovy scripts within Jenkins.

Mostly Already installed

How to Install These Plugins:

  1. Go to Manage Jenkins → Manage Plugins → Available Plugins.

  2. Search for the plugins listed above and install them.

  3. Restart Jenkins after installation (if prompted).

Required Credentials for Integration

During the integration, you'll need:

  • Organization ID (Generated in the Hivel application)

  • API Key (Generated in the Hivel application)

Retrieving Your Organization ID and API Key

  1. Open the Hivel application and navigate to Integrations under the Settings.

  2. Locate the Jenkins Integration card and click Connect.

  3. Follow the given steps to start your integration.

  4. By clicking on generate your Organization ID and API Key will be generated.

  5. Use these fields while integrating with Jenkins. The steps for where to apply them are provided on the following page.

Configuring Credentials in Jenkins

  1. Log in to your Jenkins application.

  2. From the side navigation, select Manage Jenkins.

  3. Click on Credentials.

  4. Click on global under Stores scoped to Jenkins

  5. Choose Add Credentials - you will need to do this twice (once for the Organization ID and once for the API Key).

  6. From the dropdown, select Secret text.

  7. After selecting Secret text from the dropdown, fill in the details twice as follows:

    1. Adding the API Key

      1. ID: hivel-jenkins-api-key

      2. Secret: {your API key} (copied from Hivel)

      3. Description: This is the Jenkins API key from Hivel

      4. Click Save

    2. Repeat the process again for Adding the Organization ID

      1. ID: hivel-org-id

      2. Secret: {your Organization ID} (copied from Hivel)

      3. Description: This is the Jenkins Organization ID from Hivel

      4. Click Save

  8. Once you have completed the above steps, your Jenkins Global Credentials should display the following entries:

Changes to pipeline script

  1. Go to Dashboard

  2. Select any pipeline->Configure->Edit Pipeline

In the pipeline script, add the following:

environment {
    WEBHOOK_URL = 'https://app.hivel.ai/insightlyapi/webhook/jenkins'
    ORG_ID = credentials('hivel-org-id')        // Organization ID from Hivel
    API_KEY = credentials('hivel-jenkins-api-key')  // API Key from Hivel
}

And this to your pipeline initialization code:

stage('Initialize') {
    steps {
        script {
            // For build duration tracking
            env.BUILD_START_TIME = System.currentTimeMillis()
            
            // For stage metrics collection
            stageData = []
        }
    }
}

How to Wrap Your Stage Code for Metrics Collection

For each additional stage you add, ensure you wrap your existing commands with the following snippet. This wrapping captures the start time, end time, duration, and status of the stage:

def stageStart = System.currentTimeMillis()
try {
    // Your stage commands here.
    def stageEnd = System.currentTimeMillis()
    stageData.add([
        stage_name: "Your Stage Name",
        start_time: new Date(stageStart).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
        end_time:   new Date(stageEnd).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
        duration:   ((stageEnd - stageStart) / 1000) as int,
        status:     "SUCCESS"
    ])
} catch (Exception e) {
    def stageEnd = System.currentTimeMillis()
    stageData.add([
        stage_name: "Your Stage Name",
        start_time: new Date(stageStart).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
        end_time:   new Date(stageEnd).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
        duration:   ((stageEnd - stageStart) / 1000) as int,
        status:     "FAILED",
        error_message: e.getMessage()
    ])
    throw e
}
  • Insert your stage commands where indicated.

  • This snippet ensures that each stage’s metrics are captured and included in the final payload sent to Hivel.

API call from Jenkins

Add the below code after each stage:

post {
        always {
            script {
                // Capture overall build end time and calculate total build duration
                def buildEndTime = System.currentTimeMillis()
                def buildStartTime = env.BUILD_START_TIME.toLong()
                
                // Retrieve Git information from scmVarsData if available; fallback to shell commands if not.
                def branchName = scmVarsData?.GIT_BRANCH ?: sh(script: "git rev-parse --abbrev-ref HEAD", returnStdout: true).trim()
                def commitID   = scmVarsData?.GIT_COMMIT ?: sh(script: "git rev-parse HEAD", returnStdout: true).trim()
                
                // Construct the payload with build metrics and stage data for Hivel integration
                def payload = [
                    org_id      : env.ORG_ID.toInteger(),
                    job_name    : env.JOB_NAME,
                    build_number: env.BUILD_NUMBER.toInteger(),
                    status      : currentBuild.result ?: 'SUCCESS',
                    build_url   : env.BUILD_URL,
                    start_time  : new Date(buildStartTime).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
                    end_time    : new Date(buildEndTime).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
                    duration    : ((buildEndTime - buildStartTime) / 1000) as int,
                    git         : [
                        commit         : commitID,
                        branch         : branchName,
                        author         : sh(script: "git log -1 --pretty=format:'%an'", returnStdout: true).trim(),
                        author_email   : sh(script: "git log -1 --pretty=format:'%ae'", returnStdout: true).trim(),
                        commit_message : sh(script: "git log -1 --pretty=format:'%s'", returnStdout: true).trim(),
                        repository     : sh(script: "git config --get remote.origin.url", returnStdout: true).trim()
                    ],
                    triggered_by: sh(script: "git log -1 --pretty=format:'%ae'", returnStdout: true).trim(),
                    node        : env.NODE_NAME,
                    jenkins_version: sh(script: "jenkins --version || echo 'Unknown'", returnStdout: true).trim(),
                    stages      : stageData
                ]
                
                // Convert the payload to JSON format
                def payloadJson = groovy.json.JsonOutput.toJson(payload)
                echo "Payload: ${payloadJson}"
                
                // Send the payload to the Hivel endpoint using the httpRequest step
                httpRequest(
                    url: env.WEBHOOK_URL,
                    httpMode: 'POST',
                    contentType: 'APPLICATION_JSON',
                    customHeaders: [[name: 'X-API-Key', value: env.API_KEY]],
                    requestBody: payloadJson,
                    ignoreSslErrors: true
                )
            }
        }
    }
pipeline {
    agent any

    environment {
        // Hivel Integration configuration
        WEBHOOK_URL = 'https://app.hivel.ai/insightlyapi/webhook/jenkins'
        ORG_ID      = credentials('hivel-org-id')        // Your Hivel Organization ID
        API_KEY     = credentials('hivel-jenkins-api-key') // Your Hivel API Key
    }

    stages {
        // -------------------------------
        // Stage: Initialize
        // -------------------------------
        stage('Initialize') {
            steps {
                script {
                    // Capture overall build start time and initialize a list for stage metrics
                    env.BUILD_START_TIME = System.currentTimeMillis()
                    stageData = []
                }
            }
        }

        // -------------------------------
        // Stage: Checkout Code
        // -------------------------------
        stage('Checkout Code') {
            steps {
                script {
                    // Capture the start time for the Checkout stage
                    def stageStart = System.currentTimeMillis()
                    try {
                    
                        // Checkout the repository using Git; credentials and branch are specified here.
                        // The returned data (e.g., branch and commit information) is stored in 'scmVarsData'
                        scmVarsData = checkout([
                            $class: 'GitSCM',
                            branches: [[name: 'dev']],
                            userRemoteConfigs: [[
                                url: 'https://gitlab.com/my-org/hello-world.git', 
                                credentialsId: 'gitlab-token'
                            ]]
                        ])
                        
                        def stageEnd = System.currentTimeMillis()
                        // Record stage metrics as SUCCESS
                        stageData.add([
                            stage_name: "Checkout Code",
                            start_time: new Date(stageStart).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
                            end_time:   new Date(stageEnd).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
                            duration:   ((stageEnd - stageStart) / 1000) as int,
                            status:     "SUCCESS"
                        ])
                    } catch (Exception e) {
                        def stageEnd = System.currentTimeMillis()
                        // Record stage metrics as FAILED and capture the error message
                        stageData.add([
                            stage_name: "Checkout Code",
                            start_time: new Date(stageStart).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
                            end_time:   new Date(stageEnd).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
                            duration:   ((stageEnd - stageStart) / 1000) as int,
                            status:     "FAILED",
                            error_message: e.getMessage()
                        ])
                        // Rethrow the exception to mark the build as failed
                        throw e
                    }
                }
            }
        }

        // -------------------------------
        // Add additional stages below as required for your pipeline...
        // For example, you might add stages for building, testing, or deploying:
        // stage('Build') { ... }
        // stage('Test') { ... }
        // stage('Deploy') { ... }
    }

    post {
        always {
            script {
                // Capture overall build end time and calculate total build duration
                def buildEndTime = System.currentTimeMillis()
                def buildStartTime = env.BUILD_START_TIME.toLong()
                
                // Retrieve Git information from scmVarsData if available; fallback to shell commands if not.
                def branchName = scmVarsData?.GIT_BRANCH ?: sh(script: "git rev-parse --abbrev-ref HEAD", returnStdout: true).trim()
                def commitID   = scmVarsData?.GIT_COMMIT ?: sh(script: "git rev-parse HEAD", returnStdout: true).trim()
                
                // Construct the payload with build metrics and stage data for Hivel integration
                def payload = [
                    org_id      : env.ORG_ID.toInteger(),
                    job_name    : env.JOB_NAME,
                    build_number: env.BUILD_NUMBER.toInteger(),
                    status      : currentBuild.result ?: 'SUCCESS',
                    build_url   : env.BUILD_URL,
                    start_time  : new Date(buildStartTime).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
                    end_time    : new Date(buildEndTime).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")),
                    duration    : ((buildEndTime - buildStartTime) / 1000) as int,
                    git         : [
                        commit         : commitID,
                        branch         : branchName,
                        author         : sh(script: "git log -1 --pretty=format:'%an'", returnStdout: true).trim(),
                        author_email   : sh(script: "git log -1 --pretty=format:'%ae'", returnStdout: true).trim(),
                        commit_message : sh(script: "git log -1 --pretty=format:'%s'", returnStdout: true).trim(),
                        repository     : sh(script: "git config --get remote.origin.url", returnStdout: true).trim()
                    ],
                    triggered_by: sh(script: "git log -1 --pretty=format:'%ae'", returnStdout: true).trim(),
                    node        : env.NODE_NAME,
                    jenkins_version: sh(script: "jenkins --version || echo 'Unknown'", returnStdout: true).trim(),
                    stages      : stageData
                ]
                
                // Convert the payload to JSON format
                def payloadJson = groovy.json.JsonOutput.toJson(payload)
                echo "Payload: ${payloadJson}"
                
                // Send the payload to the Hivel endpoint using the httpRequest step
                httpRequest(
                    url: env.WEBHOOK_URL,
                    httpMode: 'POST',
                    contentType: 'APPLICATION_JSON',
                    customHeaders: [[name: 'X-API-Key', value: env.API_KEY]],
                    requestBody: payloadJson,
                    ignoreSslErrors: true
                )
            }
        }
    }
}

  • Once the changes are done, click on Apply -> Save.

  • Repeat the steps for each stage of your pipeline script. Please check the indentation while wrapping the code.

  • Run the build once changes are made to all the stages.

These are the details we will be receiving from Jenkins upon successful integration:

Base URL: https://app.hivel.ai/insightlyapi/webhook/jenkins
Method: POST
Headers:
    Content-Type: application/json
    X-API-Key: [API key from credentials]
curl --location \
--request POST 'https://app.hivel.ai/insightlyapi/webhook/jenkins' \
--header 'Content-Type: application/json' \
--header 'X-API-Key: YOUR_API_KEY' \
--data-raw '{
    "org_id": 123,
    "job_name": "pipeline-job-name",
    "build_number": 45,
    "status": "SUCCESS",
    "build_url": "http://jenkins-url/job/pipeline-job-name/45",
    "start_time": "2024-02-06T10:00:00Z",
    "end_time": "2024-02-06T10:15:00Z",
    "duration": 900,
    "git": {
        "commit": "abc123def456",
        "branch": "dev",
        "author": "John Doe",
        "author_email": "john@example.com",
        "commit_message": "Feature update",
        "repository": "https://gitlab.com/myorganization/hello-world.git"
    },
    "triggered_by": "john@example.com",
    "node": "jenkins-node-1",
    "jenkins_version": "2.426.1",
    "stages": [
        {
            "stage_name": "Stage 1",
            "start_time": "2024-02-06T10:00:00Z",
            "end_time": "2024-02-06T10:05:00Z",
            "duration": 300,
            "status": "SUCCESS"
        },
        "...",
        {
            "stage_name": "Stage N",
            "start_time": "2024-02-06T10:10:00Z",
            "end_time": "2024-02-06T10:15:00Z",
            "duration": 300,
            "status": "SUCCESS"
        }
    ]
}'

Payload Fields Explanation

  • org_id: Organization identifier (Integer)

  • job_name: Name of the Jenkins job

  • build_number: Jenkins build number

  • status: Build status (e.g., "SUCCESS", "FAILED")

  • build_url: URL to access build details

  • start_time: Timestamp when the build started

  • end_time: Timestamp when the build completed

  • duration: Build duration in seconds

  • git: Git metadata object

    • commit: Latest commit hash

    • branch: Git branch name

    • author: Commit author name

    • author_email: Commit author email

    • commit_message: Commit message

    • repository: Git repository URL

  • triggered_by: Email of build trigger user

  • node: Jenkins node name

  • jenkins_version: Jenkins server version

  • stages: Array of stage objects

    • stage_name: Name of pipeline stage

    • start_time: Stage start timestamp

    • end_time: Stage end timestamp

    • duration: Stage duration in seconds

    • status: Stage status

    • error_message: Optional error description

The integration is considered complete once the build is run, successfully processed, and the integration card updates to "Connected".

PreviousOktaNextJenkins Freestyle Integration with Ansible and Hivel Webhook

Last updated 3 months ago

Was this helpful?

If you find it difficult, don’t worry! You can always reach out to us for assistance at .

Once the code wrapping is done, your code will look similar to the sample script in the .

If you need any support at any point, please feel free to reach out to us at . We’re happy to assist you!

🔗
support@hivel.ai
support@hivel.ai
next tab
HTTP Request | Jenkins plugin
Timestamper | Jenkins plugin
Pipeline | Jenkins plugin
Git | Jenkins plugin
Credentials Binding | Jenkins plugin
Groovy | Jenkins plugin