공개: KoTalk 최신 기준선
This commit is contained in:
commit
debf62f76e
572 changed files with 41689 additions and 0 deletions
39
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
39
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: 버그나 회귀를 기록합니다
|
||||
title: "[bug] "
|
||||
labels: bug
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
## 요약
|
||||
|
||||
문제를 한 문장으로 적어 주세요.
|
||||
|
||||
## 재현 절차
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
## 기대 결과
|
||||
|
||||
원래 기대한 동작을 적어 주세요.
|
||||
|
||||
## 실제 결과
|
||||
|
||||
실제 나타난 동작을 적어 주세요.
|
||||
|
||||
## 관련 문서 / 스크린샷
|
||||
|
||||
상태 문서, README, 스크린샷, 릴리즈 링크가 있으면 같이 적어 주세요.
|
||||
|
||||
## 환경
|
||||
|
||||
- OS:
|
||||
- 앱 버전:
|
||||
- 빌드 경로:
|
||||
|
||||
## 추가 정보
|
||||
|
||||
스크린샷, 로그, 관련 문서를 적어 주세요.
|
||||
14
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
14
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Live web
|
||||
url: https://vstalk.phy.kr
|
||||
about: 현재 공개 중인 모바일 웹 진입점을 직접 확인할 수 있습니다.
|
||||
- name: Download mirror
|
||||
url: https://download-vstalk.phy.kr
|
||||
about: 공식 다운로드 미러 주소입니다.
|
||||
- name: Release channels
|
||||
url: https://github.com/werther24601/kotalk/releases
|
||||
about: 공개 저장소 릴리즈 경로를 확인할 수 있습니다.
|
||||
- name: Security contact
|
||||
url: mailto:ian@physia.kr
|
||||
about: 보안 이슈는 공개 이슈 대신 메일로 먼저 알려 주세요.
|
||||
35
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
35
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
name: Feature request
|
||||
about: 기능 제안이나 개선안을 기록합니다
|
||||
title: "[feature] "
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
## 배경
|
||||
|
||||
왜 필요한지 적어 주세요.
|
||||
|
||||
## 제안
|
||||
|
||||
원하는 동작을 구체적으로 적어 주세요.
|
||||
|
||||
## 기대 효과
|
||||
|
||||
누가 어떤 점에서 더 편해지는지 적어 주세요.
|
||||
|
||||
## 영향 채널
|
||||
|
||||
- Windows
|
||||
- Mobile Web
|
||||
- Android
|
||||
- Release / Deploy
|
||||
- Docs
|
||||
|
||||
## 현재 한계와의 관계
|
||||
|
||||
`PROJECT_STATUS.md`, `ROADMAP.md`, `문서/` 중 관련 항목이 있으면 적어 주세요.
|
||||
|
||||
## 관련 문서
|
||||
|
||||
관련된 `문서/` 파일이 있으면 링크해 주세요.
|
||||
34
.github/ISSUE_TEMPLATE/ux_review.md
vendored
Normal file
34
.github/ISSUE_TEMPLATE/ux_review.md
vendored
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
---
|
||||
name: UX review
|
||||
about: 사용 흐름, 정보구조, 문구, 피로도 관점의 리뷰를 남깁니다
|
||||
title: "[ux] "
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
## 어떤 흐름인가요
|
||||
|
||||
- 온보딩 / 가입
|
||||
- 대화 목록
|
||||
- 검색 / 재탐색
|
||||
- 대화 / 답장
|
||||
- 세션 복구
|
||||
- 릴리즈 / 다운로드
|
||||
|
||||
## 현재 불편한 점
|
||||
|
||||
사용자 입장에서 어떤 지점이 막히거나 피로한지 적어 주세요.
|
||||
|
||||
## 기대하는 방향
|
||||
|
||||
더 간편해지기 위해 어떤 변화가 필요하다고 보는지 적어 주세요.
|
||||
|
||||
## 영향 채널
|
||||
|
||||
- Windows
|
||||
- Mobile Web
|
||||
- Android
|
||||
|
||||
## 관련 근거
|
||||
|
||||
스크린샷, 영상, 문서 링크, 실제 사용 사례가 있으면 같이 남겨 주세요.
|
||||
17
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
17
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
## Summary
|
||||
|
||||
- 무엇을 바꿨는지
|
||||
- 왜 바꿨는지
|
||||
|
||||
## Scope
|
||||
|
||||
- 영향 채널: Windows / Mobile Web / Android / Release / Docs
|
||||
- 관련 문서:
|
||||
- UI 변경 시 스크린샷:
|
||||
|
||||
## Checklist
|
||||
|
||||
- [ ] README 또는 `문서/` 반영 여부 확인
|
||||
- [ ] CHANGELOG 반영 여부 확인
|
||||
- [ ] 가입/보안/릴리즈 정책 영향 확인
|
||||
- [ ] 다운로드 경로 영향 확인 (`download-vstalk.phy.kr`)
|
||||
52
.github/workflows/ci.yml
vendored
Normal file
52
.github/workflows/ci.yml
vendored
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
name: ci
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- feat/**
|
||||
- release/**
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
server:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
global-json-file: global.json
|
||||
|
||||
- name: Restore
|
||||
run: dotnet restore PhysOn.sln
|
||||
|
||||
- name: Build API
|
||||
run: dotnet build src/PhysOn.Api/PhysOn.Api.csproj -c Release --no-restore
|
||||
|
||||
- name: Build Worker
|
||||
run: dotnet build src/PhysOn.Worker/PhysOn.Worker.csproj -c Release --no-restore
|
||||
|
||||
- name: Run API integration tests
|
||||
run: dotnet test tests/PhysOn.Api.IntegrationTests/PhysOn.Api.IntegrationTests.csproj -c Release --no-restore
|
||||
|
||||
desktop-windows:
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
global-json-file: global.json
|
||||
|
||||
- name: Restore desktop project
|
||||
run: dotnet restore src/PhysOn.Desktop/PhysOn.Desktop.csproj
|
||||
|
||||
- name: Build desktop project
|
||||
run: dotnet build src/PhysOn.Desktop/PhysOn.Desktop.csproj -c Release --no-restore
|
||||
231
.github/workflows/release-portable.yml
vendored
Normal file
231
.github/workflows/release-portable.yml
vendored
Normal file
|
|
@ -0,0 +1,231 @@
|
|||
name: release-clients
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "v*"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: "릴리즈 버전. 예: v0.1.0-alpha.1"
|
||||
required: true
|
||||
type: string
|
||||
channel:
|
||||
description: "릴리즈 채널"
|
||||
required: true
|
||||
default: alpha
|
||||
type: choice
|
||||
options:
|
||||
- alpha
|
||||
- beta
|
||||
- rc
|
||||
- stable
|
||||
upload_to_vps:
|
||||
description: "준비된 릴리즈 번들을 VPS 다운로드 호스트로 업로드"
|
||||
required: true
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
global-json-file: global.json
|
||||
|
||||
- name: Restore desktop project
|
||||
run: dotnet restore src/VsMessenger.Desktop/VsMessenger.Desktop.csproj
|
||||
|
||||
- name: Publish portable desktop build
|
||||
run: dotnet publish src/VsMessenger.Desktop/VsMessenger.Desktop.csproj -c Release -r win-x64 --self-contained true -o out/win-x64
|
||||
|
||||
- name: Create portable ZIP
|
||||
shell: pwsh
|
||||
run: Compress-Archive -Path out/win-x64/* -DestinationPath out/VsMessenger-win-x64.zip
|
||||
|
||||
- name: Upload Windows artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: windows-portable
|
||||
path: out/VsMessenger-win-x64.zip
|
||||
|
||||
build-android:
|
||||
if: ${{ hashFiles('src/VsMessenger.Mobile.Android/*.csproj') != '' }}
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: "17"
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
global-json-file: global.json
|
||||
|
||||
- name: Install Android workload
|
||||
run: dotnet workload install android
|
||||
|
||||
- name: Restore Android project
|
||||
run: dotnet restore src/VsMessenger.Mobile.Android/VsMessenger.Mobile.Android.csproj
|
||||
|
||||
- name: Publish Android APK
|
||||
run: |
|
||||
dotnet publish src/VsMessenger.Mobile.Android/VsMessenger.Mobile.Android.csproj \
|
||||
-c Release \
|
||||
-f net8.0-android \
|
||||
-p:AndroidPackageFormat=apk \
|
||||
-p:AndroidKeyStore=false \
|
||||
-o out/android
|
||||
|
||||
- name: Collect Android artifact
|
||||
run: |
|
||||
apk_path="$(find out/android -type f -name '*.apk' | head -n 1)"
|
||||
test -n "$apk_path"
|
||||
cp "$apk_path" out/VsMessenger-android-universal.apk
|
||||
|
||||
- name: Upload Android artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: android-apk
|
||||
path: out/VsMessenger-android-universal.apk
|
||||
|
||||
assemble-release:
|
||||
if: ${{ always() && needs.build-windows.result == 'success' && (needs.build-android.result == 'success' || needs.build-android.result == 'skipped') }}
|
||||
needs:
|
||||
- build-windows
|
||||
- build-android
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download Windows artifact
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: windows-portable
|
||||
path: incoming/windows
|
||||
|
||||
- name: Download Android artifact
|
||||
continue-on-error: true
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: android-apk
|
||||
path: incoming/android
|
||||
|
||||
- name: Prepare release bundle
|
||||
env:
|
||||
VERSION_INPUT: ${{ github.event_name == 'workflow_dispatch' && inputs.version || github.ref_name }}
|
||||
CHANNEL_INPUT: ${{ github.event_name == 'workflow_dispatch' && inputs.channel || '' }}
|
||||
run: |
|
||||
chmod +x scripts/release/release-prepare-assets.sh
|
||||
|
||||
channel="${CHANNEL_INPUT}"
|
||||
if [[ -z "$channel" ]]; then
|
||||
case "$VERSION_INPUT" in
|
||||
*alpha*) channel="alpha" ;;
|
||||
*beta*) channel="beta" ;;
|
||||
*rc*) channel="rc" ;;
|
||||
*) channel="stable" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
prepare_args=(
|
||||
--version "$VERSION_INPUT"
|
||||
--channel "$channel"
|
||||
--windows-zip incoming/windows/VsMessenger-win-x64.zip
|
||||
--force
|
||||
)
|
||||
|
||||
if [[ -f incoming/android/VsMessenger-android-universal.apk ]]; then
|
||||
prepare_args+=(--android-apk incoming/android/VsMessenger-android-universal.apk)
|
||||
fi
|
||||
|
||||
./scripts/release/release-prepare-assets.sh \
|
||||
"${prepare_args[@]}"
|
||||
|
||||
- name: Upload release bundle
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: release-bundle
|
||||
path: release-assets
|
||||
|
||||
publish-forge-release:
|
||||
if: ${{ secrets.FORGE_RELEASE_TOKEN != '' }}
|
||||
needs: assemble-release
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download release bundle
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: release-bundle
|
||||
path: .
|
||||
|
||||
- name: Publish release to forge
|
||||
env:
|
||||
VERSION_INPUT: ${{ github.event_name == 'workflow_dispatch' && inputs.version || github.ref_name }}
|
||||
FORGE_RELEASE_TOKEN: ${{ secrets.FORGE_RELEASE_TOKEN }}
|
||||
run: |
|
||||
chmod +x scripts/release/release-publish-forge.sh
|
||||
./scripts/release/release-publish-forge.sh --version "$VERSION_INPUT"
|
||||
|
||||
upload-to-vps:
|
||||
if: github.event_name == 'workflow_dispatch' && inputs.upload_to_vps
|
||||
needs: assemble-release
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download release bundle
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: release-bundle
|
||||
path: .
|
||||
|
||||
- name: Configure SSH key
|
||||
env:
|
||||
DOWNLOAD_SSH_KEY: ${{ secrets.DOWNLOAD_SSH_KEY }}
|
||||
run: |
|
||||
test -n "$DOWNLOAD_SSH_KEY"
|
||||
install -d -m 700 ~/.ssh
|
||||
printf '%s\n' "$DOWNLOAD_SSH_KEY" > ~/.ssh/download_host
|
||||
chmod 600 ~/.ssh/download_host
|
||||
|
||||
- name: Upload bundle to download host
|
||||
env:
|
||||
VERSION_INPUT: ${{ inputs.version }}
|
||||
DOWNLOAD_SSH_HOST: ${{ secrets.DOWNLOAD_SSH_HOST }}
|
||||
DOWNLOAD_SSH_USER: ${{ secrets.DOWNLOAD_SSH_USER }}
|
||||
DOWNLOAD_ROOT: ${{ secrets.DOWNLOAD_ROOT }}
|
||||
run: |
|
||||
test -n "$DOWNLOAD_SSH_HOST"
|
||||
test -n "$DOWNLOAD_SSH_USER"
|
||||
test -n "$DOWNLOAD_ROOT"
|
||||
chmod +x scripts/release/release-upload-assets.sh
|
||||
./scripts/release/release-upload-assets.sh \
|
||||
--version "$VERSION_INPUT" \
|
||||
--host "$DOWNLOAD_SSH_HOST" \
|
||||
--user "$DOWNLOAD_SSH_USER" \
|
||||
--target "$DOWNLOAD_ROOT" \
|
||||
--ssh-key ~/.ssh/download_host
|
||||
Loading…
Add table
Add a link
Reference in a new issue