{"id":13602671,"url":"https://github.com/HariSekhon/Jenkins","last_synced_at":"2025-04-11T09:30:46.887Z","repository":{"id":37456174,"uuid":"448843108","full_name":"HariSekhon/Jenkins","owner":"HariSekhon","description":"Jenkins CI/CD - Advanced Jenkinsfile \u0026 Groovy Shared Library of reusable functions and pipelines - AWS, GCP, Docker, Kubernetes, ArgoCD, Slack notifications, Git Merge, Terraform, Cloudflare, Jenkins Job Backups, most major Docker registries, DockerHub, GHCR, ECR, GCR, GAR, ACR, GitLab, Quay","archived":false,"fork":false,"pushed_at":"2024-10-11T22:49:31.000Z","size":1005,"stargazers_count":65,"open_issues_count":0,"forks_count":42,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-10-30T23:51:42.671Z","etag":null,"topics":["argocd","aws","ci","ci-cd","ci-cd-pipeline","cicd","cloudflare","devops","docker","gcp","gi","gitops","groovy","hacktoberfest","jenkins","jenkins-ci","jenkinsfile","kubernetes","library","terraform"],"latest_commit_sha":null,"homepage":"https://www.linkedin.com/in/HariSekhon","language":"Groovy","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HariSekhon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-01-17T10:12:13.000Z","updated_at":"2024-10-23T07:26:11.000Z","dependencies_parsed_at":"2023-01-19T12:18:44.052Z","dependency_job_id":"7176a4f4-bdf8-49eb-bf7b-86de34659d52","html_url":"https://github.com/HariSekhon/Jenkins","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HariSekhon%2FJenkins","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HariSekhon%2FJenkins/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HariSekhon%2FJenkins/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HariSekhon%2FJenkins/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HariSekhon","download_url":"https://codeload.github.com/HariSekhon/Jenkins/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223431048,"owners_count":17143789,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["argocd","aws","ci","ci-cd","ci-cd-pipeline","cicd","cloudflare","devops","docker","gcp","gi","gitops","groovy","hacktoberfest","jenkins","jenkins-ci","jenkinsfile","kubernetes","library","terraform"],"created_at":"2024-08-01T18:01:33.416Z","updated_at":"2025-04-11T09:30:46.879Z","avatar_url":"https://github.com/HariSekhon.png","language":"Groovy","funding_links":[],"categories":["aws","Groovy"],"sub_categories":[],"readme":"# Jenkins - Advanced Jenkinsfile \u0026 Groovy Shared Library\n\n[![GitHub stars](https://img.shields.io/github/stars/HariSekhon/Jenkins?logo=github)](https://github.com/HariSekhon/Jenkins/stargazers)\n[![GitHub forks](https://img.shields.io/github/forks/HariSekhon/Jenkins?logo=github)](https://github.com/HariSekhon/Jenkins/network)\n[![LineCount](https://sloc.xyz/github/HariSekhon/Jenkins/?badge-bg-color=2081C2)](https://github.com/boyter/scc/)\n[![Cocomo](https://sloc.xyz/github/HariSekhon/Jenkins/?badge-bg-color=2081C2\u0026category=cocomo)](https://github.com/boyter/scc/)\n[![License](https://img.shields.io/github/license/HariSekhon/Jenkins)](https://github.com/HariSekhon/Jenkins/blob/master/LICENSE)\n[![My LinkedIn](https://img.shields.io/badge/LinkedIn%20Profile-HariSekhon-blue?logo=data:image/svg%2bxml;base64,PHN2ZyByb2xlPSJpbWciIGZpbGw9IiNmZmZmZmYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+TGlua2VkSW48L3RpdGxlPjxwYXRoIGQ9Ik0yMC40NDcgMjAuNDUyaC0zLjU1NHYtNS41NjljMC0xLjMyOC0uMDI3LTMuMDM3LTEuODUyLTMuMDM3LTEuODUzIDAtMi4xMzYgMS40NDUtMi4xMzYgMi45Mzl2NS42NjdIOS4zNTFWOWgzLjQxNHYxLjU2MWguMDQ2Yy40NzctLjkgMS42MzctMS44NSAzLjM3LTEuODUgMy42MDEgMCA0LjI2NyAyLjM3IDQuMjY3IDUuNDU1djYuMjg2ek01LjMzNyA3LjQzM2MtMS4xNDQgMC0yLjA2My0uOTI2LTIuMDYzLTIuMDY1IDAtMS4xMzguOTItMi4wNjMgMi4wNjMtMi4wNjMgMS4xNCAwIDIuMDY0LjkyNSAyLjA2NCAyLjA2MyAwIDEuMTM5LS45MjUgMi4wNjUtMi4wNjQgMi4wNjV6bTEuNzgyIDEzLjAxOUgzLjU1NVY5aDMuNTY0djExLjQ1MnpNMjIuMjI1IDBIMS43NzFDLjc5MiAwIDAgLjc3NCAwIDEuNzI5djIwLjU0MkMwIDIzLjIyNy43OTIgMjQgMS43NzEgMjRoMjAuNDUxQzIzLjIgMjQgMjQgMjMuMjI3IDI0IDIyLjI3MVYxLjcyOUMyNCAuNzc0IDIzLjIgMCAyMi4yMjIgMGguMDAzeiIvPjwvc3ZnPgo=)](https://www.linkedin.com/in/HariSekhon/)\n[![GitHub Last Commit](https://img.shields.io/github/last-commit/HariSekhon/Jenkins?logo=github)](https://github.com/HariSekhon/Jenkins/commits/master)\n\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/48126b1db0ed4471a9888012b1ccab73)](https://app.codacy.com/gh/HariSekhon/Jenkins/dashboard)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=HariSekhon_Jenkins\u0026metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=HariSekhon_Jenkins)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=HariSekhon_Jenkins\u0026metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=HariSekhon_Jenkins)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=HariSekhon_Jenkins\u0026metric=security_rating)](https://sonarcloud.io/summary/new_code?id=HariSekhon_Jenkins)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=HariSekhon_Jenkins\u0026metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=HariSekhon_Jenkins)\n\n[![CI Builds Overview](https://img.shields.io/badge/CI%20Builds-Overview%20Page-blue?logo=circleci)](https://harisekhon.github.io/CI-CD/)\n[![Repo on GitHub](https://img.shields.io/badge/repo-GitHub-2088FF?logo=github)](https://github.com/HariSekhon/Jenkins)\n[![Repo on GitLab](https://img.shields.io/badge/repo-GitLab-FCA121?logo=gitlab)](https://gitlab.com/HariSekhon/Jenkins)\n[![Repo on Azure DevOps](https://img.shields.io/badge/repo-Azure%20DevOps-0078D7?logo=azure%20devops)](https://dev.azure.com/harisekhon/GitHub/_git/Jenkins)\n[![Repo on BitBucket](https://img.shields.io/badge/repo-BitBucket-0052CC?logo=bitbucket)](https://bitbucket.org/HariSekhon/Jenkins)\n\n[![Jenkinsfile](https://github.com/HariSekhon/Jenkins/actions/workflows/jenkinsfile.yaml/badge.svg)](https://github.com/HariSekhon/Jenkins/actions/workflows/jenkinsfile.yaml)\n[![Groovy](https://github.com/HariSekhon/Jenkins/actions/workflows/groovyc.yaml/badge.svg)](https://github.com/HariSekhon/Jenkins/actions/workflows/groovyc.yaml)\n[![YAML](https://github.com/HariSekhon/Jenkins/actions/workflows/yaml.yaml/badge.svg)](https://github.com/HariSekhon/Jenkins/actions/workflows/yaml.yaml)\n[![Markdown](https://github.com/HariSekhon/Jenkins/actions/workflows/markdown.yaml/badge.svg)](https://github.com/HariSekhon/Jenkins/actions/workflows/markdown.yaml)\n[![Validation](https://github.com/HariSekhon/Jenkins/actions/workflows/validate.yaml/badge.svg)](https://github.com/HariSekhon/Jenkins/actions/workflows/validate.yaml)\n[![Grype](https://github.com/HariSekhon/Jenkins/actions/workflows/grype.yaml/badge.svg)](https://github.com/HariSekhon/Jenkins/actions/workflows/grype.yaml)\n[![Kics](https://github.com/HariSekhon/Jenkins/actions/workflows/kics.yaml/badge.svg)](https://github.com/HariSekhon/Jenkins/actions/workflows/kics.yaml)\n[![Semgrep](https://github.com/HariSekhon/Jenkins/actions/workflows/semgrep.yaml/badge.svg)](https://github.com/HariSekhon/Jenkins/actions/workflows/semgrep.yaml)\n[![Semgrep Cloud](https://github.com/HariSekhon/Jenkins/actions/workflows/semgrep-cloud.yaml/badge.svg)](https://github.com/HariSekhon/Jenkins/actions/workflows/semgrep-cloud.yaml)\n[![SonarCloud](https://github.com/HariSekhon/Jenkins/actions/workflows/sonarcloud.yaml/badge.svg)](https://github.com/HariSekhon/Jenkins/actions/workflows/sonarcloud.yaml)\n[![Trivy](https://github.com/HariSekhon/Jenkins/actions/workflows/trivy.yaml/badge.svg)](https://github.com/HariSekhon/Jenkins/actions/workflows/trivy.yaml)\n\nAdvanced Jenkinsfile \u0026 Jenkins Shared Library.\n\n- [Jenkinsfile](https://github.com/HariSekhon/Jenkins/blob/master/Jenkinsfile) - epic Jenkinsfile template - full of real-world tricks from Production\n- [vars/](https://github.com/HariSekhon/Jenkins/tree/master/vars) - Groovy Shared Library reusable functions - used in Production for years\n\nAdditional Jenkins scripts are available in my [HariSekhon/DevOps-Bash-tools](https://github.com/HariSekhon/DevOps-Bash-tools) repo for Jenkins Rest API and Jenkins Groovy scripts for the Admin Script Console, and Jenkins-on-Kubernetes in my [HariSekhon/Kubernetes-configs](https://github.com/HariSekhon/Kubernetes-configs) repo.\n\n## Useful Notes\n\n[HariSekhon/Knowledge-Base - Jenkins](https://github.com/HariSekhon/Knowledge-Base/blob/main/jenkins.md)\n\n[HariSekhon/Knowledge-Base - Jenkins-on-Kubernetes](https://github.com/HariSekhon/Knowledge-Base/blob/main/jenkins-on-kubernetes.md)\n\n## QuickStart\n\nJenkinsfile:\n\n```groovy\n// load this library straight from github - the '_' at the end imports all functions\n@Library('github.com/harisekhon/jenkins@master') _\n\npipeline {\n  stages {\n\n    stage('Simple Example'){\n      steps {\n        // call any function from this libary by its filename under vars/... without the .groovy extension\n        //\n        // see each var/\u003cfunction\u003e.groovy file for any arguments\n        //\n        // calls vars/printEnv.groovy\n        printEnv()\n\n        // run logins for anything you have environment variable secrets/tokens for,\n        // including AWS, GCP, DockerHub, GHCR, ECR, GCR, GAR, ACR, GitLab, Quay\n        // see examples of individual service login functions in the next Stage\n        login()\n\n        // show all the cloud systems you're logged in to and who you're logged in as\n        printAuth()\n\n        // uses whichever package manager is available - portable, used by other functions too\n        installPackages(['curl', 'unzip'])\n\n        // launch a GCP Cloud Build job, by default against your cloudbuild.yaml if no args given\n        gcpCloudBuild()\n\n        // download tools to $HOME/bin\n        downloadTerraform('1.2.3')\n        downloadJenkinsCLI()\n\n        // prompts for human click approval before proceeding to next step ie. production deployment\n        approval()\n\n        // GitOps update docker image version for app1 \u0026 app2 in Kubernetes Kustomize\n        gitKustomizeImage(['myrepo/app1', 'myrepo/app2'])\n\n        // trigger ArgoCD deployment to Kubernetes for app 'my-app'\n        argoDeploy('my-app')\n\n        // see groovy files under vars/ for more documentation, details and many more useful functions\n      }\n    }\n  }\n\n  // send notifications on broken builds and recoveries\n  post {\n    failure {\n      // finds Git committers who broke build,\n      // resolves their Slack user IDs and\n      // actively notifies them with @user1 @user2 tags\n      slackNotify()\n    }\n    fixed {\n      // calls one or more notify functions to send Slack messages, emails etc.\n      // such as slackNotify()\n      // Uppercase N because lowercase clashes with java keyword\n      // Use Notify() instead of multiple calls to different notify functions\n      Notify()\n    }\n  }\n}\n```\n\nsome slightly more advanced functions:\n\n```groovy\n@Library('github.com/harisekhon/jenkins@master') _\n\npipeline {\n  stages {\n    stage('Advanced Example'){\n      steps {\n        // run individual login functions instead of login()\n\n        // log in to GCP cloud with a service account key\n        gcpActivateServiceAccount()\n        // set up GOOGLE_APPLICATION_CREDENTIALS keyfile for 3rd party apps like Terraform\n        gcpSetupApplicationCredentials()\n\n        // log in to DockerHub\n        dockerLogin()\n\n        // log in to AWS Elastic Container Registry\n        dockerLoginECR()\n\n        // log in to Google Container Registry\n        dockerLoginGCR()\n\n        // flexible custom targeted binary downloads instead of convenience functions like downloadTerraform(), downloadJenkinsCLI():\n        //\n        // download, extract and install a specific version of a binary to /usr/local/bin if root or $HOME/bin if run as a user\n        // here ${version} is a variable previously defined, while {os} and {arch} with no dollar sign are auto-inferred placeholders\n        installBinary(url: \"https://releases.hashicorp.com/terraform/${version}/terraform_${version}_{os}_{arch}.zip\", binary: 'terraform')\n        installBinary(url: \"$JENKINS_URL/jnlpJars/jenkins-cli.jar\")\n\n        // run a script with locks to prevent another script or deployment happening at same time\n        // newer runs will wait to acquire the locks, older pending runs will be skipped\n        // third arg is optional to time out this script after 30 minutes\n        scriptLockExecute('/path/to/script.sh', ['deployment lock', 'script lock'], 30)\n\n        // GitOps update docker image version for app1 \u0026 app2 in Kubernetes Kustomize, images served from GCR registry\n        gitKustomizeImage([\"$GCR_REGISTRY/$GCR_PROJECT/app1\", \"$GCR_REGISTRY/$GCR_PROJECT/app2\"])\n\n        // parallelizes deployments by triggering syncs before deployment wait\n        // if you want to save an extra 30 secs, use 2 parallel stages for these 2 syncs\n        argoSync('app1')\n        argoSync('app2')\n\n        // waits on each app being fully deployed and passing healthchecks\n        argoDeploy('app1')\n        argoDeploy('app2')\n      }\n    }\n  }\n}\n```\n\n## Ready Made Pipeline Templates\n\n### GCP CloudBuild and Deploy Docker Images to Kubernetes via ArgoCD\n\nBuilds Docker images and deploys them to [Kubernetes](https://github.com/HariSekhon/Kubernetes-configs) via [ArgoCD](https://github.com/HariSekhon/Kubernetes-configs/tree/master/argocd/base). Optionally scans the repo code, built container images, and purges Cloudflare Cache.\n\n```groovy\n@Library('github.com/harisekhon/jenkins@master') _\n\ngcpDeployKubernetesPipeline(\n  project: 'my-gcp-project',\n  region: 'europe-west2',\n  app: 'my-app',\n  env: 'uk-production',\n  images: [\n    \"my-app-webapp\",\n    \"my-app-sidecar\",\n  ],\n  gcr_registry: 'eu.gcr.io',\n  gcp_serviceaccount_key: 'jenkins-gcp-serviceaccount-key',  // Jenkins credential id\n  cloudflare_email: 'my-cicd-account@domain.co.uk',       // optional, triggers Cloudflare Cache Purge\n  cloudflare_zone_id: '12a34b5c6d7ef8a901b2c3def45ab6c7', // if both these are set and Jenkins 'cloudflare-api-key' credential is available\n)\n```\n\n![](https://github.com/HariSekhon/Diagrams-as-Code/blob/master/screenshots/gcp_cloudbuild_deployed_after_container_scans_failed.png)\n\nSee [gcpDeployKubernetesPipeline.groovy](https://github.com/HariSekhon/Jenkins/blob/master/vars/gcpDeployKubernetesPipeline.groovy) for more details, options etc.\n\nSee [Jenkins on Kubernetes Diagram](#jenkins-on-kubernetes-diagram) further down.\n\n### Terraform CI/CD\n\nHandles all logins, Terraform fmt, validate, plan, approval, apply etc.\n\nNon-apply branches do Plan only so you can see if you want to merge.\n\nOn the apply branch, eg. `master` or `main`, only prompts for approval is there are actual changes in the Terraform plan output.\n\nSaves the Terraform plan output and an approval will only apply that exact plan for safety.\n\n```groovy\n@Library('github.com/harisekhon/jenkins@master') _\n\nterraformPipeline(version: '1.1.7',\n                  dir: 'deployments/dev',\n                  apply_branch_pattern: 'master',\n                  creds: [\n                    string(credentialsId: 'jenkins-gcp-serviceaccount-key', variable: 'GCP_SERVICEACCOUNT_KEY')\n                  ],\n                  container: 'gcloud-sdk',\n                  yamlFile: 'ci/kubernetes-agent-pod.yaml')\n```\n\nApplied, ignoring informational fmt check:\n\n![](https://github.com/HariSekhon/Diagrams-as-Code/blob/master/screenshots/terraform_applied_but_failed_fmt_check.png)\n\nPlan found no changes so skipped Apply or asking for Approval:\n\n![](https://github.com/HariSekhon/Diagrams-as-Code/blob/master/screenshots/terraform_plan_no_changes.png)\n\nPlan found changes but Approval was not authorized, so Apply did not proceed:\n\n![](https://github.com/HariSekhon/Diagrams-as-Code/blob/master/screenshots/terraform_not_approved.png)\n\n\u003chttps://github.com/HariSekhon/Terraform\u003e\n\n### Git Merges \u0026 Backports\n\nAutomatically merge one branch into another upon any change eg. backport between environment branches such as any hotfixes in Staging to Dev:\n\n```groovy\n@Library('github.com/harisekhon/jenkins@master') _\n\n// git merge from staging branch into dev branch\ngitMergePipeline('staging', 'dev')\n```\n\n### Git Update Jenkinsfile Library Tag\n\nEnumerates all Jenkins Jobs and Git Tags and Branches to give user a pop-up with parameter choices about which Pipeline's Jenkinsfile to update its `@Library` tag for, and optionally build that pipeline afterwards.\n\n```groovy\n@Library('jenkins@master') _\n\njenkinsfileLibraryUpdatePipeline(\n    env: [\n      \"JENKINS_USER_ID=hari@domain.co.uk\",\n      \"JENKINS_CLI_ARGS=-webSocket\"\n    ],\n    creds: [string(credentialsId: 'job-config-backups', variable: 'JENKINS_API_TOKEN')],\n    container: 'gcloud-sdk',\n    yamlFile: 'ci/kubernetes-agent-pod.yaml'\n)\n```\n\n![](https://github.com/HariSekhon/Diagrams-as-Code/blob/master/screenshots/jenkinsfile_update_library_tag_update_jenkinsfile.png)\n\n### Jenkins Job Configuration Backups\n\nDownload and commit all Jenkins job configurations to the calling Git repo every 3 hours (configurable via optional `cron: '...'` parameter)\n\n```groovy\n@Library('github.com/harisekhon/jenkins@master') _\n\njenkinsBackupJobConfigsPipeline(\n  dir: 'jobs',  // directory in current repo to download and git commit to\n  env: [\n    \"JENKINS_USER_ID=hari@mydomain.co.uk\",\n    \"JENKINS_CLI_ARGS=-webSocket\"   // -webSocket gets through reverse proxies like Kubernetes Ingress\n  ],\n  creds: [\n    string(credentialsId: 'jenkins-api-token', variable: 'JENKINS_API_TOKEN')\n  ],\n  container: 'gcloud-sdk',\n  yamlFile: 'ci/kubernetes-agent-pod.yaml')\n)\n```\n\n![](https://github.com/HariSekhon/Diagrams-as-Code/blob/master/screenshots/jenkins_job_config_backups.png)\n\n## More Documentation\n\nRead the comments at the top of each library function under [vars/](https://github.com/HariSekhon/Jenkins/tree/master/vars)`\u003cfunction\u003e.groovy` for more details.\n\nIf you want to prevent changes to this library re-triggering the last run of your pipelines, configure it as a a Shared Library in your global Jenkins configuration and untick \"Include @Library changes in job recent changes\".\n\nSee this [Jenkins Documentation](https://www.jenkins.io/doc/book/pipeline/shared-libraries/#using-libraries) for more details.\n\n## Jenkins on Kubernetes Diagram\n\n![](https://raw.githubusercontent.com/HariSekhon/Diagrams-as-Code/master/images/jenkins_kubernetes_cicd.svg)\n\nFor more excellent diagrams like this, see my Diagrams-as-Code repo:\n\n\u003chttps://github.com/HariSekhon/Diagrams-as-Code\u003e\n\n## Production\n\n### Option 1 - Hashref\n\nImport the library as shown above directly from this repo, replacing `@master` with `@\u003chashref\u003e` to fix to an immutable version (tags are not immutable). This is a GitHub security best practice for CI/CD as seen in this [doc](https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-third-party-actions).\n\n### Option 2 - Public Fork (fully automated)\n\nFork this repo for more control and visibility over all updates.\n\nEnable the [fork-sync](https://github.com/HariSekhon/Jenkins/blob/master/.github/workflows/fork-sync.yaml) github actions workflow in your fork to keep the master branch sync'd every few hours.\n\nYou can then create tags or environment branches to stage updates across dev/staging/production.\n\nIf using environment branches, enable the [fork-update-pr](https://github.com/HariSekhon/Jenkins/blob/master/.github/workflows/fork-update-pr.yaml) github actions workflow to automatically raise GitHub Pull Requests for your environment branches to audit, authorize \u0026 control updates.\n\n### Option 3 - Private Copy (semi-automated)\n\nDownload the functions you want into your private jenkins shared library repo.\n\nYou can use the [vars/download.sh](https://github.com/HariSekhon/Jenkins/blob/master/vars/download.sh) script to help you download given `*.groovy` files and periodically run it to get updates to these previously downloaded functions.\n\nYou will be responsible for committing and reconciling any divergences in your local copies.\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=HariSekhon/Jenkins\u0026type=Date)](https://star-history.com/#HariSekhon/Jenkins\u0026Date)\n\n## More Core Repos\n\n\u003c!-- OTHER_REPOS_START --\u003e\n\n### Knowledge\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Knowledge-Base\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Knowledge-Base)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Diagrams-as-Code\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Diagrams-as-Code)\n\n\u003c!--\n\nNot support on GitHub Markdown:\n\n\u003ciframe src=\"https://raw.githubusercontent.com/HariSekhon/HariSekhon/main/knowledge.md\" width=\"100%\" height=\"500px\"\u003e\u003c/iframe\u003e\n\nDoes nothing:\n\n\u003cembed src=\"https://raw.githubusercontent.com/HariSekhon/HariSekhon/main/knowledge.md\" width=\"100%\" height=\"500px\" /\u003e\n\n--\u003e\n\n### DevOps Code\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=DevOps-Bash-tools\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/DevOps-Bash-tools)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=DevOps-Python-tools\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/DevOps-Python-tools)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=DevOps-Perl-tools\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/DevOps-Perl-tools)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=DevOps-Golang-tools\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/DevOps-Golang-tools)\n\n\u003c!--\n[![Gist Card](https://github-readme-stats.vercel.app/api/gist?id=f8f551332440f1ca8897ff010e363e03)](https://gist.github.com/HariSekhon/f8f551332440f1ca8897ff010e363e03)\n--\u003e\n\n### Containerization\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Kubernetes-configs\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Kubernetes-configs)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Dockerfiles\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Dockerfiles)\n\n### CI/CD\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=GitHub-Actions\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/GitHub-Actions)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Jenkins\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Jenkins)\n\n### DBA - SQL\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=SQL-scripts\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/SQL-scripts)\n\n### DevOps Reloaded\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Nagios-Plugins\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Nagios-Plugins)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=HAProxy-configs\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/HAProxy-configs)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Terraform\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Terraform)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Packer-templates\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Packer-templates)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Nagios-Plugin-Kafka\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Nagios-Plugin-Kafka)\n\n### Templates\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Templates\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Templates)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Template-repo\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Template-repo)\n\n### Misc\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Spotify-tools\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Spotify-tools)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Spotify-playlists\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Spotify-playlists)\n\nThe rest of my original source repos are\n[here](https://github.com/HariSekhon?tab=repositories\u0026q=\u0026type=source\u0026language=\u0026sort=stargazers).\n\nPre-built Docker images are available on my [DockerHub](https://hub.docker.com/u/harisekhon/).\n\n\u003c!-- 1x1 pixel counter to record hits --\u003e\n![](https://hit.yhype.me/github/profile?user_id=2211051)\n\n\u003c!-- OTHER_REPOS_END --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FHariSekhon%2FJenkins","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FHariSekhon%2FJenkins","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FHariSekhon%2FJenkins/lists"}