From 2827367c9ca4d83f1da46e3c6691039f0dcccd02 Mon Sep 17 00:00:00 2001 From: yuyeol3 Date: Mon, 9 Nov 2026 16:46:48 +0900 Subject: [PATCH] =?UTF-8?q?chore=20:=20B1=20=EC=BA=98=EB=A6=B0=EB=8D=94=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC=20=EB=A7=A4=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A7=91=ED=95=98=EB=8A=94=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=ED=94=8C=EB=A1=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PRD는 캘린더 데이터를 하루 1회 이상, B2 알림 메일(09:00 KST) 전에 갱신하라고 한다. 2주 수집(ALL)은 LLM 비용 때문에 매일 돌릴 수 없어, 캘린더만 도는 CALENDAR 소스를 매일 05:17 KST에 따로 돌린다. Chromium·LLM을 쓰지 않는다. _collect.yml에 source 입력(기본 ALL)을 추가해 COLLECTOR_SOURCE로 넘기고, ALL에도 온통청년 단계가 들어가므로 ONTONG_YOUTH_API_KEY 시크릿을 넘긴다. --- .github/workflows/_collect.yml | 10 +++++++- .github/workflows/calendar.yml | 45 ++++++++++++++++++++++++++++++++++ CLAUDE.md | 8 +++--- 3 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/calendar.yml diff --git a/.github/workflows/_collect.yml b/.github/workflows/_collect.yml index 92b7512..3cf0468 100644 --- a/.github/workflows/_collect.yml +++ b/.github/workflows/_collect.yml @@ -11,6 +11,10 @@ on: description: "수집에 쓸 브랜치" type: string required: true + source: + description: "수집 소스(collector.source). ALL / CALENDAR 등" + type: string + default: ALL permissions: contents: read @@ -23,7 +27,7 @@ jobs: ref: ${{ inputs.ref }} collect: - name: Collect into ${{ inputs.environment }} + name: Collect ${{ inputs.source }} into ${{ inputs.environment }} needs: ci runs-on: ubuntu-latest environment: ${{ inputs.environment }} @@ -53,6 +57,8 @@ jobs: uses: gradle/actions/setup-gradle@v6 - name: Install Chromium for bank URL scraping + # 캘린더 수집은 은행 URL 스크래핑을 하지 않는다. + if: inputs.source != 'CALENDAR' run: | bash ./gradlew playwrightInstall npx -y playwright@1.61.0 install-deps chromium @@ -85,7 +91,9 @@ jobs: SPRING_DATASOURCE_URL: jdbc:postgresql://127.0.0.1:15432/database SPRING_DATASOURCE_USERNAME: user SPRING_DATASOURCE_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }} + COLLECTOR_SOURCE: ${{ inputs.source }} FSS_API_KEY: ${{ secrets.FSS_API_KEY }} + ONTONG_YOUTH_API_KEY: ${{ secrets.ONTONG_YOUTH_API_KEY }} GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }} LLM_ENABLED: "true" # 배치가 FAILED면 0이 아닌 코드로 끝나 이 단계가 실패한다(ApiCollectorApplication.main). diff --git a/.github/workflows/calendar.yml b/.github/workflows/calendar.yml new file mode 100644 index 0000000..15e6259 --- /dev/null +++ b/.github/workflows/calendar.yml @@ -0,0 +1,45 @@ +name: Calendar + +# B1 캘린더 데이터(정책상품 회차, 온통청년 청년정책)만 매일 갱신한다(COLLECTOR_SOURCE=CALENDAR). +# PRD: 하루 1회 이상 수집하고 B2 알림 메일(09:00 KST) 발송 전에 끝낸다. +# LLM·은행 스크래핑을 쓰지 않아 매일 돌려도 API 비용이 없다. 설정은 CLAUDE.md의 "수집 워크플로" 참고. +on: + schedule: + # 20:17 UTC = 05:17 KST. 정각은 Actions 스케줄이 몰려 늦게 시작하는 일이 많아 피한다. + # 2주 수집(collect.yml, 04:00 KST)과 겹치면 collect- 동시 실행 그룹에서 그 뒤에 돈다. + - cron: "17 20 * * *" + workflow_dispatch: + inputs: + environment: + description: "수집 대상 환경" + type: choice + options: [dev, prod] + default: dev + +permissions: + contents: read + +jobs: + dev: + if: github.event_name == 'schedule' || inputs.environment == 'dev' + uses: ./.github/workflows/_collect.yml + secrets: inherit + permissions: + contents: read + id-token: write + with: + environment: dev + ref: main + source: CALENDAR + + prod: + if: vars.PROD_ENABLED == 'true' && (github.event_name == 'schedule' || inputs.environment == 'prod') + uses: ./.github/workflows/_collect.yml + secrets: inherit + permissions: + contents: read + id-token: write + with: + environment: prod + ref: release + source: CALENDAR diff --git a/CLAUDE.md b/CLAUDE.md index b44423e..f25f8eb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -35,13 +35,15 @@ api-collector main에 박히는 포인터는 **Fin-BE main에 머지된 커밋** 1. Fin-BE 스키마 변경을 main에 머지 2. `git submodule update --remote fin-be` → 포인터 bump 후 커밋 -## 수집 워크플로 (`.github/workflows/collect.yml`) +## 수집 워크플로 (`.github/workflows/collect.yml`, `calendar.yml`) 수집 배치는 서버가 아니라 GitHub Actions 러너에서 돈다(서버 e2-micro에는 Chromium을 띄울 여유가 없음). +두 워크플로 모두 `_collect.yml`을 호출하고, `source` 입력이 `COLLECTOR_SOURCE`(collector.source)가 된다. -- 주기: LLM API 비용 때문에 약 2주 간격(매월 2·16일 04:00 KST). 그 사이에는 Actions에서 수동 실행(`workflow_dispatch`). +- `collect.yml`(`ALL`): LLM API 비용 때문에 약 2주 간격(매월 2·16일 04:00 KST). 그 사이에는 Actions에서 수동 실행(`workflow_dispatch`). +- `calendar.yml`(`CALENDAR`): B1 캘린더(정책상품 회차, 온통청년 청년정책)만 매일 05:17 KST. B2 알림 메일(09:00 KST) 전에 끝내야 한다. LLM·Chromium을 쓰지 않는다. - `main` → dev DB, `release` → 운영 DB. 운영은 레포 변수 `PROD_ENABLED=true`일 때만 돈다. - 수집 전에 같은 브랜치로 `ci.yml`(테스트)을 돌리고, 통과해야 수집한다. - 서버 접속: GCP OIDC 인증 → IAP SSH 포트 포워딩으로 서버 Postgres(`127.0.0.1:5678`)에 붙는다. 서버 구성과 GCP 설정은 Fin-BE `docs/implementation/deployment.md`. -- GitHub Environment(`dev`, `prod`): vars `GCP_PROJECT`, `GCP_WIF_PROVIDER`, `GCP_SERVICE_ACCOUNT`, `GCE_INSTANCE`, `GCE_ZONE` / secrets `POSTGRES_PASSWORD`, `FSS_API_KEY`, `GEMINI_API_KEY`. +- GitHub Environment(`dev`, `prod`): vars `GCP_PROJECT`, `GCP_WIF_PROVIDER`, `GCP_SERVICE_ACCOUNT`, `GCE_INSTANCE`, `GCE_ZONE` / secrets `POSTGRES_PASSWORD`, `FSS_API_KEY`, `GEMINI_API_KEY`, `ONTONG_YOUTH_API_KEY`. - **순서 제약**: 엔티티가 새 컬럼을 쓰면 Fin-BE가 그 마이그레이션을 해당 환경에 먼저 배포해야 한다. 아니면 `ddl-auto: validate`에서 수집이 실패한다.