AWS Bedrock으로 PR 리뷰 봇 만들어보기-Github Marketplace 배포(2)

이플 (Dongsik Ga)·2024년 10월 27일
0

기술

목록 보기
9/11

썸네일

상황

이전 게시글에서 저는 AWS의 크레딧을 사용할 곳을 찾다가... Bedrock이라는 마수에 빠져서 Claude를 크레딧으로 사용한다는 거창한 계획을 세웠습니다.(모두 헛된 꿈이었지만..)
그렇게 저는 AWS Bedrock으로 코드리뷰 기능을 구현하기 위해서 Github에서 diff 파일을 가져왔고, 간단하게 리뷰를 요청했으며, 응답받은 내용을 기반으로 PR Comment까지 남겨보았죠.

이렇게 해서 Python 파일을 만들어서 적용을 실제로 해봤습니다.

name: PR 리뷰 봇

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.REVIEW_AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.REVIEW_AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Install dependencies
        run: |
          pip install boto3 requests

      - name: Run PR Review
        env:
          GITHUB_TOKEN: ${{ secrets.REVIEW_GITHUB_TOKEN }}
          GITHUB_REPOSITORY: ${{ github.repository }}
          PR_NUMBER: ${{ github.event.pull_request.number }}
          REVIEW_AWS_ACCESS_KEY_ID: ${{ secrets.REVIEW_AWS_ACCESS_KEY_ID }}
          REVIEW_AWS_SECRET_ACCESS_KEY: ${{ secrets.REVIEW_AWS_SECRET_ACCESS_KEY }}
        run: |
          python .github/scripts/pr_review.py

위처럼 말이죠.

위 스크립트는 제가 참 왜이렇게 했는지 잘 모르겠네요 ㅎ

위 스크립트에서의 문제점은 몇개가 있지만... 제가 생각하는 가장 큰 문제점은 PR 리뷰를 .github/scripts/pr_review.py라는 경로에 있는 파이썬 파일을 실행함으로써 진행한다는 것입니다.

사실 이 프로젝트에서만 사용할거면 문제가 없습니다. 이대로 사용하고 불편하다면 해당 파일을 수정만 해주면 되는거죠.
하지만 개발자가... 이런 PR 리뷰봇같은 범용적인 기능을 과연 단 하나의 프로젝트에서만 사용할까요? (돈아까워서 하나에만 쓰는거면 인정이긴 합니다..)
저 또한 이 기능을 만들면서 '아~ 내가 쓰는 모든 프로젝트에 적용해놔야지~' 생각했습니다. 이런 생각을 가지면서 이렇게 py 파일 하나로 관리를 끝낸다는건 정말 말도 안된다고 생각했습니다.

파일 트리
이렇게 workflows에 추가해주고, scripts에도 추가해주고를 하면서 변경할 때에는 넣어둔 모든 프로젝트에 pr_review.py라는 파일을 매번 바꿔줘야한다는건.. 정말 유지보수에 최악인 구조라고 생각합니다.

그래서

이런 기능을 가진 파일을 좀 더 효율적으로 통합해서 관리하고자, Github Repository를 따로 만들기로 했습니다.

아마 이전 게시글에도 있을텐데, 여기입니다.

이렇게 레포지토리를 따로 분리를 했으니 이걸 이제 Github actions에서 적용을 하려면 어떻게 해야할까요?
제가 많은 기능을 아는 것은 아니지만, 그래도 지금까지 해온걸로 생각할 수 있던건 바로 마켓플레이스에 배포해서 사용하자 였습니다.

Github Marketplace란?

Github를 돌아다니다보면 종종 마주하지만, 뭔지도 모르겠고, 굳이 들어가고싶지도 않은 탭이 있습니다. 그 중에 하나가 Marketplace라고 생각합니다. (제 기준에서는요)
Explore, Marketplace
Github Marketplace란 깃허브 공식 문서 상에서 다음과 같이 정의합니다.

GitHub Marketplace은(는) 사용자를 GitHub 워크플로를 확장하고 개선하려는 개발자에게 연결합니다. GitHub Marketplace에서 개발자에 대해 사용할 수 있는 무료 및 유료 도구를 나열할 수 있습니다. GitHub Marketplace은(는) 개발자에게 GitHub Actions 및 앱이라는 두 가지 유형의 도구를 제공하며, 각 도구에는 GitHub Marketplace에 추가하기 위한 여러 단계가 필요합니다.

