Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion docs/docs/installation/gitlab.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ GITLAB__SHARED_SECRET=<shared_secret>
GITLAB__URL=https://gitlab.com
GITLAB__AUTH_TYPE=oauth_token # Use "private_token" for older GitLab versions
OPENAI__KEY=<your_openai_api_key>
PORT=3000 # Optional: override the webhook server port
```

8. Create a webhook in your GitLab project. Set the URL to `http[s]://<PR_AGENT_HOSTNAME>/webhook`, the secret token to the generated secret from step 3, and enable the triggers `push`, `comments` and `merge request events`.
Expand Down Expand Up @@ -152,4 +153,4 @@ AWS_SECRETS_MANAGER__SECRET_ARN=arn:aws:secretsmanager:us-east-1:123456789012:se

**Important**: When using Secrets Manager, GitLab's webhook secret must be the Secrets Manager secret name.

5. Add IAM permission `secretsmanager:GetSecretValue` to your Lambda execution role
5. Add IAM permission `secretsmanager:GetSecretValue` to your Lambda execution role
19 changes: 18 additions & 1 deletion pr_agent/servers/gitlab_webhook.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import copy
import json
import os
import re
from datetime import datetime

Expand Down Expand Up @@ -309,7 +310,23 @@ async def root():


def start():
uvicorn.run(app, host="0.0.0.0", port=3000)
"""
Start the GitLab webhook server.

The server port can be configured via the PORT environment variable.
Defaults to 3000 if PORT is not set or invalid.
"""
raw_port = os.environ.get("PORT")
try:
port = int(raw_port) if raw_port else 3000
if not (1 <= port <= 65535):
raise ValueError(f"Port {port} is out of valid range")
if raw_port:
get_logger().info(f"Using custom PORT from environment: {port}")
except ValueError as e:
get_logger().warning(f"Invalid PORT environment variable ({e}), using default port 3000")
port = 3000
uvicorn.run(app, host="0.0.0.0", port=port)


if __name__ == '__main__':
Expand Down
46 changes: 46 additions & 0 deletions tests/unittest/test_gitlab_webhook_port.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import os
from unittest import mock

os.environ.setdefault("GITLAB__URL", "https://gitlab.example.com")
import pr_agent.servers.gitlab_webhook as gitlab_webhook


def test_start_uses_port_env(monkeypatch):
monkeypatch.setenv("PORT", "4567")

with mock.patch.object(gitlab_webhook.uvicorn, "run") as mock_run:
gitlab_webhook.start()

_, kwargs = mock_run.call_args
assert kwargs["port"] == 4567
assert kwargs["host"] == "0.0.0.0"


def test_start_invalid_port_env(monkeypatch):
monkeypatch.setenv("PORT", "not-a-number")

with mock.patch.object(gitlab_webhook.uvicorn, "run") as mock_run:
gitlab_webhook.start()

_, kwargs = mock_run.call_args
assert kwargs["port"] == 3000


def test_start_default_port(monkeypatch):
monkeypatch.delenv("PORT", raising=False)

with mock.patch.object(gitlab_webhook.uvicorn, "run") as mock_run:
gitlab_webhook.start()

_, kwargs = mock_run.call_args
assert kwargs["port"] == 3000


def test_start_invalid_port_range(monkeypatch):
monkeypatch.setenv("PORT", "70000")

with mock.patch.object(gitlab_webhook.uvicorn, "run") as mock_run:
gitlab_webhook.start()

_, kwargs = mock_run.call_args
assert kwargs["port"] == 3000