Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: set review data to github actions output #853

Merged
merged 8 commits into from
Apr 11, 2024
Merged
Show file tree
Hide file tree
Changes from 3 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
10 changes: 10 additions & 0 deletions pr_agent/algo/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import difflib
import json
import os
import re
import textwrap
from datetime import datetime
Expand Down Expand Up @@ -661,3 +662,12 @@ def find_line_number_of_relevant_line_in_file(diff_files: List[FilePatchInfo],
absolute_position = start2 + delta - 1
break
return position, absolute_position

def github_output(output_data: dict, key_name: str):
if get_settings().github_action_config.enable_output is False:
return

output = os.getenv('GITHUB_OUTPUT')
key_data = output_data.get(key_name, {})
with open(output, 'w') as f:
f.write(f"{key_name}={json.dumps(key_data, indent=None, ensure_ascii=False)}")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(1)
change name to 'github_action_output'
it can be confusing to call it as a generic 'github_output' name

(2) wrap everything with try-except.
see also PR-Agent feedback:
"
Environment Variable Dependency: The feature relies on the GITHUB_OUTPUT environment variable being set.
"
Will it always be set ?

(3)
change
" if get_settings().github_action_config.enable_output is False:
return"

to getter only:
if get_settings().get("github_action_config.enable_output", False)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mrT23 Thank you for your reivewing.

  • (1) : fixed.
  • (2) : fixed, refined & add test code.
    I think GITHUB_OUTPUT env is always available on github actions runner. Refined the output implementation based on most using codebases. (ref.1 / ref.2)
    Note that this feature is implicitly disabled in the configuration if use in other than github actions. so, I think no side-effect.
  • (3): fixed.

2 changes: 2 additions & 0 deletions pr_agent/servers/github_action_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ async def run_action():
get_settings().set("OPENAI.ORG", OPENAI_ORG)
get_settings().set("GITHUB.USER_TOKEN", GITHUB_TOKEN)
get_settings().set("GITHUB.DEPLOYMENT_TYPE", "user")
enable_output = get_setting_or_env("GITHUB_ACTION_CONFIG.ENABLE_OUTPUT", True)
get_settings().set("GITHUB_ACTION_CONFIG.ENABLE_OUTPUT", enable_output)

# Load the event payload
try:
Expand Down
1 change: 1 addition & 0 deletions pr_agent/settings/configuration.toml
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ try_fix_invalid_inline_comments = true
# auto_review = true # set as env var in .github/workflows/pr-agent.yaml
# auto_describe = true # set as env var in .github/workflows/pr-agent.yaml
# auto_improve = true # set as env var in .github/workflows/pr-agent.yaml
# enable_output = true # set as env var in .github/workflows/pr-agent.yaml

[github_app]
# these toggles allows running the github app from custom deployments
Expand Down
3 changes: 2 additions & 1 deletion pr_agent/tools/pr_reviewer.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
from pr_agent.algo.pr_processing import get_pr_diff, retry_with_fallback_models
from pr_agent.algo.token_handler import TokenHandler
from pr_agent.algo.utils import convert_to_markdown, load_yaml, ModelType
from pr_agent.algo.utils import convert_to_markdown, github_output, load_yaml, ModelType
from pr_agent.config_loader import get_settings
from pr_agent.git_providers import get_git_provider
from pr_agent.git_providers.git_provider import IncrementalPR, get_main_pr_language
Expand Down Expand Up @@ -192,6 +192,7 @@ def _prepare_pr_review(self) -> str:
data = load_yaml(self.prediction.strip(),
keys_fix_yaml=["estimated_effort_to_review_[1-5]:", "security_concerns:", "possible_issues:",
"relevant_file:", "relevant_line:", "suggestion:"])
github_output(data, 'review')

if 'code_feedback' in data:
code_feedback = data['code_feedback']
Expand Down
40 changes: 40 additions & 0 deletions tests/unittest/test_github_output.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import os
import json
from pr_agent.algo.utils import get_settings, github_output

class TestGitHubOutput:
def test_github_output_enabled(self, monkeypatch, tmp_path):
get_settings().set('GITHUB_ACTION_CONFIG.ENABLE_OUTPUT', True)
monkeypatch.setenv('GITHUB_OUTPUT', str(tmp_path / 'output'))
output_data = {'key1': {'value1': 1, 'value2': 2}}
key_name = 'key1'

github_output(output_data, key_name)

with open(str(tmp_path / 'output'), 'r') as f:
env_value = f.read()

actual_key = env_value.split('=')[0]
actual_data = json.loads(env_value.split('=')[1])

assert actual_key == key_name
assert actual_data == output_data[key_name]

def test_github_output_disabled(self, monkeypatch, tmp_path):
get_settings().set('GITHUB_ACTION_CONFIG.ENABLE_OUTPUT', False)
monkeypatch.setenv('GITHUB_OUTPUT', str(tmp_path / 'output'))
output_data = {'key1': {'value1': 1, 'value2': 2}}
key_name = 'key1'

github_output(output_data, key_name)

assert not os.path.exists(str(tmp_path / 'output'))

def test_github_output_notset(self, monkeypatch, tmp_path):
monkeypatch.setenv('GITHUB_OUTPUT', str(tmp_path / 'output'))
output_data = {'key1': {'value1': 1, 'value2': 2}}
key_name = 'key1'

github_output(output_data, key_name)

assert not os.path.exists(str(tmp_path / 'output'))
Loading