적당히 각색해서 말하자면, "워크플로우를 좀 더 효율적으로 쓰기 위해 사용할 수 있는 도구를 구할 수 있는 곳"입니다. 해당 Marketplace에는 누구든지 도구를 올릴 수 있고, 누구든지 원하는 기능을 사용할 수 있죠.

이곳에 올릴 수 있는 도구는 Github Actions, 앱 이 두가지인데요. 제가 사용한 범주는 이 중 Github Actions에 해당합니다.

자세한 설명을 위의 공식문서를 참고하시면 될 것 같고, 이번 포스팅은 Marketplace에 대해 설명하는게 아니니 짧게 마무리하겠습니다.

Github Marketplace에 배포해보자

결론적으로 저는 Marketplace를 통해 Repository에 올린 PR Review Bot을 배포하고, 제 프로젝트에서 해당 봇을 적용해서 사용할 계획입니다. 관련된 절차에 대한 설명은 여기에 있습니다.

필요한 파일

Marketplace에 배포를 하기 위해서는 필요한 추가 파일이 있습니다. 바로 action.yml입니다. 메타데이터를 명시하는 파일인데요.
해당 기능이 어떤 기능인지에 대한 이름, 설명이 들어가고 그리고 어떤 입력값이 들어갈지, 출력값이나 어떤 환경에서 실행할지 등 전반적인 상태를 관리하는 파일입니다.
해당 입력값에 대해서 자세한 사항은 여기에 공식 문서가 준비되어있으니 참고하시면 됩니다.

제가 입력한 yml을 다음과 같습니다.

name: AWS Bedrock Code Review Action
description: 'A Code Review Action Using AWS Bedrock'
inputs:
    # AWS
    aws-access-key-id:
        description: 'AWS Access Key ID'
        required: true
    aws-secret-access-key:
        description: 'AWS Secret Access Key'
        required: true
    aws-region:
        description: 'AWS Region'
        required: true
    # GitHub
    github-token:
        description: 'GitHub Token'
        required: true
    # Bedrock
    anthropic-model:
        description: 'Bedrock Anthropic Model Id'
        required: false
        default: 'anthropic.claude-3-haiku-20240307-v1:0'
    max-tokens:
        description: 'Max Tokens'
        required: false
        default: 1000

branding:
  icon: 'check-circle'
  color: white

runs:
  using: 'composite'
  steps:
    - run: pip install botocore
      shell: bash
    - run: python ${{ github.action_path }}/main.py
      shell: bash
      env:
        INPUT_AWS_ACCESS_KEY_ID: ${{ inputs.aws-access-key-id }}
        INPUT_AWS_SECRET_ACCESS_KEY: ${{ inputs.aws-secret-access-key }}
        INPUT_AWS_REGION: ${{ inputs.aws-region }}
        INPUT_GITHUB_TOKEN: ${{ inputs.github-token }}
        INPUT_GITHUB_REPOSITORY: ${{ github.repository }}
        INPUT_PR_NUMBER: ${{ github.event.pull_request.number }}
        INPUT_ANTHROPIC_MODEL: ${{ inputs.anthropic-model }}
        INPUT_MAX_TOKENS: ${{ inputs.max-tokens }}

name: 해당 Action의 이름을 나타냅니다.
description: Action의 세부 설명을 나타냅니다.
inputs: Action이 실행될 때 사용자에게 입력받을 값에 대해서 나열합니다.
branding: Action이 Marketplace에 등록될 때 표시될 로고를 나타냅니다. 위 사이트와 동일한 페이지이지만 이 부분에 branding 관련 제한사항이 존재합니다. (사용할 수 있는 아이콘, 색이 정해져있습니다)
runs: 어떻게 실행할지에 대해서 설정합니다.

제가 사용한 것들은 위의 속성들이 전부이고, 추가적으로 필요한 다른 속성은 페이지에서 찾아서 진행해보시면 될 것 같습니다.

Draft a release

action.yml 파일이 업로드된 커밋이 푸시되어있다면 이제 해당 Repository에 다음과 같은 창이 뜨게 됩니다.
테스트용 이미지
저 위의 Draft a release 버튼을 누르게 되면 이제 우리는 해당 Repository를 Marketplace에 배포할 수 있게 됩니다.

Release Action

배포하기 전 action.yml으로 최소한의 검사를 진행합니다. 아래와 같은 이미지가 나오는데요.

검사...
저는 이미 배포된 action.yml 파일을 가져와서 Name 부분에 Unique 에러가 발생하는데, 아마 여러분들이 고유하게 작성하셨다면 문제없이 나오게 될 것입니다.

