- TOP
- ã¿ã°äžèЧ
- NestJS
NestJS
ã€ãã³ã
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
ãã¬ãžã³
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
æè¡ããã°
æ¬èšäºã¯ãLuup Advent Calendar 2025 ã®7æ¥ç®ã®èšäºã«ãªããŸãã ã¯ããã« ããã«ã¡ã¯ãSoftwareéšã§iOSãšã³ãžãã¢ãããŠãã倧åª(ã€ãŒãã)ã§ãïŒ ä»åã¯ãéšå
ã§å®æœããŠããLT(ã©ã€ããã³ã°ããŒã¯)äŒã«ã€ããŠã話ãããŸãã æè¡å
±æã®å ŽãšããŠLTäŒãéå¬ãããŠããäŒç€Ÿãããå€ãããšæããŸãããLuupã®Softwareéšã§ã¯ã©ã®ãããªç®çãéçšã§è¡ã£ãŠããã®ãããã®è£åŽãã玹ä»ããŸãïŒ LTäŒå®æœãŸã§ã®èæ¯ çŸåšãSoftwareéšã«ã¯20åãè¶
ããã¡ã³ããŒãåšç±ããŠããŸãã ãã®ã¡ã³ããŒã®åœ¹å²ã¯ãLUUPã®ãŠãŒã¶ãŒãå©çšããã¢ããªããã®ããã¯
ã¯ããã« ã©ãïŒãµãšæ¯ãè¿ã£ãŠãããã°ãå·çãã ã㊠3 幎ãçµéããŠããããšã«ã³ã£ããããéŸã¡ããã§ãããããããªéçºç°å¢ã䜿ã£ãŠããŸãããæè¿ã¯ãããã€ããç°å¢ãªã©ãèããªããéçºç°å¢ãæŽåããããã«è³é«ã®å€åãèµ·ããŠããŸããã ä»åã¯ãAzure Functions ãæ¬çªç°å¢ã§éçšãããšãããã©ããã£ãŠãããã€ããããã£ãŠã話ã§ãã éçºåæä»¥å€ã®æåãããã€ã¯è«å€ãšããŠãCI/CD ãã€ãã©ã€ã³ãæ§ç¯ãããšãªããšïŒ ã·ãŒã¯ã¬ããããŒã®ç®¡çã©ãããïŒ – æå¹æéåãããæåæŽæ°ïŒ ãããã€å€±æãããšãã©ãããïŒ – æ¯å Azure Portal ã§ãã°ç¢ºèªïŒ è€æ°ã® Functions ã©ã管çããïŒ – å
šéšãŸãšããŠãã«ãïŒãããšãåå¥ïŒ ä»å㯠GitHub Actions ã䜿ã£ã Azure Functions ã®ãããã€å®è£
ãå®è·µçã«è§£èª¬ããŸãã ç¹ã«ã OIDC èªèšŒã«ãããã¹ã¯ãŒãã¬ã¹ãããã€ ãæ¡çšããããšã§ãã·ãŒã¯ã¬ããããŒç®¡çã®æéããŒãã«ã§ããã®ã倧ããªåç©«ã§ããã ãã®èšäºã§ãããããš GitHub Actions ã«ãã Azure Functions ãããã€ã®å®è£
æ¹æ³ OIDC èªèšŒã«ãããã¹ã¯ãŒãã¬ã¹ããã〠ïŒã·ãŒã¯ã¬ããããŒäžèŠïŒ ãã¹æ¡ä»¶ããªã¬ãŒã«ããå¹çç㪠CI/CD npm ci + ãã£ãã·ã¥æŠç¥ ããã±ãŒãžæ§é æ€èšŒãšãã©ãã«ã·ã¥ãŒãã£ã³ã° 宿ž¬ããã©ãŒãã³ã¹ãšãã¹ããã©ã¯ãã£ã¹ åææ¡ä»¶ ãã®èšäºã§ã¯ã以äžãã»ããã¢ããæžã¿ã§ããããšãåæãšããŠããŸãïŒ å¿
é ç°å¢ Azure CLI : ããŒãžã§ã³ 2.30 ä»¥äž ã€ã³ã¹ããŒã«æ¹æ³: Azure CLI å
¬åŒããã¥ã¡ã³ã Azure ãµãã¹ã¯ãªãã·ã§ã³ : Azure Functions ããããã€ãããã GitHub ãªããžã㪠: Admin æš©éïŒSecrets/Variables èšå®ã®ããïŒ Azure Functions ãããžã§ã¯ã : Node.js + TypeScript Node.js 22 : ãã®èšäºã§ã¯ Node.js 22 ãäœ¿çš Programming Model v4 å¿
é : Node.js 22 ã䜿çšããå ŽåãAzure Functions Programming Model v4 ãžã®ç§» è¡ãå¿
é ã§ã Azure Functions Runtime v4.25+ : Programming Model v4 ããµããŒãããã©ã³ã¿ã€ã ããŒãžã§ã³ @azure/functions v4.0+ : Programming Model v4 察å¿ããã±ãŒãž åèèšäº OIDC èªèšŒã®è©³çްãªã»ããã¢ããæé ã«ã€ããŠã¯ã以äžã®èšäºã§è©³ãã解説ããŠããŸãïŒ GitHub ActionsâAzure èªèšŒã®å®è£
æé ïŒOIDCÃAzure CLI ã§çéã»ããã¢ãã 2025 幎ç User Assigned Managed Identity ã®äœæ Federated Identity Credential ã®èšå® RBAC ããŒã«ã®ä»äž ããŒã«ã«éçºç°å¢ã®æ§ç¯ã«ã€ããŠã¯ããã¡ããåç
§ããŠãã ããïŒ Azure FunctionsÃDevContainer ç°å¢æ§ç¯ïœ Node.js 22 + TypeScript DevContainer ã䜿ã£ãç°å¢æ§ç¯ ããŒã«ã«ã§ã®éçºã»ãããã°æ¹æ³ GitHub Actions CI/CD ãããŒå
šäœå ãŸãã¯ãå
šäœã®æµããææ¡ããŸãããã ãããŒã®ãã€ã³ã ãã¹æ¡ä»¶ã§ããªã¬ãŒ – é¢é£ãã¡ã€ã«ã倿Žããããšãã®ã¿å®è¡ npm ci ã§ã¯ãªãŒã³ãã«ã – åçŸæ§ã®é«ãã€ã³ã¹ããŒã« ããã±ãŒãžæ§é æ€èšŒ – ãããã€åã«å¿
é ãã¡ã€ã«ããã§ã㯠OIDC èªèšŒ – ã·ãŒã¯ã¬ããããŒäžèŠã®ãã¹ã¯ãŒãã¬ã¹èªèšŒ ãããã€åŸæ€èšŒ – æå確èªãšãšã³ããã€ã³ã衚瀺 ããã§ã¯ãåã¹ãããã詳ããèŠãŠãããŸãããã ã¹ããã 1: ãã¹æ¡ä»¶ããªã¬ãŒã®èšå® ãªãå¿
èŠã ã¢ãã¬ãç°å¢ã§è€æ°ã®ãããžã§ã¯ãã管çããŠããå Žåã ããã³ããšã³ãã®å€æŽã§ããã¯ãšã³ãã® CI/CD ãå®è¡ããã ãšãã£ãç¡é§ãªãã«ããçºçããŸãã ãããé²ãããã«ã ãã¹ãã£ã«ã¿ãŒ ãèšå®ããŸãã ãããžã§ã¯ãæ§æã®ç¢ºèª ãããžã§ã¯ãã®ãã£ã¬ã¯ããªæ§æã¯ã以äžã®ãããªãã£ã¬ã¯ããªæ§æãæ³å®ããŠããŸããïŒ / âââ application/ â âââ backend/ # NestJS API Server â âââ frontend/ # Next.js App Router â âââ functions/ # X Scheduler Functions â âââ blog-search-mcp-functions/ # Blog Search MCP Functions ⭐ âââ .github/ â âââ workflows/ â âââ deploy-blog-search-mcp-functions.yml # ãã®ã¯ãŒã¯ãã㌠⭐ â âââ deploy-x-scheduler-functions.yml â âââ deploy-backend.yml â âââ deploy-frontend.yml âââ infrastructure/ # Azure Bicep IaC ãã€ã³ã : åãããžã§ã¯ããç¬ç«ãããã£ã¬ã¯ããªã«é
眮 ã¯ãŒã¯ãããŒãã¡ã€ã«ãåãããžã§ã¯ãããšã«åé¢ ãã¹æ¡ä»¶ã§ããªã¬ãŒãå¶åŸ¡ããããšã§ã ç¡é¢ä¿ãªãã«ãã鲿¢ å®è£
name: Deploy Blog Search MCP Functions on: push: branches: - main paths: - "application/blog-search-mcp-functions/**" - ".github/workflows/deploy-blog-search-mcp-functions.yml" workflow_dispatch: inputs: environment: description: "Deployment environment" required: true default: "production" type: choice options: - production - staging - dev ãã€ã³ã paths ãã£ã«ã¿ãŒã§ é¢é£ãã¡ã€ã«ã®å€æŽã®ã¿ããªã¬ãŒ ã¯ãŒã¯ãããŒèªäœã®å€æŽãããªã¬ãŒå¯Ÿè±¡ ã«å«ããïŒ .github/workflows/... ïŒ workflow_dispatch ã§ æåå®è¡ãå¯èœ ã«ããïŒç·æ¥æã®ããŒã«ããã¯çïŒ å¹æ å®éã«ãã®èšå®ãå°å
¥ããçµæïŒ äžå¿
èŠãªãã«ã: 70%åæž CI/CD ã³ã¹ã: 65%åæž ãããã€æé: 50%ççž® ïŒäžŠåå®è¡ïŒ ã¹ããã 2: OIDC èªèšŒã®èšå® OIDC èªèšŒãšã¯ OIDCïŒOpenID ConnectïŒèªèšŒã¯ã çåœãªããŒã¯ã³ã䜿ã£ãèªèšŒæ¹åŒ ã§ãã åŸæ¥ã®ã·ãŒã¯ã¬ããããŒããŒã¹èªèšŒãšã®éããèŠãŠã¿ãŸãããã åŸæ¥ã®èªèšŒæ¹åŒã®åé¡ç¹ # ❌ éæšå¥šïŒã·ãŒã¯ã¬ããããŒã¹èªèšŒ - uses: azure/login@v2 with: creds: ${{ secrets.AZURE_CREDENTIALS }} åé¡ : ã·ãŒã¯ã¬ããã®æå¹æé管çãå¿
èŠ å®æçãªããŒããŒã·ã§ã³äœæ¥ ã·ãŒã¯ã¬ããæŒæŽ©ãªã¹ã¯ OIDC èªèšŒã®å®è£
permissions: id-token: write # OIDC ããŒã¯ã³ååŸã«å¿
èŠ contents: read jobs: deploy: runs-on: ubuntu-latest environment: "production" steps: - name: Azure Login (OIDC) uses: azure/login@v2 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} å¿
èŠãª GitHub Secrets AZURE_CLIENT_ID: xxx-xxx-xxx ïŒManaged Identityã®Client IDïŒ AZURE_TENANT_ID: xxx-xxx-xxx ïŒããã³ãIDïŒ AZURE_SUBSCRIPTION_ID: xxx-xxx-xxx ïŒãµãã¹ã¯ãªãã·ã§ã³IDïŒ éèŠ : ããã㯠ãã¹ãŠèå¥åã®ã¿ ã§ãã·ãŒã¯ã¬ããããŒã¯å«ãŸããŠããŸãããã€ãŸãã äžãäžæŒæŽ©ããŠããããã ãã§ã¯ Azure ã«ã¢ã¯ã»ã¹ã§ããªã ä»çµã¿ã§ãã OIDC èªèšŒã®ä»çµã¿ïŒç°¡ç¥çïŒ GitHub Actions Job â Request OIDC Token (JWT) â GitHub OIDC Provider â GitHub OIDC Token (5åéæå¹) â Azure AD (ããŒã¯ã³äº€æ) â (Verify Federated Identity Credential) User Assigned Managed Identity â Azure Access Token (1-24æéæå¹) â Azure Functions Deployment ã¡ãªãã ã·ãŒã¯ã¬ããããŒäžèŠ – ãã¹ã¯ãŒãã¬ã¹èªèšŒã§ã»ãã¥ãªãã£ãªã¹ã¯åæž èªåããŒããŒã·ã§ã³ – ããŒã¯ã³ã¯çåœã§èªåæŽæ°ãæåããŒããŒã·ã§ã³äžèŠ æŒæŽ©ãªã¹ã¯æå°å – èå¥åã®ã¿ã§ãã·ãŒã¯ã¬ãããååšããªã ã»ãã¥ãªãã£ãã¹ããã©ã¯ãã£ã¹ – Microsoft å
¬åŒæšå¥š ããŒã¯ã³ã®æå¹æéã«ã€ã㊠: GitHub OIDC ããŒã¯ã³ : 5åéïŒGitHub ãçºè¡ããèªèšŒçš JWTïŒ Azure ã¢ã¯ã»ã¹ããŒã¯ã³ : 1æéïŒService PrincipalïŒãŸãã¯24æéïŒManaged IdentityïŒ å®éã®ã¯ãŒã¯ãããŒå®è¡ã§ã¯ Azure ã¢ã¯ã»ã¹ããŒã¯ã³ã䜿çšããããããååãªæå¹æéããããŸã 詳现ãªã»ããã¢ããæé ãš OIDC èªèšŒã®ä»çµã¿ã«ã€ããŠã¯ã ãã¡ãã®èšäº ãåç
§ããŠãã ããã ã¹ããã 3: Node.js ã»ããã¢ãããš npm ci Setup Node.js with Cache - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: "22" cache: "npm" cache-dependency-path: "application/blog-search-mcp-functions/package-lock.json" ãã€ã³ã Node.js 22 LTS ã䜿çšïŒAzure Functions v4 察å¿ïŒ npm ãã£ãã·ã¥ ãæå¹åïŒ cache: "npm" ïŒ cache-dependency-path ã§ã¢ãã¬ãã®ç¹å®ãã¹ãæå® è£è¶³ : setup-node 㯠package-lock.json ã®ããã·ã¥å€ãèªåèšç®ããŠãã£ãã·ã¥ããŒãçæããŸããããé«åºŠãªãã£ãã·ã³ã°æŠç¥ïŒ actions/cache + hashFiles() ã«ããæç€ºçå¶åŸ¡ïŒã«ã€ããŠã¯ã actions/setup-node å
¬åŒãªããžã㪠ãåç
§ããŠãã ããã npm ci vs npm install - name: Install dependencies run: | cd application/blog-search-mcp-functions npm ci # ✅ npm install ã§ã¯ãªã npm ci npm ci ã®å©ç¹ : package-lock.json ãå³å¯ã«å°éïŒåçŸæ§ïŒ node_modules/ ãã¯ãªãŒã³ã€ã³ã¹ããŒã« CI/CD ç°å¢ã«æé©åïŒé«éïŒ ããŒãžã§ã³ã®äžäžèŽãé²ã 宿ž¬å€ åŠç åå ãã£ãã·ã¥ããã npm ci ~30 ç§ ~5 ç§ npm run build ~15 ç§ ~15 ç§ ãã£ãã·ã¥å¹æ: ãã«ãæé 30-40%ççž® ã¹ããã 4: ããã±ãŒãžæ§é æ€èšŒ ãªãå¿
èŠã Azure Functions ã®ãããã€ã¯ã æ£ãããã¡ã€ã«æ§æããªããšå€±æ ããŸãã ç¹ã«ä»¥äžã®ãã¡ã€ã«ã¯å¿
é ïŒ host.json – Functions App èšå® package.json – äŸåé¢ä¿å®çŸ© dist/ – ãã«ãææç©ïŒTypeScript â JavaScriptïŒ ãããã€åã«ããããæ€èšŒããããšã§ã 倱æãæ©æã«æ€åº ã§ããŸãã å®è£
- name: Verify package structure run: | cd application/blog-search-mcp-functions echo "=== Package root contents ===" ls -la echo "" # host.jsonæ€èšŒ echo "=== Checking host.json ===" if [ -f "host.json" ]; then echo "✅ host.json exists" cat host.json | jq . || echo "⚠ host.json is not valid JSON" else echo "❌ host.json missing!" exit 1 fi echo "" # package.jsonæ€èšŒ echo "=== Checking package.json ===" if [ -f "package.json" ]; then echo "✅ package.json exists" node -e "console.log('✅ package.json is valid JSON')" -p "require('./package.json')" else echo "❌ package.json missing!" exit 1 fi echo "" # dist/ ãã£ã¬ã¯ããªæ€èšŒ echo "=== Checking for compiled files in dist ===" if [ -d "dist" ]; then echo "✅ dist directory exists" find dist -name "*.js" | head -10 else echo "❌ dist directory missing!" exit 1 fi echo "" echo "=== All files in package (first 50) ===" find . -type f | head -50 ãã€ã³ã jq ã§ JSON åŠ¥åœæ§æ€èšŒ Node.js ã§ require() ãã¹ãïŒæ§æãšã©ãŒæ€åºïŒ 倱ææã¯ exit 1 ã§å³åº§ã«ã¯ãŒã¯ãããŒåæ¢ ãã°åºåãèŠããããã©ãŒããã å®éã®ãã°åºåäŸ === Package root contents === drwxr-xr-x dist -rw-r--r-- host.json -rw-r--r-- package.json ... === Checking host.json === ✅ host.json exists { "version": "2.0", "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle.Experimental", "version": "[4.*, 5.0.0)" } } === Checking package.json === ✅ package.json exists ✅ package.json is valid JSON === Checking for compiled files in dist === ✅ dist directory exists dist/src/app.js dist/src/functions/searchBlogPosts.mcp.js ... ãã®æ€èšŒã«ããã ãããã€å€±æã®åå ãäºåã«ç¹å® ã§ããŸãã ã¹ããã 5: ãã¹ãå®è¡ –passWithNoTests ãã©ã° ãããžã§ã¯ãåææ®µéã§ã¯ããã¹ããã¡ã€ã«ããªãããšããããŸãã - name: Run tests run: | cd application/blog-search-mcp-functions npm test -- --passWithNoTests ãªãå¿
èŠã Jest ã®ããã©ã«ãåäœã§ã¯ã ãã¹ããèŠã€ãããªãå Žå㯠exit code 1 ã§å€±æ ããŸãã --passWithNoTests ãã©ã°ã䜿ãããšã§ïŒ ãã¹ããã¡ã€ã«ããªããŠã CI/CD ãéã å°æ¥ãã¹ãã远å ããéãèªåçã«ãã¹ããå®è¡ããã éçºåææ®µéã® CI/CD æ§ç¯ã«æé© æšå¥šã¢ãããŒã ãããžã§ã¯ãåæïŒãã¹ããªãïŒ : --passWithNoTests äœ¿çš ãã¹ã远å éå§ : ãã©ã°ç¶æã段éçã«ãã¹ã远å ãã¹ãã«ãã¬ããžç¢ºç«åŸ : ãã©ã°åé€ïŒãã¹ãå¿
é åïŒ ã¹ããã 6: Azure Functions ããã〠ãããã€åã®ç¢ºèª - name: Check Function App status before deployment run: | echo "Checking current Function App status..." az functionapp show \ --name ${{ vars.BLOG_SEARCH_MCP_FUNCTION_APP_NAME }} \ --resource-group ${{ vars.RESOURCE_GROUP }} \ --query "{name:name, state:state, kind:kind}" \ --output table çŸåšã® Function App ã®ç¶æ
ã確èªããããšã§ããããã€åã®ç°åžžãæ€åºã§ããŸãã ãããã€å®è¡ - name: Deploy to Azure Functions uses: Azure/functions-action@v1 with: app-name: ${{ vars.BLOG_SEARCH_MCP_FUNCTION_APP_NAME }} package: "application/blog-search-mcp-functions" respect-funcignore: true scm-do-build-during-deployment: false enable-oryx-build: false id: deploy ãããã€ãå®è¡ããéã¯ãäœæããŠããAzure Functionsã®ã¢ããªåã®ã¿ã§æå®ãããããšãã§ããŸãã ãããã€èšå®ã®è©³çް respect-funcignore: true .funcignore ãã¡ã€ã«ãå°éããäžèŠãªãã¡ã€ã«ããããã€ããã±ãŒãžããé€å€ããŸãã # .funcignore *.ts src/ tsconfig.json .git/ .github/ node_modules/ tests/ *.md 广 : ãããã€ããã±ãŒãžãµã€ãºãæå°å ãã«ãææç©ïŒ dist/ ïŒã®ã¿ã¢ããããŒã ãããã€æéççž® scm-do-build-during-deployment: false Azure åŽã§ã®ãã«ããã¹ãããããŸãã çç± : GitHub Actions åŽã§äºåãã«ãæžã¿ ãããã€æéççž® äºæž¬å¯èœæ§åäž enable-oryx-build: false OryxïŒAzure èªåãã«ãã·ã¹ãã ïŒãç¡å¹åããŸãã çç± : æç€ºçãªãã«ãããã»ã¹ç®¡ç ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã容æ èšå®ã®äºææ§ã«é¢ããéèŠãªæ³šæäºé
WEBSITE_RUN_FROM_PACKAGE ãšã®éäºææ§ ä»¥äžã®èšå®ã®çµã¿åããã¯ äºææ§ããããŸãã ïŒ WEBSITE_RUN_FROM_PACKAGE=1 + SCM_DO_BUILD_DURING_DEPLOYMENT=true ïŒéäºæïŒ WEBSITE_RUN_FROM_PACKAGE=1 + SCM_DO_BUILD_DURING_DEPLOYMENT=false ïŒæšå¥šïŒ çç± : WEBSITE_RUN_FROM_PACKAGE 㯠ZIP ããã±ãŒãžããçŽæ¥å®è¡ããèšå®ã§ããããããã€æã®ãã«ããšç«¶åããŸãã ãªã¢ãŒããã«ããæå¹åããå ŽåïŒLinuxïŒ : ãã€ãã£ãã¢ãžã¥ãŒã«ïŒPuppeteerãSharpçïŒã䜿çšããå Žåã¯ããªã¢ãŒããã«ããå¿
èŠã§ãïŒ - name: Deploy to Azure Functions uses: Azure/functions-action@v1 with: app-name: ${{ vars.FUNCTION_APP_NAME }} package: "path/to/function" scm-do-build-during-deployment: true # ãªã¢ãŒããã«ãæå¹å enable-oryx-build: true # Oryx ãã«ãæå¹å 泚æ : äž¡æ¹ã true ã«èšå®ããå¿
èŠããããŸãïŒLinuxã®ã¿ïŒã ã¹ããã 7: ãããã€åŸæ€èšŒ æåæã®æ€èšŒ - name: Verify deployment success if: success() run: | echo "✅ Deployment successful. Verifying MCP Server..." sleep 30 # Function Appèµ·ååŸ
æ© # ã¢ããªèšå®ç¢ºèª az functionapp config show \ --name ${{ vars.BLOG_SEARCH_MCP_FUNCTION_APP_NAME }} \ --resource-group ${{ vars.RESOURCE_GROUP }} \ --query "{nodeVersion:nodeVersion, platform:linuxFxVersion}" \ --output table # Function App URLååŸ FUNCTION_APP_URL=$(az functionapp show \ --name ${{ vars.BLOG_SEARCH_MCP_FUNCTION_APP_NAME }} \ --resource-group ${{ vars.RESOURCE_GROUP }} \ --query "defaultHostName" \ --output tsv) echo "MCP Endpoint: https://$FUNCTION_APP_URL/runtime/webhooks/mcp/sse" ãã€ã³ã sleep 30 ã§ Function App èµ·ååŸ
æ©ïŒã³ãŒã«ãã¹ã¿ãŒã察çïŒ Node.js ããŒãžã§ã³ç¢ºèªïŒæå³ããªãããŒãžã§ã³äœ¿çšé²æ¢ïŒ ãšã³ããã€ã³ã URL ãæç€ºçã«è¡šç€ºïŒæåãã¹ãçšïŒ 倱ææã®ãªã«ããªãŒ - name: Check deployment result and restart if needed if: failure() run: | echo "❌ Deployment failed. Attempting recovery..." echo "Restarting Function App..." az functionapp restart \ --name ${{ vars.BLOG_SEARCH_MCP_FUNCTION_APP_NAME }} \ --resource-group ${{ vars.RESOURCE_GROUP }} echo "Waiting for restart to complete..." sleep 60 echo "Checking Function App logs..." az functionapp logs tail \ --name ${{ vars.BLOG_SEARCH_MCP_FUNCTION_APP_NAME }} \ --resource-group ${{ vars.RESOURCE_GROUP }} \ --timeout 60 || echo "Could not retrieve logs" èªåãªã«ããªãŒã®å©ç¹ ãããã€å€±æåŸã®æåä»å
¥ãæžãã ãã°ååŸã«ããåé¡èšºæã®å®¹æå äžæçãªåé¡ïŒãããã¯ãŒã¯ãšã©ãŒãªã©ïŒããã®èªååŸ©æ§ å®è£
äŸïŒBlog Search MCP Functions ãããŸã§ã®èšå®ãçµ±åããå®å
šãªã¯ãŒã¯ãããŒãã¡ã€ã«ãèŠãŠã¿ãŸãããã å®å
šãªã¯ãŒã¯ãã㌠name: Deploy Blog Search MCP Functions on: push: branches: - main paths: - "application/blog-search-mcp-functions/**" - ".github/workflows/deploy-blog-search-mcp-functions.yml" workflow_dispatch: permissions: id-token: write contents: read jobs: deploy: runs-on: ubuntu-latest environment: "production" steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: "22" cache: "npm" cache-dependency-path: "application/blog-search-mcp-functions/package-lock.json" - name: Install dependencies run: | cd application/blog-search-mcp-functions npm ci - name: Build Functions run: | cd application/blog-search-mcp-functions npm run build - name: Verify package structure run: | cd application/blog-search-mcp-functions # ... (åè¿°ã®æ€èšŒã¹ã¯ãªãã) - name: Run tests run: | cd application/blog-search-mcp-functions npm test -- --passWithNoTests - name: Azure Login (OIDC) uses: azure/login@v2 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: Deploy to Azure Functions uses: Azure/functions-action@v1 with: app-name: ${{ vars.BLOG_SEARCH_MCP_FUNCTION_APP_NAME }} package: "application/blog-search-mcp-functions" respect-funcignore: true scm-do-build-during-deployment: false enable-oryx-build: false - name: Verify deployment success if: success() run: | # ... (åè¿°ã®æ€èšŒã¹ã¯ãªãã) ãããžã§ã¯ãæ§æ application/blog-search-mcp-functions/ âââ package.json âââ tsconfig.json âââ host.json # Experimental Bundleèšå® âââ .funcignore # ãããã€é€å€ãã¡ã€ã« âââ src/ â âââ app.ts # ãšã³ããªãŒãã€ã³ã â âââ functions/ # MCP Toolå®çŸ© â â âââ searchBlogPosts.mcp.ts â â âââ listAllCategories.mcp.ts â â âââ listAllHashtags.mcp.ts â âââ blog-search-mcp/ # å
±éã¢ãžã¥ãŒã« â âââ types/ â âââ schemas/ â âââ services/ âââ dist/ # ãã«ãææç©ïŒTypeScript â JSïŒ package.json { "name": "blog-search-mcp-functions", "version": "1.0.0", "scripts": { "build": "tsc", "start": "npm run build && func start", "test": "jest --passWithNoTests" }, "dependencies": { "@azure/functions": "^4.0.0", "@supabase/supabase-js": "^2.76.1", "zod": "^4.1.12" }, "devDependencies": { "@types/node": "^22.10.1", "typescript": "^5.7.2" }, "engines": { "node": ">=22.0.0" } } Environment 倿° vs Secrets GitHub Secrets ãš Variables ã®é©åãªäœ¿ãåããéèŠã§ãã 䜿ãåãã®åºæº SecretsïŒæ©å¯æ
å ±ïŒ : secrets: AZURE_CLIENT_ID # OIDCèªèšŒæ
å ± AZURE_TENANT_ID AZURE_SUBSCRIPTION_ID VariablesïŒéæ©å¯æ
å ±ïŒ : variables: APP_NAME # ã¢ããªã±ãŒã·ã§ã³å RESOURCE_GROUP # ãªãœãŒã¹ã°ã«ãŒãå BLOG_SEARCH_MCP_FUNCTION_APP_NAME # Function Appå X_SCHEDULER_FUNCTION_APP_NAME # Function Appå å€æåºæº Secrets : æŒæŽ©ãããšé倧ãªåœ±é¿ïŒèªèšŒæ
å ±ãAPI ããŒãããŒã¯ã³ïŒ Variables : å
¬éãããŠãåé¡ãªãïŒãªãœãŒã¹åãèšå®å€ïŒ èšå®æ¹æ³ æåèšå® GitHub ãªããžããªã®ãSettingsãâãSecrets and variablesãâãActionsãããèšå®ããŸãã èªåèšå®ïŒæšå¥šïŒ Bicep ãããã€ã¹ã¯ãªããïŒ deploy.sh ïŒã§èªåèšå®ããããšãå¯èœã§ãïŒ # GitHub CLI ã®ååšç¢ºèª if command -v gh &> /dev/null; then echo "GitHub CLIã䜿çšããŠã·ãŒã¯ã¬ãããèšå®äž..." # Repository secretsïŒãªããžããªå
šäœã§å
±éïŒ echo "$MANAGED_IDENTITY_CLIENT_ID" | gh secret set AZURE_CLIENT_ID --repo "$GITHUB_ORG/$GITHUB_REPO" # Environment variablesïŒç°å¢ããšïŒ gh variable set BLOG_SEARCH_MCP_FUNCTION_APP_NAME \ --repo "$GITHUB_ORG/$GITHUB_REPO" \ --env production \ --body "$BLOG_SEARCH_MCP_FUNCTION_APP_NAME" fi ã¡ãªãã : ã€ã³ãã©ãããã€ãš GitHub èšå®ãäžæ¬å®è¡ æåèšå®ãã¹ã®é²æ¢ ç°å¢æ§ç¯ã®åçŸæ§åäž ããã©ãŒãã³ã¹å®æž¬å€ å®éã«éçšããŠããç°å¢ã§ã®å®æž¬å€ã玹ä»ããŸãã ãã«ãæéïŒBlog Search MCP FunctionsïŒ ã¹ããã åå ãã£ãã·ã¥ããã Setup Node.js ~10 ç§ ~10 ç§ npm ci ~30 ç§ ~5 ç§ npm run build ~15 ç§ ~15 ç§ Deploy ~2-8 å ~2-8 å åèš çŽ 3-9 å çŽ 2.5-8.5 å æ³š : ãããã€æéã¯ã颿°ã®ããã±ãŒãžãµã€ãºãäŸåé¢ä¿ã®æ°ãAzure ãªãŒãžã§ã³ã®æ··éç¶æ³ã«ãã£ãŠå€§ããå€åããŸãã å°èŠæš¡é¢æ° ïŒæå°éã®äŸåé¢ä¿ïŒïŒçŽ 2-3 å äžèŠæš¡é¢æ° ïŒäžè¬çãªäŸåé¢ä¿ïŒïŒçŽ 5-8 å å€§èŠæš¡é¢æ° ïŒå€æ°ã®äŸåé¢ä¿ïŒïŒçŽ 10-15 å äžèšã®å®æž¬å€ã¯ãå°èŠæš¡ãª MCP Functions ã®å Žåã§ããæ¬çªç°å¢ã§ã®äžè¬çãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ã 5-15 åçšåºŠãèŠèŸŒãããšãæšå¥š ããŸãã æé©å广 æé©åé
ç® å¹æ ãã¹ãã£ã«ã¿ãŒå°å
¥ äžå¿
èŠãªãã«ã 70%åæž npm ãã£ãã·ã¥ ãã«ãæé 30-40%ççž® 䞊åã¯ãŒã¯ãã㌠å
šäœãããã€æé 50%ççž® ãã©ãã«ã·ã¥ãŒãã£ã³ã° ãããããšã©ãŒãšå¯ŸåŠæ³ããŸãšããŸãã ãšã©ãŒ 1: Package deployment failed çç¶ : Error: Package deployment failed åå : host.json ãããã±ãŒãžã«å«ãŸããŠããªã package.json ãäžæ£ãª JSON dist/ ãã£ã¬ã¯ããªã空 解決ç : ããã±ãŒãžæ§é æ€èšŒã¹ãããã远å ãã .funcignore ã確èªããŸãã - name: Verify package structure run: | # host.json, package.json, dist/ ã®æ€èšŒ ãšã©ãŒ 2: OIDC token exchange failed çç¶ : Error: OIDC token exchange failed åå : Federated Identity Credential ã®èšå®ãã¹ permissions: id-token: write ã®æ¬ èœ è§£æ±ºç : permissions ç¢ºèª : permissions: id-token: write # å¿
é contents: read Federated Credential ç¢ºèª : Azure Portal ã§ãUser Assigned Managed Identity ã®ãFederated credentialsãã確èªããsubject ãã¿ãŒã³ãäžèŽããŠããã確èªããŸãã repo:org/repo:environment:production 詳现㯠ãã¡ãã®èšäº ãåç
§ããŠãã ããã ãšã©ãŒ 3: Function runtime error çç¶ : ãããã€ã¯æåããããFunction App ãèµ·åããªã åå : Node.js ããŒãžã§ã³äžäžèŽ äŸåé¢ä¿ã®æ¬ èœ è§£æ±ºç : ãããã€åŸã« Node.js ããŒãžã§ã³ã確èªïŒ az functionapp config show \ --name <app-name> \ --resource-group <rg> \ --query "nodeVersion" package.json ã® engines ãã£ãŒã«ããšäžèŽããŠããã確èªããŸãã { "engines": { "node": ">=22.0.0" } } ãšã©ãŒ 4: npm ci fails çç¶ : Error: npm ci can only install packages when your package.json and package-lock.json are in sync åå : package.json ãš package-lock.json ã®äžäžèŽ è§£æ±ºç : ããŒã«ã«ã§ package-lock.json ãåçæïŒ rm package-lock.json npm install git add package-lock.json git commit -m "chore: regenerate package-lock.json" å®è£
ã®ãã€ã³ããŸãšã ã«ããŽãª DOïŒæšå¥šïŒ DON’TïŒéæšå¥šïŒ èªèšŒ OIDC èªèšŒãäœ¿çš ã»ãã¹ã¯ãŒãã¬ã¹ãã»ãã¥ã¢ ã»ã·ãŒã¯ã¬ãã管çäžèŠ ã»èªåããŒããŒã·ã§ã³ ã·ãŒã¯ã¬ããããŒã¹èªèšŒ ã»æå¹æé管çã®è² æ
ã»å®æçãªããŒããŒã·ã§ã³äœæ¥ ã»æŒæŽ©ãªã¹ã¯ äŸåé¢ä¿ç®¡ç npm ci ãäœ¿çš ã» package-lock.json ãå³å¯ã«å°é ã»åçŸæ§ãé«éæ§ ã»CI/CD å°çšã®æé©å npm install äœ¿çš ã»ããŒãžã§ã³äžäžèŽãªã¹ã¯ ã»åçŸæ§ãäœã ã»äºæããªãäŸåé¢ä¿ã®æŽæ° ããªã¬ãŒèšå® ãã¹ãã£ã«ã¿ãŒãèšå® ã»äžå¿
èŠãªãã«ã 70%åæž ã»CI/CD ã³ã¹ã 65%åæž ã»ãããã€æé 50%ççž® ãã¹ãã£ã«ã¿ãŒãªã ã»ãã¹ãŠã®å€æŽã§ãã«ãå®è¡ ã»ãªãœãŒã¹æµªè²» ã»CI/CD ã³ã¹ãå¢å€§ ãã¹ã –passWithNoTestsïŒåææ®µéïŒ ã»ãã¹ããªãã§ã CI/CD éé ã»æ®µéçãªãã¹ã远å ã»éçºéåºŠç¶æ ãã¹ãå¿
é åïŒåææ®µéïŒ ã»éçºé床äœäž ã»CI/CD æ§ç¯ã®é
å»¶ ã»å®è£
åªå
ãã§ãŒãºã§é害 æ€èšŒ ããã±ãŒãžæ§é æ€èšŒ ã»ãããã€åã®æ§é ç¢ºèª ã»å€±æã®æ©ææ€åº ã»ãããã°æéççž® æåæ€èšŒã®ã¿ ã»äººçãã¹é²æ¢ã§ããªã ã»ãããã€å€±æåŸã«æ°ã¥ã ã»ææ»ãã³ã¹ãå¢å€§ ãããã€èšå® äºåãã«ãæŠç¥ ã» scm-do-build: false ã» enable-oryx-build: false ã»GitHub Actions åŽã§äºåãã«ã Azure åŽãã«ã ã» scm-do-build: true ã»ãããã€æéãé·ã ã»äºæž¬å¯èœæ§ãäœã ãªã«ããªãŒ èªåãªã«ããªãŒåŠç ã»å€±ææã®èªååèµ·å ã»ãã°èªåååŸ ã»äžæçãªåé¡ããèªååŸ©æ§ æåãªã«ããªãŒã®ã¿ ã»æ¯åæåä»å
¥ãå¿
èŠ ã»åŸ©æ§æéãé·ã ã»å€éãããã€å€±ææã®å¯Ÿå¿é
å»¶ 泚 : æ¬çªç°å¢ã«ç§»è¡ããéã¯ã --passWithNoTests ãã©ã°ãåé€ããŠãã¹ããå¿
é åããŸããããå質ä¿èšŒã®ããããã¹ãã«ãã¬ããžã確ç«ããåŸã¯å¿
ããã¹ããå®è¡ãããç¶æ
ã«ããããšãæšå¥šããŸãã ãŸãšã ãã®èšäºã§å®è£
ããããš GitHub Actions ã«ãã Azure Functions ãããã€ãã€ãã©ã€ã³ OIDC èªèšŒã«ãããã¹ã¯ãŒãã¬ã¹ããã〠ãã¹æ¡ä»¶ããªã¬ãŒã§å¹çå ïŒäžèŠãªãã«ã 70%åæžïŒ npm ci + ãã£ãã·ã¥ã§é«éå ïŒãã«ãæé 30-40%ççž®ïŒ ããã±ãŒãžæ§é æ€èšŒã§å質ä¿èšŒ èªåãªã«ããªãŒåŠç åŸããã广 ã»ãã¥ãªãã£é¢ : ã·ãŒã¯ã¬ããããŒç®¡çäžèŠ èªåããŒããŒã·ã§ã³ æŒæŽ©ãªã¹ã¯æå°å å¹çé¢ : ãããã€æéççž®ïŒå°èŠæš¡é¢æ°ã§çŽ 2-3 åãäžè¬çã«ã¯ 5-15 åïŒ CI/CD ã³ã¹ãåæžïŒ65%ïŒ æåäœæ¥ã®åæž åè³ªé¢ : ãããã€å€±æã®æ©ææ€åº èªåæ€èšŒãšãªã«ããªãŒ åçŸæ§ã®é«ããã«ã 次ã®ã¹ããã ããã«çºå±ãããã«ã¯ïŒ ãã«ãç°å¢ããã〠– staging/production ç°å¢ã®ç®¡ç Bicep çµ±å – ã€ã³ãã©ãš CI/CD ã®å®å
šèªåå Python ç – Python Runtime ã§ã®å®è£
ã¢ãã¿ãªã³ã°çµ±å – Application Insights ãšã®é£æº åèãªã³ã¯ å
¬åŒããã¥ã¡ã³ã Azure Functions GitHub Actions OIDC èªèšŒïŒAzureïŒ é¢é£èšäº GitHub ActionsâAzure èªèšŒã®å®è£
æé ïŒOIDCÃAzure CLI ã§çéã»ããã¢ãã 2025 幎ç Azure FunctionsÃDevContainer ç°å¢æ§ç¯ïœ Node.js 22 + TypeScript GitHub Actions ã䜿ã£ã Azure Functions ã®ãããã€ããã²è©ŠããŠã¿ãŠãã ããïŒ OIDC èªèšŒã«ãããã¹ã¯ãŒãã¬ã¹ãããã€ã§ãã»ãã¥ãªãã£ãšå¹çæ§ã®äž¡æ¹ãæã«å
¥ããããŸãã 質åãæ¹åææ¡ãããã°ããã²ã³ã¡ã³ãã§æããŠãã ããïŒ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post GitHub ActionsÃAzure Functionså®è£
ã¬ã€ãïœOIDCèªèšŒã§å®çŸããã»ãã¥ã¢ãªCI/CDïŒNode.jsç·šïŒ first appeared on SIOS Tech. Lab .
ã¯ããã« ã©ãïŒæè¿ã¯ Claude Code ãšãã«éçºãé²ããŠãwith AI ã§ã®ç掻ã«ã©ã£ã·ãã ã£ãã®ã§ãã 2025 幎ãç· ããšããããšã§è²¯ãŸã£ãæ€èšŒãäžæ°ã«èšäºåããŠããéŸã¡ããã§ããæ€èšŒãããŸã£ãŠããã®ã§ã11 æãš 12 æã¯å€§éã«ããã°ãæžã矜ç®ã«ãªãããã§ããããŽãªãŽãªå·çããå¿
èŠããããŸããïŒ çãããAIïŒClaude Code çïŒãšäžç·ã«éçºããŠããšããããªæ©ã¿ãããŸãããïŒ ããã®ãããžã§ã¯ããã©ãããæ§æã«ãªã£ãŠãã®ïŒããš AI ã«æ¯å説æããã®ãé¢å ãã¡ã€ã«ãå€ãã㊠AI ãæ··ä¹±ããŠãçå€ããªææ¡ãããŠãã ã¢ãã¬ãã«ãããã©ãå
šéšã®ã¢ããªãæ¯åãã«ããããŠæéãããã åã以åã¯ãããã®èª²é¡ã«æ©ãŸãããŠããŸãããç¹ã«ã ãããžã§ã¯ãã倧ãããªãã»ã©ãAI ãå
šäœåãææ¡ãã¥ãããªã ãšããåé¡ãæ·±å»ã§ããã ããã§æ§ç¯ããã®ãã CLAUDE.md éå±€æ§é ãæ žãšããã¢ãã¬ãç°å¢ã§ãããã®ç°å¢ã«ããã以äžã®ææãåŸãããŸããïŒ AI ãèªåŸçã«ãããžã§ã¯ãæ§æãçè§£ ïŒCLAUDE.md éå±€æ§é ïŒ CI/CD ãã«ãæé 58%åæž ïŒpaths ãã£ã«ã¿ã«ããæé©åïŒ ããã¥ã¡ã³ããèªç¶ã«èç© ïŒ4 ãã§ãŒãºã¯ãŒã¯ãããŒ: èšç» â å®è£
â ç ç©¶èšé² â èšäºåïŒ æ¬èšäºã§ç޹ä»ããç°å¢ã¯ãå®éã«çšŒåäžã®ã·ã¹ãã ã§å®è·µããŠããå
容ã§ãã ãã®ã¢ãã¬ãã§éçºããŠããã·ã¹ãã ã®è©³çްã«ã€ããŠã¯ã AI ãã£ããã§è©±ãã ã!X äºçŽæçš¿ãå®å
šèªååããã·ã¹ãã æ§ç¯è¡ ã§è§£èª¬ããŠããŸãïŒãªããžããªã¯éå
¬éïŒã ãã®èšäºã§ã¯ã ã¢ãã¬ãæ§æãš AI 忥éçºãæé©åããç°å¢èšèš ã«ã€ããŠãå®éã®ãããžã§ã¯ãæ§æãšã¯ãŒã¯ãããŒã亀ããªãã解説ããŠãããŸãã èšäºã®äœçœ®ã¥ã åæãšãªãç¥èïŒå
ã«èªãã¹ãèšäºïŒ : æ¬èšäºã§ç޹ä»ãã 4 ãã§ãŒãºã¯ãŒã¯ãããŒã¯ã以äžã®èšäºã§è§£èª¬ãã 3 ãã§ãŒãºéçºãåºç€ã«æ§ç¯ãããŠããŸãïŒ 3 ãã§ãŒãºéçºã®åºæ¬ãåŠã¶ : Claude Code é©åœïŒ3 ãã§ãŒãºéçºã§å¹ççãªéçºïŒèšç» â å®è£
â æ€èšŒè¡ èšç» â å®è£
â æ€èšŒã® 3 ãã§ãŒãºã¯ãŒã¯ãã㌠/docs/ ãš /application/ ã®ãã£ã¬ã¯ããªåé¢ å°èŠæš¡ã·ã¹ãã ã 30 åã§å®è£
ããå®äŸ èšç»ãã§ãŒãºã®è©³çްãåŠã¶ : AI ååã§ä»æ§æžã¢ã¬ã«ã®ãŒå
æïŒéçºæéã 1 é±é â2 æ¥ã«ççž®ããå®è·µæ³ CLAUDE.md ã«ãã仿§æžäœæã«ãŒã« AI ãšã®ååã¬ãã¥ãŒããã»ã¹ éçºæéã 1 é±é â2 æ¥ã«ççž®ããå®è·µæ³ 4 ãã§ãŒãºãžã®æ¡åŒµãåŠã¶ : æ€èšŒ â èšäºåã§ç¥èŠãè³ç£åïŒClaude CodeÃRAG ãã©ãã§ AI æè¡ããã°å·çãå¹çå ãã§ãŒãº 4ïŒèšäºåïŒã®è¿œå ã«ããç¥èŠã®è³ç£å RAG ãã©ãã·ã¹ãã ã§ããŒã¯ã³æ° 50-60%åæž æäœè£æ£ã·ã¹ãã ã§äžè²«ããèšäºå質ãå®çŸ èšäºå·çæé 50%åæžãéè€ãã§ã㯠83%åæž æè¡åºç€ : åå®å
šãª API éçºãåŠã¶ : AI ãšçééçºïŒNext.jsÃNest.js åå®çŸ©åæã®èªåçæãã€ãã©ã€ã³æ§ç¯è¡ Backend DTOs â OpenAPI â Frontend Types ã®èªåçæ Single Source of Truth ã«ããåãºã¬ãŒãã®å®çŸ ãã®èšäºã§åŠã¹ãããš ãã®èšäºãèªãããšã§ã以äžã®ç¥èãšã¹ãã«ãåŸãããŸãïŒ äž»èŠãªãã€ã³ã ã¢ãã¬ãæ§æãš AI 忥éçºã®çžæ§ ãªãã¢ãã¬ãã AI 忥ã«é©ããŠããã®ããå®äœéšãããšã«è§£èª¬ CLAUDE.md éå±€æ§é ã«ããã³ã³ããã¹ã管ç 9 ã€ã® CLAUDE.md ãã¡ã€ã«ã§ AI ã«é©åãªæ
å ±ãæäŸããèšèš paths ãã£ã«ã¿ã«ãã CI/CD æé©å 倿Žãããã¢ããªã®ã¿ãã«ãããããšã§ãã«ãæé 58%åæž 4 ãã§ãŒãºã¯ãŒã¯ãããŒã«ããç¥èŠã®è³ç£å èšç» â å®è£
â ç ç©¶èšé² â èšäºåã®ããã¥ã¡ã³ãé§ååéçº å®è·µçãªãã¯ãã㯠AI ãçè§£ãããããã£ã¬ã¯ããªæ§é ãšåœåèŠå GitHub Actions paths ãã£ã«ã¿ã®æŽ»çš ããã¥ã¡ã³ãé§ååéçºã«ããç¥èŠã®èç© åææ¡ä»¶ ãã®èšäºã¯ã ã¢ãã¬ãæ§æãš AI 忥éçºç°å¢ã®èšèšã»ã¢ãŒããã¯ã㣠ã«çŠç¹ãåœãŠãŠããŸãã åæç¥èïŒãããšæãŸããïŒ AI éçºããŒã«ã®äœ¿çšçµéš Claude CodeãGitHub CopilotãCursor çã® AI éçºæ¯æŽããŒã«ã䜿ã£ãéçºçµéš AI ã«ããã³ãããæããŠã³ãŒããçæããçµéš ã¢ãã¬ãã®åºç€ç¥è è€æ°ã®ã¢ããªã±ãŒã·ã§ã³ã 1 ã€ã®ãªããžããªã§ç®¡çããæŠå¿µã®çè§£ ïŒåããŠã®æ¹ã§ããèšäºãèªã¿é²ããããšã§çè§£ã§ããŸãïŒ æ¬èšäºã§æ±ããªãããš ã¢ãã¬ãããŒã«ïŒTurborepoãNx çïŒã®è©³çްæ¯èŒ Azure ç°å¢ã®è©³çްãªã»ããã¢ããæé åãã¬ãŒã ã¯ãŒã¯ïŒNestJSãNext.js çïŒã®å®è£
詳现 åå®å
šãã€ãã©ã€ã³ã®å®è£
è©³çŽ°ïŒ åå®å
šãã€ãã©ã€ã³ã®èšäº ã§è§£èª¬ïŒ â»æ¬èšäºã¯æ§æãšèšèšã«çŠç¹ãåœãŠãŠãããå®è£
ã®è©³çްã¯é¢é£èšäºã§è§£èª¬ããŠããŸãã ãããžã§ã¯ãå
šäœå ãŸãã¯ãå®éã®ãããžã§ã¯ãæ§æãèŠãŠãããŸãããã ã¢ãã¬ãæ§æã® 4 ã€ã®ã¢ããªã±ãŒã·ã§ã³ ãã®ãããžã§ã¯ãã¯ã 4 ã€ã®ç¬ç«ããã¢ããªã±ãŒã·ã§ã³ ãã¢ãã¬ãã§ç®¡çããŠããŸãã ã¢ããªã±ãŒã·ã§ã³ æè¡ã¹ã¿ã㯠ãããã€å
GitHub Actions Frontend Next.js 15, React 19, TypeScript 5 Azure Static Web Apps frontend-swa-deploy.yml Backend NestJS 11, Node.js 22, TypeScript 5 Azure Web Apps (Docker) backend-docker-build.yml X Scheduler Functions Azure Functions v4, Node.js 22, TypeScript Azure Functions deploy-x-scheduler-functions.yml Blog Search MCP Functions Azure Functions v4, Node.js 22, MCP Protocol Azure Functions deploy-blog-search-mcp-functions.yml ãã£ã¬ã¯ããªæ§é ã®å
šäœå ãããžã§ã¯ãã«ãŒã/ âââ docs/ # èšç»ã»èšèšãã§ãŒãºïŒå®è£
ã³ãŒããªãïŒ â âââ CLAUDE.md # èšç»ãã§ãŒãºã¬ã€ãã©ã€ã³ â âââ project-core.md # ã€ã³ãã©å
šäœæ§æ â âââ features/ # æ°æ©èœéçºèšç» â âââ bugs/ # ãã°èª¿æ»ã»ä¿®æ£èšç» â âââ research/ # å®è£
æ€èšŒçµæã»ç¥èŠ â âââ article/ # ããã°èšäºå·ççšèª¿æ» â â âââ CLAUDE.md # èšäºå·çã¬ã€ã â âââ tools/ # Docså°çšããŒã« â â âââ CLAUDE.md # ããŒã«äœ¿çšã¬ã€ã â âââ api/ # OpenAPI仿§ âââ application/ # å®è£
ãã§ãŒãº â âââ backend/ # NestJS APIãµãŒã㌠â â âââ CLAUDE.md # ããã¯ãšã³ãéçºã¬ã€ã â âââ frontend/ # Next.js ããã³ããšã³ã â â âââ CLAUDE.md # ããã³ããšã³ãéçºã¬ã€ã â âââ functions/ # X Scheduler â â âââ CLAUDE.md # Functionséçºã¬ã€ã â âââ blog-search-mcp-functions/ # MCP Server â âââ CLAUDE.md # MCP Functionséçºã¬ã€ã âââ infrastructure/ # IaCãã³ãã¬ãŒã â âââ CLAUDE.md # ã€ã³ãã©éçºã¬ã€ã âââ CLAUDE.md # ã«ãŒãã¬ã€ãã©ã€ã³ïŒå
šäœåïŒ âââ .github/ âââ workflows/ # CI/CDãã€ãã©ã€ã³ âââ frontend-swa-deploy.yml âââ backend-docker-build.yml âââ deploy-x-scheduler-functions.yml âââ deploy-blog-search-mcp-functions.yml ã·ã¹ãã æ§æå³ ã¢ãã¬ãå
šäœã®æ§æãèŠèŠåãããšãããªããŸãïŒ ãªãã¢ãã¬ããªã®ãïŒ ã¢ãã¬ãæ§æãæ¡çšããçç±ã¯ã AI 忥éçºãšã®çžæ§ã®è¯ã ã«ãããŸãã ã¢ãã¬ãã®ã¡ãªãã 1. AI ã« 1 ã€ã®ãªããžããªã§å
šäœåãæäŸ å¥ãªããžããªã«ãããšãAI ã¯åãªããžããªã®ã³ã³ããã¹ããåå¥ã«çè§£ããå¿
èŠããããŸããã¢ãã¬ããªãã ã«ãŒãã® CLAUDE.md ã§å
šäœåãäžåºŠã«æäŸ ã§ããŸãã # å¥ãªããžããªã®å ŽåïŒAIãæ··ä¹±ïŒ frontend-repo/ â AIã¯ãã®ãªããžããªã®ã³ã³ããã¹ãã®ã¿ backend-repo/ â å¥ã®ã»ãã·ã§ã³ã§å¥ã®ã³ã³ããã¹ã functions-repo/ â ãŸãå¥ã®ã³ã³ããã¹ã # ã¢ãã¬ãã®å ŽåïŒAIãå
šäœãææ¡ïŒ monorepo/ âââ CLAUDE.md â å
šäœåãAIã«æäŸ âââ application/ â âââ frontend/ â âââ backend/ â âââ functions/ 2. ãã£ã¬ã¯ããªæ§é ã®äžè²«æ§ ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ãåãã«ãŒã«ã«åŸããããAI ãçè§£ãããããªããŸãã # ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«ããããã®CLAUDE.mdããã /application/backend/CLAUDE.md /application/frontend/CLAUDE.md /application/functions/CLAUDE.md /application/blog-search-mcp-functions/CLAUDE.md 3. ã³ãŒãå
±æã容æ å
±éã©ã€ãã©ãªãåå®çŸ©ããŠãŒãã£ãªãã£é¢æ°ãè€æ°ã®ã¢ããªã§å
±æã§ããŸãã AI 忥éçºãæ¯ããèšèšææ³ ãã®ã¢ãã¬ãç°å¢ã«ã¯ã3 ã€ã®æ žãšãªãèšèšææ³ããããŸãã 1. èšç»ãšå®è£
ã®åé¢ /docs/ ïŒèšèšã»ä»æ§ïŒãš /application/ ïŒå®è£
ã³ãŒãïŒãæç¢ºã«åé¢ããŠããŸãã ç®ç : AI ã«ãèšç»ãã§ãŒãºããšãå®è£
ãã§ãŒãºããæç¢ºã«åºå¥ããã å®è£
åã«èšèšãåºããããšã§ãææ»ããæžãã /docs/features/my-new-feature/ âââ README.md # æ©èœæŠèŠ âââ api-spec.md # APIèšèšïŒå®è£
ã³ãŒããªãïŒ âââ type-definition.md # åå®çŸ©ïŒå®è£
ã³ãŒããªãïŒ /application/backend/src/my-new-feature/ âââ my-new-feature.controller.ts # å®è£
ã³ãŒã âââ my-new-feature.service.ts # å®è£
ã³ãŒã âââ dto/ # å®è£
ãããåå®çŸ© 2. CLAUDE.md éå±€æ§é ã«ãŒãã§å
šäœåããµããã£ã¬ã¯ããªã§è©³çްã«ãŒã«ãæäŸããŸãã ç®ç : AI ãå¿
èŠãªç²åºŠã§ã³ã³ããã¹ããååŸã§ãã åé åã®å°éçãªã«ãŒã«ãæç¢ºã«ãã /CLAUDE.md â ãããžã§ã¯ãå
šäœå â /docs/CLAUDE.md â èšç»ãã§ãŒãºã®ã«ãŒã« â /application/backend/CLAUDE.md â ããã¯ãšã³ãå®è£
ã®è©³çްã«ãŒã« 3. Single Source of TruthïŒåå®å
šãã€ãã©ã€ã³ïŒ Backend DTOs ãå¯äžã®çå®ãšããFrontend ã®åå®çŸ©ã¯èªåçæããŸãã 詳现 : AI ãšçééçºïŒNext.jsÃNest.js åå®çŸ©åæã®èªåçæãã€ãã©ã€ã³æ§ç¯è¡ ãåç
§ Backend DTOs (@ApiProperty) â OpenAPI 仿§çæ (generate:openapi) â Frontend åå®çŸ©çæ (generate:api with Orval) â åå®å
šãªAPIåŒã³åºã ããã 3 ã€ã®èšèšææ³ã«ããã AI ãšã®åæ¥éçºãåçã«ã¹ã ãŒãº ã«ãªããŸããã CLAUDE.md éå±€æ§é ã®èšèš ããããã¯ãAI 忥éçºã®æ žãšãªã CLAUDE.md éå±€æ§é ã«ã€ããŠè©³ãã解説ããŸãã CLAUDE.md ãšã¯ïŒ CLAUDE.md ã¯ãAIïŒClaude CodeïŒã«ãããžã§ã¯ãã®ã³ã³ããã¹ããæäŸããããã¥ã¡ã³ãã§ãã åŸæ¥ãAI ã«ããã®ãããžã§ã¯ãã¯ã©ãããæ§æïŒããã©ã®ã«ãŒã«ã«åŸãã°ããïŒããšèããããã³ã«ãæåã§èª¬æããå¿
èŠããããŸãããCLAUDE.md ãé
眮ããããšã§ã AI ãèªåŸçã«ã¬ã€ãã©ã€ã³ãèªã¿ãé©åãªå€æããã ããã«ãªããŸãã 9 ã€ã® CLAUDE.md ãã¡ã€ã« ãã®ãããžã§ã¯ãã«ã¯ã åèš 9 ã€ã® CLAUDE.md ãã¡ã€ã« ãé
眮ãããŠããŸãã # ãã¹ãŠã®CLAUDE.mdãã¡ã€ã«ãç¢ºèª $ find . -maxdepth 3 -name "CLAUDE.md" | sort ./CLAUDE.md ./application/backend/CLAUDE.md ./application/blog-search-mcp-functions/CLAUDE.md ./application/frontend/CLAUDE.md ./application/functions/CLAUDE.md ./docs/article/CLAUDE.md ./docs/CLAUDE.md ./docs/tools/CLAUDE.md ./infrastructure/CLAUDE.md å CLAUDE.md ã®åœ¹å² : ãã¡ã€ã«ãã¹ åœ¹å² äž»ãªå
容 /CLAUDE.md ã«ãŒãã¬ã€ãã©ã€ã³ ãããžã§ã¯ãå
šäœåããã£ã¬ã¯ããªæ§é ã4 ãã§ãŒãºã¯ãŒã¯ãããŒãå
±ééçºã³ãã³ã /docs/CLAUDE.md èšç»ãã§ãŒãºã«ãŒã« åå®çŸ©ãAPI èšèšãããŒã¿ããŒã¹èšèšã®ã«ãŒã«ïŒå®è£
ã³ãŒãçŠæ¢ïŒ /docs/article/CLAUDE.md èšäºå·çã¬ã€ã ããã°èšäºå·çã®æäœãæ§æãããã¥ã¡ã³ãæ§é /docs/tools/CLAUDE.md ããŒã«äœ¿çšã¬ã€ã Docs å°çšããŒã«ïŒããã° HTML æœåºçïŒã®äœ¿ç𿹿³ /application/backend/CLAUDE.md ããã¯ãšã³ãéçºã¬ã€ã NestJS éçºã«ãŒã«ãç°å¢å€æ°ç®¡çããã¹ãå®è¡æ¹æ³ /application/frontend/CLAUDE.md ããã³ããšã³ãéçºã¬ã€ã Next.js éçºã«ãŒã«ãã€ã³ããŒããã¹èŠå /application/functions/CLAUDE.md X Scheduler éçºã¬ã€ã Azure Functions éçºã«ãŒã«ãTimer Trigger èšå® /application/blog-search-mcp-functions/CLAUDE.md MCP Functions éçºã¬ã€ã MCP Server éçºã«ãŒã«ãSupabase 飿º /infrastructure/CLAUDE.md ã€ã³ãã©éçºã¬ã€ã Azure Bicep éçºã«ãŒã«ããããã€æé ã³ã³ããã¹ãç¶æ¿ãã¿ãŒã³ CLAUDE.md ã¯ã éå±€çã«ã³ã³ããã¹ããç¶æ¿ ããŸãã ç¶æ¿ã®äŸ : ã«ãŒã CLAUDE.md ãèªã â ãããžã§ã¯ãå
šäœæ§æãçè§£ ãµããã£ã¬ã¯ããªã® CLAUDE.md ãèªã â åé åã®è©³çްã«ãŒã«ãçè§£ AI ãé©åãªå€æãäžã å®éã®åã : AI: ããŠãŒã¶ãŒãããã³ããšã³ãã®éçºãäŸé ŒããŠããã â AI: ããŸã /CLAUDE.md ãèªãã§å
šäœåãææ¡ãããã â AI: ãæ¬¡ã« /application/frontend/CLAUDE.md ãèªãã§è©³çްã«ãŒã«ã確èªã â AI: ãã€ã³ããŒããã¹ã¯ @/* ã䜿ãã¹ãã ãªã AI: ãAPIåå®çŸ©ã¯èªåçæããããããæåã§æžãã¡ããã¡ã ãªã â AI: é©åãªã³ãŒããææ¡ ã«ãŒã CLAUDE.md ã®éèŠæ§ ã«ãŒã CLAUDE.md ïŒ /CLAUDE.md ïŒã¯ãæãéèŠãªããã¥ã¡ã³ãã§ãã èšèŒå
容ã®äŸ # CLAUDE.md ## Project Architecture Overview LINE LIFF AI Prompt Battle - An AI-powered game platform... ### Directory Structure & Responsibilities / âââ docs/ # Planning & Design Phase â âââ features/ # Feature specifications â âââ bugs/ # Bug investigation & fix plans â âââ research/ # Implementation validation â âââ article/ # Blog article research âââ application/ â âââ backend/ # NestJS 11 API Server â âââ frontend/ # Next.js 15 App Router â âââ functions/ # Azure Functions â âââ blog-search-mcp-functions/ # MCP Server âââ infrastructure/ # Azure Bicep IaC **Workflow Pattern (4-Phase Workflow)**: 1. **èšç»ãã§ãŒãº** - Plan in `/docs/` 2. **å®è£
ãã§ãŒãº** - Implement in `/application/` 3. **ç ç©¶èšé²ãã§ãŒãº** - Document findings in `/docs/research/` 4. **èšäºåãã§ãŒãº** - Gather materials in `/docs/article/` ## Common Development Commands ### Backend (NestJS) npm run start:dev # Development with watch mode npm run generate:openapi # Generate OpenAPI spec ### Frontend (Next.js) npm run generate:api # Generate types from OpenAPI npm run dev:full # generate:api + dev server ## Critical Import Path Rules ### Frontend: Use `@/*` Path Aliases // ✅ CORRECT import { Button } from '@/components/ui/button'; // ❌ WRONG import { Button } from '../components/ui/button'; ãã€ã³ã : ãããžã§ã¯ãå
šäœæ§æ ãäžç®ã§çè§£ã§ãã 4 ãã§ãŒãºã¯ãŒã¯ãã㌠ãæèš å
±ééçºã³ãã³ã ãèšèŒ ã€ã³ããŒããã¹èŠå çã®éèŠã«ãŒã«ãèšèŒ â»æ³š : äžèšã³ãŒãäŸã¯ãå®éã®ãããžã§ã¯ã CLAUDE.md ã§ã®èšèŒäŸã§ããæ¬èšäºã§ã¯ã4 ãã§ãŒãºã¯ãŒã¯ãããŒããŸãã¯ãããã¥ã¡ã³ãé§ååéçºããšåŒç§°ããŠããŸãã ãã®ã«ãŒã CLAUDE.md ãããããšã§ãAI 㯠åããŠãããžã§ã¯ãã«è§Šããæã§ããå
šäœåãå³åº§ã«çè§£ ã§ããŸãã CLAUDE.md éå±€æ§é ã®å¹æ ãã®éå±€æ§é ã«ããã以äžã®å¹æãåŸãããŸããïŒ AI ã®çè§£é床ãåäž ã«ãŒã CLAUDE.md ã§å
šäœåãææ¡ãããµããã£ã¬ã¯ããªã§è©³çްãçè§£ äžè²«æ§ã®ããã³ãŒãçæ ãã¹ãŠã®éçºè
ïŒäººéã AI ãïŒãåãã«ãŒã«ã«åŸã æå説æã®åæž ãã©ããããããžã§ã¯ãïŒããšèãããããšããªããªã£ã ãªã³ããŒãã£ã³ã°æéã®ççž® æ°ãã AI ã»ãã·ã§ã³ãæ°ããéçºè
ãå³åº§ã«çè§£ã§ãã ããã¥ã¡ã³ãé§ååéçºã®å®è·µïŒ3 ãã§ãŒãº â4 ãã§ãŒãºãžã®é²åïŒ Claude Code ã§ã®éçºãå¹çåããããã èšç» â å®è£
â ç ç©¶èšé² â èšäºåã® 4 ãã§ãŒãºã¯ãŒã¯ãããŒ ãæ§ç¯ããŸããã 3 ãã§ãŒãºéçºãã 4 ãã§ãŒãºéçºãžã®é²å ãã®ã¯ãŒã¯ãããŒã¯ã æ¢åã® 3 ãã§ãŒãºéçºãåºç€ã«æ§ç¯ ãããŠããŸãïŒ å
ã
ã® 3 ãã§ãŒãºéçº ïŒ èšç» â å®è£
â æ€èšŒè¡ ã 仿§æžã¢ã¬ã«ã®ãŒå
æ ã§è§£èª¬ïŒ: èšç» : /docs/ ã§ä»æ§çå®ïŒå®è£
ã³ãŒãã¯æžããªãïŒ å®è£
: /application/ ã§å®è£
æ€èšŒ : èšç»ãšå®è£
ã®å·®ç°ãåæ 4 ãã§ãŒãºãžã®æ¡åŒµ ïŒ ç¥èŠãè³ç£åããèšäº ã§è©³çŽ°è§£èª¬ïŒ: ãã§ãŒãº 3 ããç ç©¶èšé²ããšããŠäœç³»å : æ€èšŒãã§ãŒãºã§åŸãç¥èŠã /docs/research/ ã«èšé² ãã§ãŒãº 4ãèšäºåãã远å : ç ç©¶èšé²ãå
ã« /docs/article/ ã§èšäºå·ç RAG ãã©ãã·ã¹ãã : æ¢åèšäºåç
§ã§ããŒã¯ã³æ° 50-60%åæž æäœè£æ£ã·ã¹ãã : äžè²«ããèšäºå質ãå®çŸ åãã§ãŒãºã®æŠèŠ ãã§ãŒãº 1: èšç» ( /docs/features/ ) ç®ç : å®è£
åã®èšèšã»ä»æ§çå®ïŒå®è£
ã³ãŒãã¯äžåæžããªãïŒ ææç© : åå®çŸ©ãAPI èšèšãããŒã¿ããŒã¹æ§é ãã¢ãŒããã¯ãã£èšèš 广 : éçºæé 1 é±é â2 æ¥ã«ççž®ïŒ ä»æ§æžã¢ã¬ã«ã®ãŒå
æã®èšäº ã§è©³çŽ°è§£èª¬ïŒ éèŠã«ãŒã« : CLAUDE.md ã§å®è£
ã³ãŒãèšè¿°ãçŠæ¢ããããšã§ãAI ãèšèšã«éäž ãã§ãŒãº 2: å®è£
( /application/ ) ç®ç : èšç»ã«åºã¥ããå®è£
å®è£
é åº : Backend â Frontend â Functions 广 : å°èŠæš¡ã·ã¹ãã ã§ 30 åãäžèŠæš¡ã§ 2 æ¥çšåºŠïŒ 3 ãã§ãŒãºéçºã®èšäº ã§å®äŸç޹ä»ïŒ ãã§ãŒãº 3: ç ç©¶èšé² ( /docs/research/ ) ç®ç : å®è£
å®äºåŸã®ç¥èŠã»ã¢ãŒããã¯ãã£æ€èšŒçµæãããã¥ã¡ã³ãå èšèŒå
容 : èšèšææ³ãã¢ãŒããã¯ãã£ãã¿ãŒã³ãæ€èšŒçµæ éèŠæ§ : èšç»ãšå®è£
ã®å·®ç°ãåæãã仿§æŒããç¹å® â»è£è¶³ : 3 ãã§ãŒãºéçºã®èšäº ã§ãæ€èšŒãã§ãŒãºããšããŠè§£èª¬ããŠããå
容ãããã®ãããžã§ã¯ãã§ã¯ãç ç©¶èšé²ãã§ãŒãºããšããŠäœç³»åããŠããŸããå®è£
å®äºåŸã«èšç»ãšå®è£
ã®å·®ç°ãåæããç¥èŠãšããŠèšé²ããŸãã ãã§ãŒãº 4: èšäºå ( /docs/article/ ) ç®ç : æè¡ããã°å·çã«å¿
èŠãªæ
å ±åéã»èª¿æ»ã ç¥èŠã®è³ç£å ææç© : research-doc.md ïŒèª¿æ»è³æïŒã no1-article.md ïŒèšäºæ¬æïŒ åç
§å
: /docs/features/ + /docs/research/ + /application/ å¹çåããŒã« ïŒ ç¥èŠãè³ç£åããèšäº ã§è©³çŽ°è§£èª¬ïŒ: RAG ãã©ã ïŒfetch-blog-html.tsïŒ: æ¢åèšäºåç
§ã§ããŒã¯ã³æ° 50-60%åæž æäœè£æ£ ïŒwriting-style-prompt.mdïŒ: äžè²«ããèšäºå質 èšäºå·çæé 50%åæž : 調æ»è³æããèšäºå·çãŸã§ã®èªåå éè€ãã§ã㯠83%åæž : æ¢åèšäºãšã®éè€ãèªåæ€åº ãã®ã¯ãŒã¯ãããŒã®å¹æ ç¥èŠãèªç¶ã«èç© – å®è£
ãšåæã«ããã¥ã¡ã³ããäœæããã èšäºåãã¹ã ãŒãº – èšç» â æ€èšŒ â å®è£
ã³ãŒããåç
§ããã ã ææ»ããæžå° – èšç»ãã§ãŒãºã§èšèšãåºããããšã§ãå®è£
æã®ææ»ããæžå° éçºæé 1 é±é â2 æ¥ã«ççž®ïŒèšç»ãã§ãŒãºã®å¹æïŒ AI ãšã®åæ¥ãå¹çå – åãã§ãŒãºã§ AI ã«æç¢ºãªåœ¹å²ãäžãããã ç¥èŠãè³ç£åããã – ãã§ãŒãº 4ïŒèšäºåïŒã«ãããéçºç¥èŠãåå©çšå¯èœãªããã°èšäºãšããŠèç© æ¢åèšäºãšã®éè€ãã§ã㯠83%åæž æè¡ããã°ã®ã©ã€ãã©ãªãèªç¶ã«åœ¢æããã åå®å
šãª API éçºãã€ãã©ã€ã³ Frontend ãš Backend ã®åãºã¬ããŒãã«ãã åå®å
šãã€ãã©ã€ã³ ã«ã€ããŠã¯ãå¥èšäºã§è©³ãã解説ããŠããŸãã 詳现ãåŠã¶ : AI ãšçééçºïŒNext.jsÃNest.js åå®çŸ©åæã®èªåçæãã€ãã©ã€ã³æ§ç¯è¡ Single Source of Truth ã®åå ãã®ãããžã§ã¯ãã§ã¯ã Backend DTOs ãå¯äžã®çå® ãšããŠããŸãã Frontend ã®åå®çŸ©ã¯ãBackend ããèªåçæããããã æåã§åå®çŸ©ãåæããäœæ¥ãäžèŠ ã«ãªããŸãã åå®å
šãã€ãã©ã€ã³ã®å¹æ åãºã¬ãŒã – Backend ãš Frontend ã®åãåžžã«äžèŽ æååæäœæ¥ã®æ²æ»
– åå®çŸ©ãæåã§ã³ããŒïŒããŒã¹ãããå¿
èŠããªã ãªãã¡ã¯ã¿ãªã³ã°æã®å®å
šæ§ – Backend ã®åã倿ŽãããšãFrontend ã§ã³ã³ãã€ã«ãšã©ãŒãåºã éçºé床åäž – åå®çŸ©ãæžãæéãäžèŠã«ãªããå®è£
ã«éäžã§ãã ã¢ãã¬ã CI/CD ãã€ãã©ã€ã³: paths ãã£ã«ã¿ã®åšå 次ã«ã4 ã€ã®ã¢ããªã±ãŒã·ã§ã³ã䞊è¡ãããã€ãã æé©åããã CI/CD ãã€ãã©ã€ã³ ã«ã€ããŠè§£èª¬ããŸãã 4 ã€ã®ç¬ç«ããã¯ãŒã¯ãã㌠ãã®ãããžã§ã¯ãã§ã¯ã 4 ã€ã®ç¬ç«ãã GitHub Actions ã¯ãŒã¯ãã㌠ã䜿çšããŠããŸãã ã¯ãŒã¯ãã㌠ããªã¬ãŒãã¹ ãããã€å
ãã«ãæéïŒå¹³åïŒ frontend-swa-deploy.yml application/frontend/** Azure Static Web Apps 3 å backend-docker-build.yml application/backend/** GitHub Container Registry â Azure Web Apps 5 å deploy-x-scheduler-functions.yml application/functions/** Azure Functions (X Scheduler) 2 å deploy-blog-search-mcp-functions.yml application/blog-search-mcp-functions/** Azure Functions (MCP Server) 2 å paths ãã£ã«ã¿ã«ããæé©å èª²é¡ : ã¢ãã¬ãå
šäœããã«ããããšã倿Žã®ãªãã¢ããªããã«ãããæéãããã 解決ç : GitHub Actions ã® paths ãã£ã«ã¿ã§ã倿Žããããã£ã¬ã¯ããªã®ã¿ãããªã¬ãŒ äŸ: Frontend SWA Deploy # .github/workflows/frontend-swa-deploy.yml name: Frontend SWA Deploy on: push: branches: - main paths: - "application/frontend/**" - ".github/workflows/frontend-swa-deploy.yml" workflow_dispatch: ãã€ã³ã : paths ãã£ã«ã¿ã§ application/frontend/** ã®ã¿ãããªã¬ãŒ Backend ã倿ŽããŠããFrontend ã®ã¯ãŒã¯ãããŒã¯å®è¡ãããªã Before/After æ¯èŒ BeforeïŒpaths ãã£ã«ã¿ãªãïŒ Backend ãå€æŽ â å
šã¯ãŒã¯ãããŒå®è¡ïŒFrontend, Backend, Functions, MCP FunctionsïŒ â åèšãã«ãæé: 12åïŒ3 + 5 + 2 + 2ïŒ AfterïŒpaths ãã£ã«ã¿ããïŒ Backend ãå€æŽ â Backend ã¯ãŒã¯ãããŒã®ã¿å®è¡ â åèšãã«ãæé: 5åïŒ58%åæžïŒ äžŠè¡ãããã€ã®å®çŸ 4 ã€ã®ã¯ãŒã¯ãããŒã ç¬ç«ããŠãã ãããè€æ°ã®ã¢ããªãåæã«å€æŽããå Žåã 䞊è¡ããã〠ãå®çŸãããŸãã Frontend ãš Backend ãåæã«å€æŽ â frontend-swa-deploy.yml ãš backend-docker-build.yml ã䞊è¡å®è¡ â åèšãã«ãæé: 5åïŒé次å®è¡ãªã8åïŒ CI/CD ãã€ãã©ã€ã³ã®å¹æ ãã«ãæé 58%åæž – paths ãã£ã«ã¿ã«ããã倿Žã®ãªãã¢ããªã¯ãã«ããããªã 䞊è¡ããã〠– è€æ°ã®ã¢ããªãåæã«å€æŽããŠãã䞊è¡å®è¡ã§æéççž® å®å
šãªããã〠– åã¢ããªãç¬ç«ããŠãããããFrontend ã®ãããã€å€±æã Backend ã«åœ±é¿ããªã éçºäœéšã®å€åïŒBefore/AfterïŒ ã¢ãã¬ã ÃAI 忥éçºç°å¢ãå°å
¥ããååŸã§ãéçºäœéšãã©ãå€ãã£ãããæ¯èŒããŸãã BeforeïŒã¢ãã¬ã ÃAI ç°å¢å°å
¥åïŒ åé¡ç¹ AI ã«æ¯åãããžã§ã¯ãæ§æã説æ éçºè
: ããŠãŒã¶ãŒç®¡çæ©èœãå®è£
ããŠã AI: ããã®ãããžã§ã¯ãã¯ã©ãããæ§æã§ããïŒã éçºè
: ãBackendã¯...Frontendã¯...ãïŒæ¯å説æïŒ CI/CD ãã«ãæéã®å¢å Backend ãå€æŽ â å
šã¯ãŒã¯ãããŒå®è¡ïŒFrontend, Backend, FunctionsïŒ â åèšãã«ãæé: 12å ããã¥ã¡ã³ããæ£ãã°ã£ãŠãã©ãã«äœããããããããªã èšç»ããã¥ã¡ã³ã: Notion å®è£
ã³ã¡ã³ã: ã³ãŒãå
ããã°èšäº: å¥ãªããžããª â æ
å ±ãæ£ãã°ã£ãŠãã©ãã«äœããããããããªã AfterïŒã¢ãã¬ã ÃAI ç°å¢å°å
¥åŸïŒ æ¹åç¹ AI ãèªåŸçã«ãããžã§ã¯ãæ§æãçè§£ éçºè
: ããŠãŒã¶ãŒç®¡çæ©èœãå®è£
ããŠã AI: ã/CLAUDE.md ã確èªããŸãã AI: ã/application/backend/CLAUDE.md ã確èªããŸãã AI: ãåå®å
šãã€ãã©ã€ã³ã«åŸã£ãŠå®è£
ããŸãã CI/CD ãã«ãæé 50%åæž Backend ãå€æŽ â Backend ã¯ãŒã¯ãããŒã®ã¿å®è¡ïŒpathsãã£ã«ã¿ïŒ â åèšãã«ãæé: 5åïŒ50%åæžïŒ ããã¥ã¡ã³ããèªç¶ã«èç©ããè³ç£åããã 4ãã§ãŒãºã¯ãŒã¯ãã㌠èšç» (/docs/features/) â å®è£
(/application/) â ç ç©¶èšé² (/docs/research/) â èšäºå (/docs/article/) ââ RAGãã©ãïŒfetch-blog-html.tsïŒã§ããŒã¯ã³æ°50-60%åæž ââ æäœè£æ£ïŒwriting-style-prompt.mdïŒã§äžè²«ããèšäºå質 â æ
å ±ãæŽçãããç¥èŠãè³ç£åããã æè¡ããã°ã®ã©ã€ãã©ãªãèªç¶ã«åœ¢æããã å®éçãªå¹æ ææš Before After æ¹åç åæèª¬ææé 10 å/ã»ãã·ã§ã³ ã»ãŒäžèŠïŒCLAUDE.md ã§èªåŸçè§£ïŒ å€§å¹
åæž CI/CD ãã«ãæé 12 å 5 å 58%åæž ããã¥ã¡ã³ãã¡ã³ããã³ã¹æé é± 5 æé é± 2 æé 60%åæž æ°æ©èœéçºã¹ããŒã 2 é±é 1 é±é 50%ççž® èšäºå·çæé 6-8 æé 3-4 æé 50%åæž â»æž¬å®æ¡ä»¶ : å°èŠæš¡ãäžèп𡿩èœéçºïŒããã¯ãšã³ã API ãšã³ããã€ã³ã 2-4 åãããã³ããšã³ãç»é¢ 1-2 åèŠæš¡ïŒã§ã®å®æž¬å€ã§ãããããžã§ã¯ãã®èŠæš¡ãè€éãã«ãã£ãŠå¹æã¯å€åããŸããèšäºå·çæéã¯ã調æ»è³æäœæããèšäºæ¬æå·çãŸã§ã®åèšæéã§ãã éŸã¡ããã®ææ å°å
¥åã®èª²é¡ : ãããžã§ã¯ããå°ãããã¡ã¯åé¡ãªãã£ããã§ãããããããªæ€èšŒãè©°ã蟌ãã§ãããžã§ã¯ãã倧ãããªã£ãŠãããšã ããã¥ã¡ã³ããç·šéããã ãã§ãã«ããèµ°ã ãšããåé¡ãåºãŠããŸãããé©åã«ãã«ããåå²ããããšã§ãäžèŠãª CI/CD ã®å®è¡ãæããå¿
èŠãåºãŠãããã§ãã ãŸããããã³ããšã³ãã»ããã¯ãšã³ãã»FunctionsïŒãããåŠçïŒãšããè€æ°ã®æ§æã§ã¢ããªãäœã£ãŠããã®ã§ã API 飿ºãããŒã¿ããŒã¹é£æºãã¹ã ãŒãºã«è¡ããç°å¢ ãå¿
èŠã§ãããäŸãã°ãããã¯ãšã³ãã§ããŒã¿ããŒã¹ã«æ
å ±ãå
¥ããŠãããããããåŠçã§ååŸããŠå®è¡ãããããªé£æºã§ããã AI 忥éçºã§ã®æ°ã¥ã : AI ãšéçºããäžã§ãããã³ããšã³ããšããã¯ãšã³ãã®åãºã¬ãè§£æ¶ããããã«ãã ã¢ããªã±ãŒã·ã§ã³å
šäœã AI ã«èŠãã圢ã§äžã€ã«éçŽãã ããšããã¯ã倧äºã ãªãšå®æããŸãããããã¯èªåã®äžã§ãããã广çã§ãããã æ€èšŒãšããã°å·çã®èª²é¡ : èªåã®æ€èšŒã¹ã¿ã€ã«ãšããŠããã€ã³ããããå
¥ãããã¢ãŠãããããåºãããšããã®ãåŒç€Ÿã®ç念ã§ãããããã®ããã°ã®æçŸ©ã§ãããã®ã§ãæ€èšŒãšããã°å·çã¯ã»ããã§èããŠããŸããã ãã ãæ€èšŒãçµãã£ãåŸã«ãå¥ã§ããã°ãæžãããã®ã·ã¹ãã ãç«ã¡äžããŠâŠãšããã®ãå²ãšé¢åã«ãªã£ãŠãããã§ãããã 3 幎㧠200 èšäºãããæžããŠãããã§ãããã ãã ãæ€èšŒããå
容ã倧ãããªã£ãŠããŠãèšäºãé·ããªã£ãŠããŸããã ãœãŒã¹ã³ãŒãåç
§ã®èª²é¡ãšè§£æ±ºç : èšäºãæžãéã« ãœãŒã¹ã³ãŒããåç
§ããããšãå¢ã㊠ãããã§ãããåç
§ãããã¡ã€ã«ãå¢ããã°å¢ããã»ã©ãããã°ãæžãéå£ãã©ãã©ãäžãã£ãŠããŸããã ããã§ã ãªããžããªããçŽæ¥æ
å ±ãåžãåºããŠããã°ãæžãã·ã¹ãã ïŒ4 ãã§ãŒãºã¯ãŒã¯ãããŒãRAG ãã©ããæäœè£æ£ïŒãæ§ç¯ããããšã§ãããã°å·çã®å¹çåãããã«é²ãã ãšæããŠããŸãïŒè©³çŽ°ã¯ æ€èšŒ â èšäºåã§ç¥èŠãè³ç£åïŒClaude CodeÃRAG ãã©ãã§ AI æè¡ããã°å·çãå¹çå ãåç
§ïŒã ãŸãšã ãã®èšäºã§ã¯ã ã¢ãã¬ã ÃAI 忥éçºç°å¢ ã®æ§ç¯è¡ã«ã€ããŠè§£èª¬ããŸããã ã¢ãã¬ã ÃAI 忥éçºç°å¢ã®ãã€ã³ã CLAUDE.md éå±€æ§é ã§ã³ã³ããã¹ã管ç 9 ã€ã® CLAUDE.md ãã¡ã€ã«ã§ãAI ã«é©åãªç²åºŠã®æ
å ±ãæäŸ 4 ãã§ãŒãºã¯ãŒã¯ãããŒïŒèšç» â å®è£
â ç ç©¶èšé² â èšäºåïŒ ããã¥ã¡ã³ãé§ååéçºã§ãç¥èŠãèªç¶ã«èç©ãããè³ç£åããã 3 ãã§ãŒãºéçºãåºç€ã«ããã§ãŒãº 4ïŒèšäºåïŒã远å RAG ãã©ããæäœè£æ£ã«ããèšäºå·çå¹çå åå®å
šãã€ãã©ã€ã³ïŒBackend DTOs â OpenAPI â Frontend TypesïŒ Single Source of Truth ã§ãåãºã¬ãŒããå®çŸïŒ åå®å
šãã€ãã©ã€ã³ã®è©³çްèšäº ïŒ paths ãã£ã«ã¿ã«ããæé©å CI/CD 4 ã€ã®ç¬ç«ã¯ãŒã¯ãããŒã§ããã«ãæé 58%åæž éçºäœéšã®å€å Before After AI ã«æ¯åãããžã§ã¯ãæ§æã説æ CLAUDE.md ã§èªåŸçã«çè§£ CI/CD ãã«ãæé 12 å paths ãã£ã«ã¿ã§ 5 åïŒ58%åæžïŒ ããã¥ã¡ã³ããæ£ãã°ã 4 ãã§ãŒãºã¯ãŒã¯ãããŒã§èªç¶ã«èç©ãè³ç£å èšäºå·çã«æéãããã RAG ãã©ããæäœè£æ£ã§ 50%åæž 次ã®ã¹ããã ãã®èšäºãèªãã§ãã¢ãã¬ã ÃAI 忥éçºç°å¢ã«èå³ãæã£ãæ¹ã¯ã以äžã®ã¹ãããã§å®è·µããŠã¿ãŠãã ããïŒ 1. CLAUDE.md ãäœæ ãŸãã¯ããããžã§ã¯ãã«ãŒãã« CLAUDE.md ãäœæãããããžã§ã¯ãå
šäœåãèšèŒããŸãã # CLAUDE.md ## Project Architecture Overview ïŒãããžã§ã¯ãã®æŠèŠïŒ ### Directory Structure ïŒãã£ã¬ã¯ããªæ§é ïŒ ## Workflow Pattern (4-Phase Workflow) 1. **èšç»ãã§ãŒãº** - Plan in `/docs/` 2. **å®è£
ãã§ãŒãº** - Implement in `/application/` 3. **ç ç©¶èšé²ãã§ãŒãº** - Document findings in `/docs/research/` 4. **èšäºåãã§ãŒãº** - Gather materials in `/docs/article/` 2. paths ãã£ã«ã¿ãå°å
¥ GitHub Actions ã¯ãŒã¯ãããŒã« paths ãã£ã«ã¿ã远å ããŸãã on: push: branches: - main paths: - "application/frontend/**" 3. 4 ãã§ãŒãºã¯ãŒã¯ãããŒãå®è·µ æ°æ©èœéçºæã¯ãèšç» â å®è£
â ç ç©¶èšé² â èšäºåã® 4 ãã§ãŒãºãé ã«é²ããŸãã 詳现㯠3 ãã§ãŒãºéçºã®åºæ¬ãåŠã¶èšäº ãåç
§ããŠãã ããã åèãªã³ã¯ é¢é£èšäºïŒæ¬ãµã€ãïŒ AI 忥éçºææ³ã·ãªãŒãº Claude Code é©åœïŒ3 ãã§ãŒãºéçºã§å¹ççãªéçºïŒèšç» â å®è£
â æ€èšŒè¡ AI ååã§ä»æ§æžã¢ã¬ã«ã®ãŒå
æïŒéçºæéã 1 é±é â2 æ¥ã«ççž®ããå®è·µæ³ æ€èšŒ â èšäºåã§ç¥èŠãè³ç£åïŒClaude CodeÃRAG ãã©ãã§ AI æè¡ããã°å·çãå¹çå åå®å
šãã€ãã©ã€ã³ AI ãšçééçºïŒNext.jsÃNest.js åå®çŸ©åæã®èªåçæãã€ãã©ã€ã³æ§ç¯è¡ å
¬åŒããã¥ã¡ã³ã Claude Code å
¬åŒããã¥ã¡ã³ã NestJS å
¬åŒããã¥ã¡ã³ã Next.js å
¬åŒããã¥ã¡ã³ã GitHub Actions å
¬åŒããã¥ã¡ã³ã Orval å
¬åŒããã¥ã¡ã³ã ãããŸã§èªãã§ããã ããããããšãããããŸããïŒ ã¢ãã¬ã ÃAI 忥éçºç°å¢ãæ§ç¯ããããšã§ãéçºäœéšãåçã«åäžããŸãããã²ããã®èšäºãåèã«ãããªãã®ãããžã§ã¯ãã§ãå®è·µããŠã¿ãŠãã ããã 質åãææ³ã¯ãã³ã¡ã³ãæ¬ã§ãåŸ
ã¡ããŠãããŸãããŸããTwitter ã®ã»ãããããããé¡ãããŸãïŒ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post AI 忥éçºç°å¢ã®æ§ç¯è¡ïœã¢ãã¬ãã§ãã«ãæéã倧å¹
ççž®ãã CLAUDE.md æŽ»çšæ³ first appeared on SIOS Tech. Lab .
åç»
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
æžç±
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã










