{"id":50939375,"url":"https://github.com/webhookrelay/jenkins-webhook-tunnel-plugin","last_synced_at":"2026-06-17T12:03:50.252Z","repository":{"id":364851169,"uuid":"1198874087","full_name":"webhookrelay/jenkins-webhook-tunnel-plugin","owner":"webhookrelay","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-14T18:41:53.000Z","size":1830,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T20:20:49.589Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","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/webhookrelay.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-01T20:59:38.000Z","updated_at":"2026-06-14T18:41:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/webhookrelay/jenkins-webhook-tunnel-plugin","commit_stats":null,"previous_names":["webhookrelay/jenkins-webhook-tunnel-plugin"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/webhookrelay/jenkins-webhook-tunnel-plugin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookrelay%2Fjenkins-webhook-tunnel-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookrelay%2Fjenkins-webhook-tunnel-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookrelay%2Fjenkins-webhook-tunnel-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookrelay%2Fjenkins-webhook-tunnel-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/webhookrelay","download_url":"https://codeload.github.com/webhookrelay/jenkins-webhook-tunnel-plugin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookrelay%2Fjenkins-webhook-tunnel-plugin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34447295,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2026-06-17T12:03:49.462Z","updated_at":"2026-06-17T12:03:50.244Z","avatar_url":"https://github.com/webhookrelay.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Webhook Relay Plugin for Jenkins\n\nReceive GitHub, GitLab, and Bitbucket webhooks in Jenkins **without exposing Jenkins to\nthe public internet**. The [plugin](https://webhookrelay.com/docs/tutorials/cicd/jenkins-plugin/) opens an outbound connection to a\n[Webhook Relay](https://webhookrelay.com) **bucket** and forwards every webhook it receives\nto the matching Jenkins endpoint (`/github-webhook/`, `/bitbucket-hook/`, …), so your SCM\ncan trigger builds even when Jenkins lives on a private network, behind a firewall, or on\nyour laptop.\n\nBecause delivery goes through a Webhook Relay **bucket** (the forwarding feature — not a\ntunnel), every request is recorded on the bucket's logs page, giving you a full\nrequest/response history for debugging.\n\n```\nGitHub / GitLab / Bitbucket\n        │  (webhook)\n        ▼\nhttps://\u003cyour-bucket\u003e.hooks.webhookrelay.com      ← public URL you paste into the SCM (GitHub, GitLab, Bitbucket)\n        │\n        ▼\n   Webhook Relay bucket  ──────────────►  logs page (every request + Jenkins response)\n        │  (outbound WebSocket, started by the plugin)\n        ▼\n   Jenkins  →  /github-webhook/  →  build triggered\n```\n\n## How it works\n\n1. The plugin authenticates to Webhook Relay with your API token and **subscribes** to a\n   bucket over a persistent outbound WebSocket (`wss://my.webhookrelay.com/v1/socket`). No\n   inbound ports are opened on Jenkins.\n2. When a webhook hits the bucket's public input URL, Webhook Relay streams it down the\n   socket to the plugin.\n3. The plugin replays the request against the Jenkins webhook endpoint for your SCM\n   (selected via the **SCM Webhook Preset**) and sends Jenkins' response (status, headers,\n   body) back to the bucket log.\n\n## Configuration\n\nYou will need a free [Webhook Relay](https://webhookrelay.com) account and an API token\n([create one here](https://my.webhookrelay.com/tokens)).\n\n1. Go to **Manage Jenkins → System** and scroll to the **Webhook Relay** section.\n2. Enter your **API Key** and **API Secret** ([get them here](https://my.webhookrelay.com/tokens)).\n3. Enter a **Bucket name** (e.g. `jenkins-plugin`). It can be an existing bucket or a new\n   name — the plugin creates it for you.\n4. Choose your **SCM Webhook Preset** (GitHub, GitLab, Bitbucket, or Generic Webhook Trigger).\n5. Tick **Enable** and click **Save**.\n\n![Configure the Webhook Relay plugin](docs/images/03-config-subscribed.png)\n\nWhen connected, the **Connection Status** shows **✔ Subscribed**. Use **Test Connection**\nto verify your credentials without saving.\n\n### Get your webhook URL\n\nClick **Get Webhook URL** to resolve the bucket's public input URL (creating the bucket if\nneeded). A dialog shows the URL with a copy button and a link to the bucket — paste the URL\ninto your repository's webhook settings.\n\n![The Get Webhook URL dialog](docs/images/06-webhook-url-dialog.png)\n\n| SCM | Where to paste the URL | Webhook content type |\n|---|---|---|\n| GitHub | *Settings → Webhooks → Add webhook → Payload URL* | `application/json` |\n| GitLab | *Settings → Webhooks → URL* | — |\n| Bitbucket | *Repository settings → Webhooks → Add webhook → URL* | — |\n\nThat's it — you don't change anything else in the SCM. Webhook Relay receives the webhook\non the public URL and the plugin forwards it to the right Jenkins endpoint.\n\n## Triggering builds\n\nThe plugin only delivers the webhook to Jenkins — your job decides what to do with it,\nexactly as it would if Jenkins were reachable from the internet. There is **no special\nWebhook Relay configuration on the job**; you use the normal SCM trigger.\n\nFor a **GitHub** job (Freestyle or Pipeline):\n\n1. Create a job: **New Item → Freestyle project** (or **Pipeline**).\n2. Under **Source Code Management**, choose **Git** and set the **Repository URL** to your\n   repo (add credentials if it is private):\n\n   ![Job Source Code Management — Git repository](docs/images/07-job-scm.png)\n\n3. Under **Triggers**, tick **GitHub hook trigger for GITScm polling**, then **Save**:\n\n   ![Job Triggers — GitHub hook trigger for GITScm polling](docs/images/08-job-trigger.png)\n\nIn a declarative **Pipeline** the equivalent of step 3 is a `triggers { githubPush() }` block\nin the `Jenkinsfile` (see [`demo/Jenkinsfile`](demo/Jenkinsfile)).\n\nFor other providers, tick the matching trigger in the same **Triggers** section:\n\n- **GitLab** — *Build when a change is pushed to GitLab* (GitLab plugin).\n- **Bitbucket** — the Bitbucket push trigger (Bitbucket plugin).\n- **Anything else** — **Generic Webhook Trigger** (shown in the screenshot above), which fires\n  on any POST and needs no SCM match.\n\nWhen a push arrives, the build starts — triggered by the webhook that travelled through the\nbucket and the plugin (note *“Started by GitHub push”*):\n\n![Build triggered by a GitHub push through Webhook Relay](docs/images/05-build-triggered.png)\n\n## Bucket logs\n\nEvery webhook is recorded on the bucket's [logs page](https://my.webhookrelay.com/buckets),\nincluding the response Jenkins returned. A `sent` status with a `200` response status means\nJenkins accepted the webhook. The plugin links straight to it — both in the **Get Webhook URL**\nresult and as a **View bucket logs \u0026amp; settings** link under the connection status — once the\nbucket has been resolved.\n\n![Bucket logs](docs/images/09-whr-bucket-logs.png)\n\n## Try it with Docker\n\nA ready-to-run demo lives in [`demo/`](demo/):\n\n```bash\nmvn -q clean package                                   # builds target/webhook-relay.hpi\ndocker compose -f demo/docker-compose.yml up --build   # Jenkins on http://localhost:8095\n```\n\nThe demo image pre-installs the `git`, `github`, `workflow-aggregator` and\n`generic-webhook-trigger` plugins and an admin user via Configuration as Code. Install\n`target/webhook-relay.hpi` from **Manage Jenkins → Plugins → Advanced**, then configure the\nWebhook Relay section as above. See [`demo/README.md`](demo/README.md) for details.\n\n## Configuration reference\n\n| Field | Description |\n|---|---|\n| **Enable** | Connect to Webhook Relay and start forwarding. |\n| **API Key / Secret** | Webhook Relay token credentials. Stored encrypted. |\n| **Bucket name** | Bucket(s) to subscribe to (comma-separated). Empty = all buckets. |\n| **SCM Webhook Preset** | Jenkins endpoint to deliver to: `github-webhook/`, `project/` (GitLab), `bitbucket-hook/`, `generic-webhook-trigger/invoke`, or Custom. |\n\n\u003e **Custom preset / internal outputs:** if you configure an *internal output* on the bucket\n\u003e with a full `http://…` destination, the plugin honours that path instead of the preset.\n\n## Troubleshooting\n\n| Symptom | Fix |\n|---|---|\n| Status shows **Authentication Failed** | Check the API key/secret. |\n| Status shows **Disconnected** | The plugin reconnects automatically with backoff; check Jenkins logs. |\n| Webhook arrives but no build | Make sure the job's hook trigger is enabled and (for GitHub) the Git remote URL matches the pushed repo. |\n| Nothing in the bucket logs | Confirm the SCM is pointed at the bucket's public URL (the **Get Webhook URL** value). |\n\n## Development\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for how to build, test, and run the plugin locally.\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebhookrelay%2Fjenkins-webhook-tunnel-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebhookrelay%2Fjenkins-webhook-tunnel-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebhookrelay%2Fjenkins-webhook-tunnel-plugin/lists"}