diff --git a/Dockerfile.bitbucket_pipeline b/Dockerfile.bitbucket_pipeline new file mode 100644 index 000000000..889ee1201 --- /dev/null +++ b/Dockerfile.bitbucket_pipeline @@ -0,0 +1,18 @@ +FROM python:3.10 as base + +ENV OPENAI_API_KEY=${OPENAI_API_KEY} \ + BITBUCKET_BEARER_TOKEN=${BITBUCKET_BEARER_TOKEN} \ + BITBUCKET_PR_ID=${BITBUCKET_PR_ID} \ + BITBUCKET_REPO_SLUG=${BITBUCKET_REPO_SLUG} \ + BITBUCKET_WORKSPACE=${BITBUCKET_WORKSPACE} + + +WORKDIR /app +ADD pyproject.toml . +ADD requirements.txt . +RUN pip install . && rm pyproject.toml requirements.txt +ENV PYTHONPATH=/app +ADD pr_agent pr_agent +ADD bitbucket_pipeline/entrypoint.sh / +RUN chmod +x /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] diff --git a/INSTALL.md b/INSTALL.md index 9c46ac500..78331ee48 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -16,6 +16,7 @@ There are several ways to use PR-Agent: - [Method 6: Deploy as a Lambda Function](INSTALL.md#method-6---deploy-as-a-lambda-function) - [Method 7: AWS CodeCommit](INSTALL.md#method-7---aws-codecommit-setup) - [Method 8: Run a GitLab webhook server](INSTALL.md#method-8---run-a-gitlab-webhook-server) +- [Method 9: Run as a Bitbucket Pipeline](INSTALL.md#method-9-run-as-a-bitbucket-pipeline) --- ### Method 1: Use Docker image (no installation required) @@ -370,4 +371,63 @@ In the "Trigger" section, check the ‘comments’ and ‘merge request events 6. Test your installation by opening a merge request or commenting or a merge request using one of CodiumAI's commands. + +### Method 9: Run as a Bitbucket Pipeline + + +You can use our pre-build Bitbucket-Pipeline docker image to run as Bitbucket-Pipeline. + +1. Add the following file in your repository bitbucket_pipelines.yml + +```yaml + pipelines: + pull-requests: + '**': + - step: + name: PR Agent Pipeline + caches: + - pip + image: python:3.8 + services: + - docker + script: + - git clone https://github.com/Codium-ai/pr-agent.git + - cd pr-agent + - docker build -t bitbucket_runner:latest -f Dockerfile.bitbucket_pipeline . + - docker run -e OPENAI_API_KEY=$OPENAI_API_KEY -e BITBUCKET_BEARER_TOKEN=$BITBUCKET_BEARER_TOKEN -e BITBUCKET_PR_ID=$BITBUCKET_PR_ID -e BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG -e BITBUCKET_WORKSPACE=$BITBUCKET_WORKSPACE bitbucket_runner:latest +``` + +2. Add the following secret to your repository under Repository settings > Pipelines > Repository variables. +OPENAI_API_KEY: +BITBUCKET_BEARER_TOKEN: + +3. To get BITBUCKET_BEARER_TOKEN follow these steps + So here is my step by step tutorial + i) Insert your workspace name instead of {workspace_name} and go to the following link in order to create an OAuth consumer. + + https://bitbucket.org/{workspace_name}/workspace/settings/api + + set callback URL to http://localhost:8976 (doesn't need to be a real server there) + select permissions: repository -> read + + ii) use consumer's Key as a {client_id} and open the following URL in the browser + + https://bitbucket.org/site/oauth2/authorize?client_id={client_id}&response_type=code + + iii) + after you press "Grant access" in the browser it will redirect you to + + http://localhost:8976?code= + + iv) use the code from the previous step and consumer's Key as a {client_id}, and consumer's Secret as {client_secret} + + curl -X POST -u "{client_id}:{client_secret}" \ + https://bitbucket.org/site/oauth2/access_token \ + -d grant_type=authorization_code \ + -d code={code} \ + + +After completing this steps, you just to place this access token in the repository varibles. + + ======= diff --git a/README.md b/README.md index 3a7f61a23..af0b5af24 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,7 @@ There are several ways to use PR-Agent: - [Method 6: Deploy as a Lambda Function](INSTALL.md#method-6---deploy-as-a-lambda-function) - [Method 7: AWS CodeCommit](INSTALL.md#method-7---aws-codecommit-setup) - [Method 8: Run a GitLab webhook server](INSTALL.md#method-8---run-a-gitlab-webhook-server) +- [Method 9: Run as a Bitbucket Pipeline](INSTALL.md#method-9-run-as-a-bitbucket-pipeline) ## How it works diff --git a/bitbucket_pipeline/entrypoint.sh b/bitbucket_pipeline/entrypoint.sh new file mode 100644 index 000000000..cbea4b876 --- /dev/null +++ b/bitbucket_pipeline/entrypoint.sh @@ -0,0 +1,2 @@ +#!/bin/bash +python /app/pr_agent/servers/bitbucket_pipeline_runner.py \ No newline at end of file diff --git a/pr_agent/servers/bitbucket_pipeline_runner.py b/pr_agent/servers/bitbucket_pipeline_runner.py new file mode 100644 index 000000000..3c04e9ce1 --- /dev/null +++ b/pr_agent/servers/bitbucket_pipeline_runner.py @@ -0,0 +1,34 @@ +import os +from pr_agent.agent.pr_agent import PRAgent +from pr_agent.config_loader import get_settings +from pr_agent.tools.pr_reviewer import PRReviewer +import asyncio + +async def run_action(): + try: + pull_request_id = os.environ.get("BITBUCKET_PR_ID", '') + slug = os.environ.get("BITBUCKET_REPO_SLUG", '') + workspace = os.environ.get("BITBUCKET_WORKSPACE", '') + bearer_token = os.environ.get('BITBUCKET_BEARER_TOKEN', None) + OPENAI_KEY = os.environ.get('OPENAI_API_KEY') or os.environ.get('OPENAI.KEY') + OPENAI_ORG = os.environ.get('OPENAI_ORG') or os.environ.get('OPENAI.ORG') + # Check if required environment variables are set + if not bearer_token: + print("BITBUCKET_BEARER_TOKEN not set") + return + + if not OPENAI_KEY: + print("OPENAI_KEY not set") + return + # Set the environment variables in the settings + get_settings().set("BITBUCKET.BEARER_TOKEN", bearer_token) + get_settings().set("OPENAI.KEY", OPENAI_KEY) + if OPENAI_ORG: + get_settings().set("OPENAI.ORG", OPENAI_ORG) + if pull_request_id and slug and workspace: + pr_url = f"https://bitbucket.org/{workspace}/{slug}/pull-requests/{pull_request_id}" + await PRReviewer(pr_url).run() + except Exception as e: + print(f"An error occurred: {e}") +if __name__ == "__main__": + asyncio.run(run_action())