Publish this Action to the GitHub Marketplace 옵션은 배포를 한 후 Marketplace에서 검색이 가능하게 할 것인지 설정하는 것인데, 여러분만 사용할 것이라면 없어도 되고 아니면 누군가가 사용해도 문제없다면 설정해두어도 좋다고 생각합니다.

참고로 README 파일도 필수이기 때문에 해당 파일도 존재하기는 해야합니다. (내용이 없는 것과는 별개입니다.)

배포에 대한 설명
이제 해당 Release에 대한 설정을 할 차례입니다.
가장 위에는 Category를 설정하는 부분이 있는데요. 우리가 배포할 Action이 어떤 종류의 기능을 하는지 고민해보고 선택하면 됩니다. 카테고리가 굉장히 세부적으로 나뉘어있기 때문에 따로 고민할 부분은 별로 없어보입니다.

그리고 Choose a tag를 눌러서 본인이 원하는 배포 버전을 입력해주면 됩니다. 이 태그는 권장되는 형식이 존재하는데요. 바로 맨 아래로 내리면 설명이 되어있습니다.

괜찮은 태그이름에 대한 설명을 한번 읽어보고 간단하게 구성해보시는 것을 추천합니다.

마지막으로, 배포하는 버전의 제목과, 내용을 입력하고 Publish release를 클릭하면 자연스럽고 쉽고 깔쌈하게 원하는 기능을 가진 Action을 배포할 수 있게 됩니다.

배포를 하면

배포가 완료되었다면 이제 Repository 화면이 다음처럼 바뀝니다.

기존에는 Draft하라고 안내가 되어있었다면 이제는 View on Marketplace 라며 배포된 부분을 확인할 수 있도록 바뀌었습니다.

또한 Releases 탭에 들어가면 배포가 된 버전별로 확인도 할 수 있습니다. 기존에는 이게 무슨 탭인지 잘 몰랐는데, 이런 것들을 위한 탭이라는 것을 이제는 알게 되었습니다.

배포를 할 때마다 어떤 내용이 바뀌었는지 , 어떤 커밋을 가지고 있으며, 어떤 태그정보를 가지는지도 알 수 있게 됩니다.

이제 기존 프로젝트를 변경해보자

지금까지 해왔던 작업은 바로 scripts로 Github Action에서 실행되고 있던 기능을 따로 분리해서, 통합적으로 관리하기 위해서 진행한 것이었습니다.
이제 이렇게 따로 분리해서 관리할 수 있게 되었으니... 적용해봅시다.

Github Action 수정

name: PR 리뷰 봇

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: AWS Bedrock Code Review Action
        uses: eple0329/AWSBedrock-CodeReview@v1.0.1-alpha.1
        with:
          aws-access-key-id: ${{ secrets.REVIEW_AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.REVIEW_AWS_SECRET_ACCESS_KEY }}
          aws-region: 'us-east-1'
          github-token: ${{ secrets.REVIEW_GITHUB_TOKEN }}
          anthropic-model: 'anthropic.claude-3-haiku-20240307-v1:0'
          max-tokens: 1000

맨 위에 있던 yml 파일이 다음처럼 변경되었습니다.
단순히 1번의 steps로 실행할 수 있는데요. 여러 환경변수를 입력하고, 원하는 정보를 입력하면 해당 정보가 입력된 환경을 세팅해주고 실행하는 구조입니다.

이제 간단하게 바뀌었으니 pr_review.py 파일은 이제 빼고 나중에 Review Bot 기능이 업데이트되면 여기서 버전반 바꿔주기만 하면 됩니다. (유지보수에 있어서 상당히 간편해졌다는 것을 알 수 있습니다.)

참 쉽죠?

마무리

이번 게시물에서는 따로 Review Bot을 개선하는 내용을 작성하지는 않았습니다. Github Marketplace에 등록하는 과정을 한번쯤은 적어두고 가고 싶었거든요.

이후의 게시물에서는 Claude를 AWS Titan으로 바꾸는 내용으로 작성하지 않을까 싶습니다. 크게 설명할 부분은 없는지라, 어떤 방향으로 발전을 시키고 있는지도 설명할 수도 있고요.

감사합니다.

모든 코드와 배포는 이 깃허브 레포지토리에서 진행되었으니 참고 부탁드립니다.

profile
어제보다 더 나은 오늘의 나를 위해 노력하는 개발자입니다.

0개의 댓글

관련 채용 정보