diff --git a/.github/workflows/build_deploy_executables.yml b/.github/workflows/build_deploy_executables.yml deleted file mode 100644 index df7eb80..0000000 --- a/.github/workflows/build_deploy_executables.yml +++ /dev/null @@ -1,111 +0,0 @@ -# .github/workflows/build_deploy_executables.yml - -name: Build and Deploy Executables - -on: - release: - types: [published] # Release가 'published' 상태가 될 때 트리거 - -jobs: - # 1단계: 각 OS에서 실행 파일을 빌드하는 잡 - build: - strategy: - matrix: - os: [macos-latest, windows-latest] # macOS와 Windows 환경에서 각각 빌드 - runs-on: ${{ matrix.os }} # 매트릭스에서 선택된 OS에서 잡 실행 - - steps: - # 1. Git 리포지토리의 소스 코드를 가져옵니다. - - name: Checkout code - uses: actions/checkout@v4 - - # 2. Poetry 설치 (디버깅 출력 추가) - - name: Install Poetry - shell: bash - run: | - echo "Installing Poetry..." - curl -sSL https://install.python-poetry.org | python3 - - echo 'Poetry 설치 완료' - - # OS별 Poetry 경로를 PATH에 추가 - if [[ "$RUNNER_OS" == "Windows" ]]; then - echo "C:/Users/runneradmin/AppData/Roaming/Python/Scripts" >> $GITHUB_PATH - else - echo "$HOME/.local/bin" >> $GITHUB_PATH - fi - - # 디버깅 출력 - echo "Poetry 위치: $(which poetry || echo 'Poetry not found')" - echo "Poetry 버전:" - poetry --version || echo 'Poetry 실행 실패' - - # 3. Poetry를 사용하여 파이썬 환경을 설정합니다. - - name: Set up Python with Poetry - uses: actions/setup-python@v5 - with: - python-version: "3.11" - cache: "poetry" - - # 4. Poetry 의존성(PyInstaller 포함)을 설치합니다. - - name: Install Poetry dependencies - run: poetry install --no-root - - # 5. OS에 따라 실행 파일의 이름(.exe 확장자 등)을 결정합니다. - - name: Set executable name - id: set_name - shell: bash - run: | - if [ "${{ runner.os }}" == "macOS" ]; then - echo "EXE_NAME=askql-api" >> $GITHUB_ENV - elif [ "${{ runner.os }}" == "Windows" ]; then - echo "EXE_NAME=askql-api.exe" >> $GITHUB_ENV - fi - - # 6. PyInstaller를 사용해 파이썬 코드를 실행 파일로 만듭니다. - - name: Build executable with PyInstaller - run: poetry run pyinstaller main.py --name ${{ env.EXE_NAME }} --onefile --noconsole - - # 7. 빌드된 실행 파일을 다음 단계(deploy)에서 사용할 수 있도록 아티팩트로 업로드합니다. - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: executable-${{ runner.os }} - path: dist/${{ env.EXE_NAME }} - retention-days: 1 # 아티팩트 보관 기간 (하루) - - # 2단계: 빌드된 실행 파일들을 Front 리포지토리에 배포하는 잡 - deploy: - needs: build - runs-on: ubuntu-latest - - steps: - - name: Checkout Front Repository - uses: actions/checkout@v4 - with: - repository: AskQL/askql_app - token: ${{ secrets.PAT_FOR_FRONT_REPO }} - ref: develop - - - name: Download all artifacts - uses: actions/download-artifact@v4 - with: - path: artifacts - - - name: Organize files - run: | - mkdir -p resources/mac resources/win - mv artifacts/executable-macOS/askql-api resources/mac/ - mv artifacts/executable-Windows/askql-api.exe resources/win/ - - - name: Commit and push changes - run: | - git config --global user.name 'github-actions' - git config --global user.email 'github-actions@github.com' - git add . - # 변경 사항이 있을 때만 커밋 및 푸시 - if git diff-index --quiet HEAD; then - echo "No changes to commit to AskQL APP repository." - else - git commit -m "feat: API 실행 파일 업데이트 (${{ github.ref_name }})" - git push - fi diff --git a/.github/workflows/build_release_and_notify.yml b/.github/workflows/build_release_and_notify.yml new file mode 100644 index 0000000..558fea7 --- /dev/null +++ b/.github/workflows/build_release_and_notify.yml @@ -0,0 +1,177 @@ +# .github/workflows/build_release_and_notify.yml + +name: Build and Deploy Executables + +on: + release: + types: [published] # Release가 'published' 상태가 될 때 트리거 + +jobs: + # ================================== + # 파이프라인 시작 알림 + # ================================== + start: + runs-on: ubuntu-latest + steps: + - name: Send Pipeline Start Notification + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "API 배포 봇", + "embeds": [{ + "description": "**${{ github.ref_name }}** API 배포를 시작합니다.", + "color": 2243312 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} + # ================================== + # 실행 파일 빌드 + # ================================== + build: + needs: start + strategy: + matrix: + os: [macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + + steps: + # 1. Git 리포지토리의 소스 코드를 가져옵니다. + - name: Checkout code + uses: actions/checkout@v4 + + # 2. Poetry 설치 (디버깅 출력 추가) + - name: Install Poetry + shell: bash + run: | + curl -sSL https://install.python-poetry.org | python3 - + if [[ "$RUNNER_OS" == "Windows" ]]; then + echo "C:/Users/runneradmin/AppData/Roaming/Python/Scripts" >> $GITHUB_PATH + else + echo "$HOME/.local/bin" >> $GITHUB_PATH + fi + + # 3. Poetry를 사용하여 파이썬 환경을 설정합니다. + - name: Set up Python with Poetry + uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: "poetry" + + # 4. Poetry 의존성(PyInstaller 포함)을 설치합니다. + - name: Install Poetry dependencies + run: poetry install --no-root + + # 5. OS에 따라 실행 파일의 이름(.exe 확장자 등)을 결정합니다. + - name: Set executable name + id: set_name + shell: bash + run: | + if [ "${{ runner.os }}" == "macOS" ]; then + echo "EXE_NAME=qgenie-api" >> $GITHUB_ENV + elif [ "${{ runner.os }}" == "Windows" ]; then + echo "EXE_NAME=qgenie-api.exe" >> $GITHUB_ENV + fi + + # 6. PyInstaller를 사용해 파이썬 코드를 실행 파일로 만듭니다. + - name: Build executable with PyInstaller + run: poetry run pyinstaller main.py --name ${{ env.EXE_NAME }} --onefile --noconsole + + # 7. 빌드된 실행 파일을 다음 단계(deploy)에서 사용할 수 있도록 아티팩트로 업로드합니다. + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: executable-${{ runner.os }} + path: dist/${{ env.EXE_NAME }} + retention-days: 1 + + # ================================== + # 배포 + # ================================== + deploy: + needs: build + runs-on: ubuntu-latest + + steps: + - name: Checkout App Repository + uses: actions/checkout@v4 + with: + repository: Queryus/QGenie_app + token: ${{ secrets.PAT_FOR_FRONT_REPO }} + ref: develop + + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Organize files + run: | + mkdir -p resources/mac resources/win + mv artifacts/executable-macOS/qgenie-api resources/mac/ + mv artifacts/executable-Windows/qgenie-api.exe resources/win/ + + - name: Commit and push changes + run: | + git config --global user.name 'github-actions' + git config --global user.email 'github-actions@github.com' + git add . + if git diff-index --quiet HEAD; then + echo "No changes to commit to QGenie APP repository." + else + git commit -m "feat: API 실행 파일 업데이트 (${{ github.ref_name }})" + git push + fi + + # ================================== + # 파이프라인 최종 결과 알림 + # ================================== + finish: + needs: deploy + runs-on: ubuntu-latest + if: always() + + steps: + - name: Send Success Notification + if: needs.deploy.result == 'success' + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "API 배포 봇", + "embeds": [{ + "title": "New API Release: ${{ github.ref_name }}", + "url": "${{ github.event.release.html_url }}", + "description": "**${{ github.ref_name }}** API 배포가 성공적으로 완료되었습니다!", + "color": 5167473 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} + + - name: Send Failure Notification + if: contains(needs.*.result, 'failure') + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "API 배포 봇", + "embeds": [{ + "title": "API 배포 실패", + "url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", + "description": "**${{ github.ref_name }}** API 배포 중 오류가 발생했습니다.", + "color": 15219495 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} + + - name: Send Skipped or Cancelled Notification + if: contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped') + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "API 배포 봇", + "embeds": [{ + "title": "API 배포 미완료", + "url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", + "description": "**${{ github.ref_name }}** API 배포가 완료되지 않았습니다. (상태: 취소 또는 건너뜀)\n이전 단계에서 문제가 발생했을 수 있습니다.", + "color": 16577629 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} diff --git a/.github/workflows/pr_bot.yml b/.github/workflows/pr_bot.yml new file mode 100644 index 0000000..22daee4 --- /dev/null +++ b/.github/workflows/pr_bot.yml @@ -0,0 +1,86 @@ +# .github/workflows/pr_bot.yml +name: Pull Request Bot + +on: + # Pull Request 관련 이벤트 발생 시 + pull_request: + types: [opened, closed, reopened, synchronize] + issue_comment: + types: [created] + +jobs: + notify: + runs-on: ubuntu-latest + steps: + # ------------------------- + # 생성/동기화 알림 + # ------------------------- + - name: Send PR Created Notification + if: github.event_name == 'pull_request' && (github.event.action == 'opened' || github.event.action == 'synchronize') + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "GitHub PR 봇", + "embeds": [{ + "title": "Pull Request #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}", + "description": "**${{ github.actor }}**님이 Pull Request를 생성하거나 업데이트했습니다.", + "url": "${{ github.event.pull_request.html_url }}", + "color": 2243312 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} + + # ------------------------- + # 댓글 알림 + # ------------------------- + - name: Send PR Comment Notification + if: github.event_name == 'issue_comment' && github.event.issue.pull_request + run: | + COMMENT_BODY=$(echo "${{ github.event.comment.body }}" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g') + curl -X POST -H "Content-Type: application/json" \ + -d "{ + \"username\": \"GitHub 댓글 봇\", + \"embeds\": [{ + \"title\": \"New Comment on PR #${{ github.event.issue.number }}\", + \"description\": \"**${{ github.actor }}**님의 새 댓글: \\n${COMMENT_BODY}\", + \"url\": \"${{ github.event.comment.html_url }}\", + \"color\": 15105570 + }] + }" \ + ${{ secrets.DISCORD_WEBHOOK_URL }} + + # ------------------------- + # 머지(Merge) 알림 + # ------------------------- + - name: Send PR Merged Notification + if: github.event.action == 'closed' && github.event.pull_request.merged == true + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "GitHub Merge 봇", + "embeds": [{ + "title": "Pull Request #${{ github.event.pull_request.number }} Merged!", + "description": "**${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 머지했습니다.", + "url": "${{ github.event.pull_request.html_url }}", + "color": 5167473 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} + + # ------------------------- + # 닫힘(Close) 알림 + # ------------------------- + - name: Send PR Closed Notification + if: github.event.action == 'closed' && github.event.pull_request.merged == false + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "GitHub PR 봇", + "embeds": [{ + "title": "Pull Request #${{ github.event.pull_request.number }} Closed", + "description": "**${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 닫았습니다.", + "url": "${{ github.event.pull_request.html_url }}", + "color": 15219495 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} diff --git a/.gitignore b/.gitignore index e4f2f6a..9a167d1 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,8 @@ temp/ .DS_Store # macOS에서 생성되는 메타파일 Thumbs.db # Windows에서 생성되는 파일 desktop.ini # Windows 바탕화면 설정 파일 +.idea +.vscode # 테스트 커버리지 리포트 htmlcov/ diff --git a/README.md b/README.md index c06cf6f..2f093e9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# AskQL API +# QGenie API -이 프로젝트는 AskQL 서비스의 백엔드 API를 제공합니다. FastAPI를 기반으로 구축되었으며, 효율적이고 확장 가능한 API를 목표로 합니다. +이 프로젝트는 QGenie 서비스의 백엔드 API를 제공합니다. FastAPI를 기반으로 구축되었으며, 효율적이고 확장 가능한 API를 목표로 합니다. --- @@ -31,8 +31,9 @@ 2. **저장소 복제** ```bash - git clone https://github.com/AskQL/askql_api.git - cd askql_api # 복제된 저장소 디렉토리로 이동 + git clone https://github.com/Queryus/QGenie_api.git + cd app # 복제된 저장소 디렉토리로 이동 + ``` 3. **Poetry 프로젝트 초기화 및 종속성 설치** @@ -45,10 +46,10 @@ **Poetry `init` 시 질문에 대한 답변:** - - `Package name`: `askql-api` + - `Package name`: `QGenie-api` - `Version`: `0.1.0` - `Description`: `""` - - `Author`: `AskQL Team` + - `Author`: `Queryus` - `License`: `MIT` - `Compatible Python versions`: `>=3.11` - `Would you like to define your main dependencies interactively?`: `no` @@ -160,3 +161,4 @@ ```bash curl http://localhost:8000/openapi.json ``` + diff --git a/main.py b/app/main.py similarity index 100% rename from main.py rename to app/main.py diff --git a/pyproject.toml b/pyproject.toml index 6117fc2..e13ea88 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,9 @@ [project] -name = "askql-api" +name = "app" version = "0.1.0" description = "" authors = [ - {name = "AskQL Team"} + {name = "Queryus"} ] license = {text = "MIT"} readme = "README.md"