# ๐Ÿ”„ Upstream ่‡ชๅ‹•ๅŒๆญฅๆฉŸๅˆถ ๆœฌๅฐˆๆกˆๅฏฆไฝœไบ†ๅฎŒๆ•ด็š„ upstream ่‡ชๅ‹•ๅŒๆญฅใ€่ฎŠๆ›ด่ฟฝ่นค่ˆ‡ smoke test ๆฉŸๅˆถใ€‚ ## ๐Ÿ“‹ ็›ฎ้Œ„ - [ๅŠŸ่ƒฝๆฆ‚่ฟฐ](#ๅŠŸ่ƒฝๆฆ‚่ฟฐ) - [ๅทฅไฝœๆต็จ‹ๅœ–](#ๅทฅไฝœๆต็จ‹ๅœ–) - [Workflow ่ชชๆ˜Ž](#workflow-่ชชๆ˜Ž) - [Smoke Test ๅ…งๅฎน](#smoke-test-ๅ…งๅฎน) - [่จญๅฎš่ชชๆ˜Ž](#่จญๅฎš่ชชๆ˜Ž) - [ๆ‰‹ๅ‹•ๆ“ไฝœ](#ๆ‰‹ๅ‹•ๆ“ไฝœ) --- ## ๅŠŸ่ƒฝๆฆ‚่ฟฐ ### 1๏ธโƒฃ ่‡ชๅ‹•ๅŒๆญฅ Upstream | ๅŠŸ่ƒฝ | ่ชชๆ˜Ž | | ---------- | ---------------------------- | | ่งธ็™ผๆ–นๅผ | ๆฏ 6 ๅฐๆ™‚่‡ชๅ‹•ๆชขๆŸฅ / ๆ‰‹ๅ‹•่งธ็™ผ | | ๅŒๆญฅ็›ฎๆจ™ | `dev` ๅˆ†ๆ”ฏ | | Merge ็ญ–็•ฅ | ่‡ชๅ‹• merge๏ผˆ็„ก่ก็ชๆ™‚๏ผ‰ | | ่ก็ช่™•็† | ่‡ชๅ‹•ๅปบ็ซ‹ GitHub Issue ้€š็Ÿฅ | ### 2๏ธโƒฃ ่ฎŠๆ›ดๆ‘˜่ฆ ๅŒๆญฅๅฎŒๆˆๅพŒ่‡ชๅ‹•็”ข็”Ÿ๏ผš - โœ… GitHub Issue๏ผˆ่ฉณ็ดฐ่ฎŠๆ›ด่จ˜้Œ„๏ผ‰ - โœ… `upstream-changelog.md`๏ผˆ็ดฏ็ฉ่ฎŠๆ›ดๆญทๅฒ๏ผ‰ - โœ… GitHub Actions Summary๏ผˆๅฟซ้€ŸๆŸฅ็œ‹๏ผ‰ ### 3๏ธโƒฃ Smoke Test | ๆธฌ่ฉฆ้ …็›ฎ | ๅ…งๅฎน | ๆ™‚้–“้™ๅˆถ | | -------------- | -------------------------------------- | ------------- | | Container ๅ•Ÿๅ‹• | ้ฉ—่ญ‰ image ๅฏๆญฃๅธธๅ•Ÿๅ‹• | 60s | | ๅทฅๅ…ทๆชขๆŸฅ | libreoffice, pandoc, ffmpeg, tesseract | 30s | | ๆœ€ๅฐ่ฝ‰ๆ› | txt โ†’ pdf | 60s | | API ็ซฏ้ปž | healthcheck, root | 10s | | **็ธฝ่จˆ** | | **< 10 ๅˆ†้˜** | --- ## ๅทฅไฝœๆต็จ‹ๅœ– ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Upstream ่‡ชๅ‹•ๅŒๆญฅๆต็จ‹ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Upstream โ”‚ โ”‚ (C4illin/ โ”‚ โ”‚ ConvertX) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ ๆฏ 6 ๅฐๆ™‚ๆชขๆŸฅ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” ็„กๆ›ดๆ–ฐ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๆชขๆŸฅๆ˜ฏๅฆๆœ‰ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚ ็ตๆŸ โ”‚ โ”‚ ๆ–ฐ commits โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ ๆœ‰ๆ›ดๆ–ฐ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” ่ก็ช โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ่‡ชๅ‹• Merge โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚ ๅปบ็ซ‹ Issue โ”‚ โ”‚ ๅˆฐ dev ๅˆ†ๆ”ฏ โ”‚ โ”‚ ้œ€ๆ‰‹ๅ‹•่™•็† โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ ๆˆๅŠŸ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ็”ข็”Ÿ่ฎŠๆ›ดๆ‘˜่ฆ โ”‚ โ”‚ โ€ข Issue โ”‚ โ”‚ โ€ข Changelog โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Push ๅˆฐ dev โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ ่งธ็™ผ upstream-sync.yml โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Build ๆธฌ่ฉฆ โ”‚ โ”‚ Image (amd64)โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Smoke Test โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Container โ”‚ โ”‚ ๅทฅๅ…ท โ”‚ โ”‚ ่ฝ‰ๆ› โ”‚ โ”‚ โ”‚ โ”‚ ๅ•Ÿๅ‹• โ”‚ โ”‚ ๆชขๆŸฅ โ”‚ โ”‚ ๆธฌ่ฉฆ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ–ผ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โœ… ้€š้Ž โ”‚ โ”‚ โŒ ๅคฑๆ•— โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ–ผ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Build ไธฆ โ”‚ โ”‚ Workflow โ”‚ โ”‚ Push ๅˆฐ โ”‚ โ”‚ ๅคฑๆ•— โ”‚ โ”‚ Docker Hub โ”‚ โ”‚ (ไธ็™ผๅธƒ) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ upstream-YYYYMMDD tag โ”‚ โ”‚ โŒ ไธๆ›ดๆ–ฐ latest โ”‚ โ”‚ โŒ ไธๆ‰“ semver tag โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## Workflow ่ชชๆ˜Ž ### `auto-upstream-sync.yml` **็”จ้€”๏ผš** ่‡ชๅ‹•ๆชขๆธฌไธฆๅŒๆญฅ upstream ๆ›ดๆ–ฐ **่งธ็™ผๆขไปถ๏ผš** - โฐ ๆฏ 6 ๅฐๆ™‚่‡ชๅ‹•ๅŸท่กŒ - ๐Ÿ–ฑ๏ธ ๆ‰‹ๅ‹•่งธ็™ผ **ไธป่ฆๆญฅ้ฉŸ๏ผš** 1. Fetch upstream ๆœ€ๆ–ฐ็จ‹ๅผ็ขผ 2. ๆชขๆŸฅๆ˜ฏๅฆๆœ‰ๆ–ฐ commits 3. ่‡ชๅ‹• merge ๅˆฐ `dev` ๅˆ†ๆ”ฏ 4. ็”ข็”Ÿ่ฎŠๆ›ดๆ‘˜่ฆ๏ผˆIssue + Changelog๏ผ‰ 5. Push ๅˆฐ `dev` ### `upstream-sync.yml` **็”จ้€”๏ผš** ็•ถ `dev` ๅˆ†ๆ”ฏๆœ‰ push ๆ™‚๏ผŒๅŸท่กŒ build + smoke test **่งธ็™ผๆขไปถ๏ผš** - ๐Ÿ“ฆ `dev` ๅˆ†ๆ”ฏๆœ‰ push **ไธป่ฆๆญฅ้ฉŸ๏ผš** 1. Build ๆธฌ่ฉฆ็”จ image๏ผˆๅƒ… amd64๏ผŒๅŠ ้€Ÿๆธฌ่ฉฆ๏ผ‰ 2. ๅŸท่กŒ Smoke Test๏ผˆ10 ๅˆ†้˜ๅ…ง๏ผ‰ 3. ๆธฌ่ฉฆ้€š้ŽๅพŒ build multi-arch image 4. Push ๅˆฐ Docker Hub๏ผˆtag: `upstream-YYYYMMDD`๏ผ‰ --- ## Smoke Test ๅ…งๅฎน ### Test 1: Container ๅ•Ÿๅ‹•ๆธฌ่ฉฆ ```bash # ๅ•Ÿๅ‹• container ไธฆ็ญ‰ๅพ… healthcheck ๅ›žๆ‡‰ docker run -d --name convertx-test $IMAGE curl http://localhost:3000/healthcheck ``` ### Test 2: ้—œ้ตๅทฅๅ…ทๆชขๆŸฅ ```bash # ๅฟ…้ ˆ้€š้Ž๏ผˆไปปไธ€ๅคฑๆ•—ๅ‰‡ๆ•ด้ซ”ๅคฑๆ•—๏ผ‰ libreoffice --version pandoc --version ffmpeg -version tesseract --version ``` ### Test 3: ๆœ€ๅฐ่ฝ‰ๆ›ๆธฌ่ฉฆ ```bash # txt โ†’ pdf ่ฝ‰ๆ›ๆธฌ่ฉฆ echo "test" > test.txt libreoffice --headless --convert-to pdf test.txt ``` ### Test 4: API ็ซฏ้ปžๆชขๆŸฅ ```bash # ็ขบ่ชๆœๅ‹™ๆญฃๅธธ้‹ไฝœ curl http://localhost:3000/healthcheck curl http://localhost:3000/ ``` --- ## ่จญๅฎš่ชชๆ˜Ž ### ๅฟ…่ฆ็š„ GitHub Secrets ๅœจ Repository Settings โ†’ Secrets and variables โ†’ Actions ไธญ่จญๅฎš๏ผš | Secret ๅ็จฑ | ่ชชๆ˜Ž | | -------------------- | ----------------------- | | `DOCKERHUB_USERNAME` | Docker Hub ๅธณ่™Ÿ | | `DOCKERHUB_TOKEN` | Docker Hub Access Token | ### ๅˆ†ๆ”ฏไฟ่ญท่ฆๅ‰‡ ๅปบ่ญฐ่จญๅฎš๏ผš **`main` ๅˆ†ๆ”ฏ๏ผš** - โœ… Require pull request before merging - โœ… Require status checks to pass - โŒ Allow force pushes **`dev` ๅˆ†ๆ”ฏ๏ผš** - โœ… Allow direct pushes (for automation) --- ## ๆ‰‹ๅ‹•ๆ“ไฝœ ### ๆ‰‹ๅ‹•่งธ็™ผๅŒๆญฅ 1. ๅ‰ๅพ€ Actions โ†’ Auto Upstream Sync 2. ้ปž้ธ "Run workflow" 3. ๅฏ้ธๆ“‡ใ€ŒๅผทๅˆถๅŒๆญฅใ€ ### ๆ‰‹ๅ‹•่™•็† Merge ่ก็ช ็•ถ่‡ชๅ‹•ๅŒๆญฅ็™ผ็”Ÿ่ก็ชๆ™‚๏ผš ```bash # 1. ๅˆ‡ๆ›ๅˆฐ dev ๅˆ†ๆ”ฏ git checkout dev # 2. ๆทปๅŠ  upstream remote๏ผˆๅฆ‚ๆžœ้‚„ๆฒ’ๆœ‰๏ผ‰ git remote add upstream https://github.com/C4illin/ConvertX.git # 3. Fetch upstream git fetch upstream main # 4. Merge upstream git merge upstream/main # 5. ่งฃๆฑบ่ก็ช # ... ็ทจ่ผฏ่ก็ช็š„ๆช”ๆกˆ ... # 6. ๆไบคไธฆ push git add . git commit -m "Resolve merge conflicts with upstream" git push origin dev ``` --- ## โš ๏ธ ๆณจๆ„ไบ‹้ … 1. **ไธๆœƒ่‡ชๅ‹•ๆ›ดๆ–ฐ `latest` tag** - ้œ€่ฆๆ‰‹ๅ‹•็™ผๅธƒๆญฃๅผ็‰ˆๆœฌ 2. **ไธๆœƒ่‡ชๅ‹•ๆ‰“ semver tag** - ้œ€่ฆๆ‰‹ๅ‹•ๅปบ็ซ‹ release 3. **`main` ๅˆ†ๆ”ฏไธๆœƒ่ขซ่‡ชๅ‹•ไฟฎๆ”น** - ๅชๆœ‰ `dev` ๆœƒ่‡ชๅ‹•ๅŒๆญฅ 4. **Smoke test ๅคฑๆ•—ๆ™‚ไธๆœƒ็™ผๅธƒ image** - ็ขบไฟๅ“่ณช --- ## ๐Ÿ“Š Docker Image Tag ่ฆๅ‰‡ | Tag ๆ ผๅผ | ่ชชๆ˜Ž | ่‡ชๅ‹•/ๆ‰‹ๅ‹• | | ------------------- | ---------------------------------- | --------- | | `upstream-YYYYMMDD` | Upstream ๅŒๆญฅ็‰ˆ๏ผˆ็ถ“้Ž smoke test๏ผ‰ | ่‡ชๅ‹• | | `vX.Y.Z` | ๆญฃๅผ็‰ˆๆœฌ | ๆ‰‹ๅ‹• | | `latest` | ๆœ€ๆ–ฐ็ฉฉๅฎš็‰ˆ | ๆ‰‹ๅ‹• |