alterbooth / pullrequest-code-reviewer-for-azure

MIT License
0 stars 0 forks source link

[森]個人メモ #4

Open toshiki31 opened 1 year ago

toshiki31 commented 1 year ago

個人メモ

toshiki31 commented 1 year ago
toshiki31 commented 1 year ago
toshiki31 commented 1 year ago

pythonの依存関係(requirement.txt)について調べる

toshiki31 commented 1 year ago
from flask import Flask, request
from github import Github
import openai
import os

app = Flask(__name__)

@app.route('/pull_request_review', methods=['POST'])
def pull_request_review():
    # GitHub APIを使用してプルリクエストの情報を取得
    data = request.json
    repo_full_name = data['repository']['full_name']
    pr_number = data['pull_request']['number']
    token = os.environ['GITHUB_TOKEN']
    g = Github(token)
    repo = g.get_repo(repo_full_name)
    pr = repo.get_pull(pr_number)

    # プルリクエストのコードを取得
    diff = pr.get_files()[0].patch

    # OpenAI APIを使用してレビューを生成
    openai.api_key = os.environ['OPENAI_API_KEY']
    prompt = f"Please review the following code:\n{diff}\nReview:"
    response = openai.Completion.create(engine="text-davinci-002", prompt=prompt, max_tokens=1024)
    review = response.choices[0].text.strip()

    # GitHub APIを使用してレビューをプルリクエストにコメント
    pr.create_issue_comment(review)

    return 'OK'

if __name__ == '__main__':
    app.run()

コード実行前にはGITHUB_TOKENとOPENAI_API_KEYの設定が必要

このFlaskアプリケーションを実行すると、GitHubからのWebhookを受信するためのエンドポイント /pull_request_review が提供される。プルリクエストのURLに対してこのエンドポイントを登録することで、プルリクエストに対する自動レビューが有効になる。

toshiki31 commented 1 year ago
toshiki31 commented 1 year ago

仮想ネットワーク(Azure VNet)

toshiki31 commented 1 year ago

image

PrivateEndpointを使わない場合(上ルート)

toshiki31 commented 1 year ago

app funtions からslackにチャットを送るbot作成

時間設定 https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer?pivots=programming-language-javascript&tabs=python-v2%2Cin-process

ex) 毎週水曜日の17:30:5,10に通知 5,10 0 17 * * Wednesday

toshiki31 commented 1 year ago

Azure Functionsをローカルで動かす(VSCode/windows)

詰まったエラー

file 'c:\program files\dotnet\dotnet.exe' is not found, 'dotnet' invocation will rely on the path environment variable.

dotnetが存在しないというエラー文 https://qiita.com/ataraken/items/58ead74b62d30aceb854 を参考にして.NET7をインストール

ModuleNotFoundError: No module named 'azure'

'azure'というモジュールが見つからないというエラー azureがインストールされていないだけ pip install azure-functionsで解決

Can't determine project language from files. Please use one of [--csharp, --javascript, --typescript, --java, --python, --powershell, --custom]

func start --pythonなどfuncstartの後に言語を指定する

toshiki31 commented 1 year ago

イベント時のアクションについて

edited: editedは、GitHub上の特定の要素(例:イシュー、プルリクエスト、コメントなど)が編集されたことを示すアクションです。要素の編集には、タイトル、本文、ラベル、割り当てられたユーザーなどの変更が含まれます。このアクションは、要素の履歴を追跡したり、変更を確認したりするために使用されます。

synchronize: synchronizeは、GitHub上のプルリクエストに関連しています。このアクションは、プルリクエストのブランチが更新された場合にトリガーされます。通常、プルリクエストに新しいコミットがプッシュされ、変更が加わったことを示します。synchronizeアクションは、CI/CD(継続的インテグレーション/デリバリー)パイプラインのトリガーや、プルリクエストの最新の状態を取得するために使用されます。

プリリクエストが開いている状態で新しいコミットが追加されたとことをトリガーとするアクションは無い

TaikiHoshika commented 1 year ago

https://qiita.com/gsy0911/items/61198607476ac686ce6f

toshiki31 commented 1 year ago

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-create-vnet

toshiki31 commented 1 year ago

TimerTrigger

実行ローカル実行

ファイル(init.py)

import json
import requests
import azure.functions as func

def main(mytimer: func.TimerRequest) -> None:
    if mytimer.past_due:
        print('The timer is past due!')
    url = 'https://hooks.slack.com/services/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'
    payload = {
        "text": "日報書いてね!!",
        "username": "Azure Functions Bot",
        "icon_emoji": ":zap:",
        "channel": "#webhook"
    }
    response=requests.post(url, data=json.dumps(payload))
    print(response)
    print("Success??")
    # print("Timer last triggered at " + str(mytimer.last))
    # print("Timer triggered at " + str(mytimer.next))
    if __name__ == '__main__':
        main()

参考

toshiki31 commented 1 year ago

githubappとwebhookについて

githubAppのwebhookurlの欄は ngrokのURL+func startしたときに出るURLのポート番号から後ろ

image

toshi-github-on-azureのwebhookURL(ngrokver) https://2466-2400-4152-1-3700-c4db-97a7-a1d2-bb82.ngrok-free.app/api/slack_http_trigger

ngrokのURLをwebhookURLに変更してから/api...を追加する

toshiki31 commented 1 year ago

slack APP https://zenn.dev/nyancat/articles/20211219-create-slack-app

slackのメッセージ送信機能(chat.postMessage)について https://api.slack.com/methods/chat.postMessage

slack app - pythonによるメッセージ送信 https://note.com/npaka/n/n4bcb38a1ea74

次やること https://chat.openai.com/share/cc0c0910-3cad-4674-b64d-fdb159d3dde2

toshiki31 commented 1 year ago

今の状態 (issueをプッシュ -> 送信)

import logging
import requests
import azure.functions as func
from github import Github, GithubIntegration

# ==このファイルについて==
# slack_appを用いてメッセージ送信(受信も?)
TOKEN = 'xoxb-5193135314608-5389893783333-FobyTh1hrpDgmtiYSsOynSHJ'
CHANNEL = 'send_issue'

app_id = 339107

with open("c:/send-message-on-slack.private-key.pem") as key:
    private_key = key.read()

integration = GithubIntegration(
    app_id,
    private_key,
)

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    payload = req.get_json()
    logging.info(payload)
    keys = payload.keys()

    if payload['action'] == 'opened':
        if "issue" in keys:
            installation_id = payload['installation']['id']
            repo_full_name = payload['repository']['full_name']
            issue_number = payload['issue']['number']
            user = payload['issue']['user']['login']
            issue_url = payload['issue']['html_url']

            url = "https://slack.com/api/chat.postMessage"
            headers = {"Authorization": "Bearer "+TOKEN}
            data  = {
            "text": "@{}が{}でissueを開きました\n{}".format(user,repo_full_name,issue_url),
            "username": "send_issue_Bot",
            }
            r = requests.post(url, headers=headers, data=data)
            logging.info("return ", r.json())
    return func.HttpResponse(status_code=200)