Skip to content

기획서: prego-saas-app 이벤트 → Docker 이미지 빌드 단계

목적: prego-saas-app 레포에서 발생한 이벤트가 prego-docker 레포의 GitHub Actions를 트리거하고, 해당 시점의 custom app(커밋)을 반영해 Docker 이미지가 빌드·푸시되는 전 과정을 단계별로 정리한다.
코드 생성 없음 — 흐름·역할·입출력·Secrets·전제만 명세.

현재 구현과의 차이: 본 문서는 app_sha 기반 동적 apps.json 설계(원안)를 기술한다. 현재 prego-docker커밋된 apps.json에 prego-saas-app 태그(예: v1.0.0)를 두고, dispatch 시 동적 생성 없이 해당 파일을 Base64로 전달한다. prego-saas-app 쪽에서 새 버전 배포 시 태그를 push한 뒤, prego-docker의 apps.json에서 해당 태그로 수정·커밋하거나, dispatch는 이미지 태그(예: pregoapp-<sha>)만 전달하는 역할. 상세: prego-docker-implementation-plan.md §4·§5.


1. 전체 흐름 요약

[prego-saas-app] [GitHub] [prego-docker]
│ │ │
│ push/tag 발생 │ │
│ (main, staging, develop, v*.*.*) │ │
├──────────────────────────────────► │
│ 워크플로 실행 │ │
│ (notify-image-rebuild) │ │
│ │ repository_dispatch │
│ POST /repos/.../dispatches │ event_type: custom_app_updated │
│ client_payload: { app_sha, tag } ├────────────────────────────────►│
│ │ │
│ │ build-and-push 워크플로 실행 │
│ │ • app_sha로 apps.json에 │
│ │ prego-saas-app 브랜치 고정 │
│ │ • Dockerfile 빌드(APPS_JSON) │
│ │ • (필요 시) clone_token으로 │
│ │ private 레포 clone │
│ │ • 이미지 푸시 (태그·digest) │
│ │ │
  • 이벤트 발생처: prego-saas-app 레포의 push 또는 tag.
  • 연결 고리: GitHub repository_dispatch API — prego-saas-app 워크플로가 prego-docker 레포로 “custom_app_updated” 이벤트를 보냄.
  • 이미지 빌드처: prego-docker 레포의 GitHub Actions가 해당 이벤트를 받아, payload에 담긴 app_sha(커밋) 로 custom app 버전을 고정한 뒤 Docker 이미지를 빌드·푸시.

2. 단계별 상세

2.1 단계 1: prego-saas-app에서 이벤트 발생

항목내용
트리거prego-saas-app 레포에 대한 push 또는 tag push.
대상 브랜치/태그기획 상 main, staging, develop 브랜치 push, 또는 v..*** 형식의 태그 push. (구현 시 워크플로 on.push / on.tags 에 정의.)
의미“custom app(prego-saas-app) 코드가 이 시점으로 갱신되었으니, 이 커밋을 포함한 런타임 이미지를 만들어라”는 신호.
  • 선택 정책: 특정 브랜치만 이미지화하거나, 태그만 이미지화하도록 트리거를 줄일 수 있음. 기획 기본값은 main/staging/develop + 태그.

2.2 단계 2: prego-saas-app 워크플로 실행 (dispatch 전송)

항목내용
실행 위치prego-saas-app 레포의 GitHub Actions.
워크플로 역할위 push/tag 이벤트를 받아 prego-docker 레포repository_dispatch API를 한 번 호출.
APIPOST https://api.github.com/repos/{owner}/{repo}/dispatches (대상: Pregoi/prego-docker).
필수 인증GitHub Personal Access Token(PAT). prego-saas-app 레포 Secrets에 저장(예: PREGODOCKER_DISPATCH_PAT). prego-docker 레포에 대한 repo 권한 필요(public 레포여도 dispatch 호출을 위해 권한 권장).
payload 설계event_type: custom_app_updated (prego-docker 워크플로가 수신하는 타입). client_payload: (1) app_sha: 이번 push/tag의 커밋 SHA(전체 또는 7자). (2) tag: 이미지에 붙일 태그(예: 태그 push면 v1.2.3, 브랜치 push면 pregoapp-{sha7}).
  • 결과: prego-docker 레포에 “custom_app_updated” 이벤트가 전달되고, client_payload에 app_sha와 tag가 전달됨.

2.3 단계 3: prego-docker에서 repository_dispatch 수신

항목내용
트리거prego-docker 레포의 워크플로가 on.repository_dispatch, types: [custom_app_updated] 로 수신.
입력github.event.client_payload.app_sha, github.event.client_payload.tag.
의미“이제 이 app_sha(커밋)를 사용해 custom app을 포함한 이미지를 빌드한다.”
  • prego-docker 쪽에서는 push/tag가 아니라 “다른 레포에서 보낸 dispatch”이므로, 빌드 시 사용할 앱 목록을 레포 기본 apps.json이 아니라, app_sha를 반영한 목록으로 만들어야 함.

2.4 단계 4: custom app 버전 고정(apps.json 생성)

항목내용
목적Dockerfile이 bench init 시 사용할 apps.json에 prego-saas-app을 특정 커밋(app_sha) 으로 고정.
방식repository_dispatch 분기에서만: (1) client_payload.app_sha 로 prego-saas-app 항목을 branch: "${APP_SHA}" 형태로 설정. (Git에서 branch 필드에 commit SHA를 지정하면 해당 커밋을 checkout함.) (2) ERPNext·HRMS는 고정 브랜치(예: version-15) 유지. (3) 이 내용을 apps.json으로 저장한 뒤, Base64 등으로 인코딩해 Docker 빌드 인자(예: APPS_JSON_BASE64)로 전달.
일반 push 시prego-docker 자체 push/tag 시에는 레포에 있는 기본 apps.json을 그대로 Base64 인코딩해 빌드 인자로 넘김. (prego-saas-app은 기본 apps.json에 branch: main 등으로 정의.)
  • 정리: “이벤트로 custom app을 가져간다”는 것은 dispatch 시점에 app_sha로 apps.json을 동적 생성하고, 그 내용을 Docker 빌드에 넘겨 해당 커밋의 prego-saas-app만 이미지에 포함시키는 것이다.

2.5 단계 5: Docker 빌드에서 custom app 반영

항목내용
Dockerfilefrappe_docker custom 패턴: APPS_JSON_BASE64(또는 동일 역할 인자)를 받아 /opt/frappe/apps.json 등으로 복원한 뒤, bench init 시 이 경로를 사용해 앱 설치(ERPNext, HRMS, prego-saas-app).
clone 시점빌드 중 bench initbench get-app 등이 prego-saas-app 레포를 clone. 이때 apps.json에 넣은 branch(SHA) 로 checkout 되므로, 이벤트가 발생한 그 커밋이 이미지에 들어감.
Private 레포prego-saas-app이 private이면 clone 시 인증 필요. prego-docker 레포 Secrets에 clone용 토큰(예: PREGO_SAAS_APP_CLONE_TOKEN)을 두고, Dockerfile에서 URL을 https://<token>@github.com/... 형태로 치환하거나, build secret으로 전달. (기획: build secret 사용 시 Dockerfile은 RUN --mount=type=secret,id=clone_token 등으로 받아 URL만 치환.)
Public 레포clone 토큰 없이 그대로 clone 가능.
  • 결과: 빌드된 이미지 안에는 이벤트 발생 시점의 prego-saas-app 코드가 포함됨.

2.6 단계 6: 이미지 태그·푸시·digest 출력

항목내용
태그client_payload.tag 사용(예: pregoapp-abc1234, v1.2.3). 추가로 latest 등 고정 태그 병행 가능.
푸시Docker Hub 등 레지스트리에 푸시. (prego-docker Secrets: DOCKERHUB_USERNAME, DOCKERHUB_TOKEN.)
digest빌드 결과 이미지 digest를 워크플로 출력으로 남겨, 운영·승격(Staging→Production) 시 digest 고정 배포에 사용.

3. 역할·Secret 정리

구분레포역할Secret(예시)
이벤트 발생prego-saas-apppush/tag 시 repository_dispatch 전송PREGODOCKER_DISPATCH_PAT (prego-docker에 dispatch 보낼 PAT)
이미지 빌드prego-dockerdispatch 수신, apps.json 생성, Docker 빌드·푸시DOCKERHUB_USERNAME, DOCKERHUB_TOKEN; (선택) PREGO_SAAS_APP_CLONE_TOKEN(prego-saas-app private 시)
  • 데이터 흐름: prego-saas-app은 “언제(어떤 커밋으로) 빌드할지”만 보냄(app_sha, tag). prego-docker가 그 값을 받아 자기 레포의 Dockerfile·apps.json 생성 로직으로 이미지를 만든다.

4. 전제 조건

전제설명
prego-docker 워크플로on.repository_dispatch.typescustom_app_updated 정의. dispatch 수신 시 app_sha로 apps.json 생성·APPS_JSON_BASE64 설정.
prego-saas-app 워크플로push/tag 시 한 번 prego-docker로 repository_dispatch 호출. PAT는 Secret으로만 노출.
DockerfileAPPS_JSON_BASE64(또는 동일 목적 인자)를 받아 앱 목록을 복원하고, bench init 시 해당 목록 사용. Private clone 시 build secret으로 토큰 전달·URL 치환.
네트워크GitHub Actions에서 GitHub API(repository_dispatch), Docker Hub API(push), 그리고 (필요 시) prego-saas-app private clone 접근 가능.

5. 구현 시 체크리스트 (참고)

  • prego-saas-app: push/tag 트리거 워크플로 추가; repository_dispatch 호출 시 event_type, client_payload(app_sha, tag) 명세 반영.
  • prego-saas-app: PREGODOCKER_DISPATCH_PAT Secret 등록.
  • prego-docker: on.repository_dispatch types: [custom_app_updated] 수신; app_sha로 apps.json 생성 후 APPS_JSON_BASE64 설정.
  • prego-docker: Dockerfile에서 APPS_JSON_BASE64 → apps.json 복원 후 bench init 사용.
  • prego-saas-app이 private인 경우: prego-docker에 PREGO_SAAS_APP_CLONE_TOKEN 및 Dockerfile/build에서 clone URL 인증 처리.
  • 태그 전략: 브랜치 push 시 pregoapp-{sha7}, 태그 push 시 v*.. 등 정책 확정 후 워크플로·문서 반영.

6. 연관 문서

문서연계 내용
prego-docker-implementation-plan.mdprego-docker 파일 트리, Dockerfile, build.yml, commit pin·태그 정책.
prego-saas-app-trigger-prego-docker.mdPAT 발급·Secret 등록·워크플로 복사 등 설정 절차.
prego-docker-image-deploy.md빌드 결과 이미지의 배포·digest 고정·Blue/Green.

다음 단계: 이 기획서를 기준으로, 필요 시 prego-saas-app 쪽 “이벤트 발생·dispatch” 워크플로와 prego-docker 쪽 “dispatch 수신·apps.json 생성·빌드” 단계를 구현·검증한다. 코드는 별도 구현 단계에서 생성.

Help