chore: README — arkitektur, teststrategi, funktionsöversikt (#14) #6
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Deploy | |
| # CD-skelett. Deployar vid push till main (produktion). Varje steg är gated på att | |
| # motsvarande secret finns, så workflowen är en no-op tills du konfigurerat secrets. | |
| # | |
| # Alternativ: Cloudflare Pages och Render kan också auto-deploya via sina egna | |
| # Git-integrationer (som VMPage gör — se SPEC-BRIEF/DEPLOYMENT). Välj EN väg per tjänst | |
| # så du inte deployar dubbelt. Den här filen är Actions-vägen. | |
| # | |
| # Secrets som behövs (Settings → Secrets and variables → Actions): | |
| # CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_PAGES_PROJECT (frontend) | |
| # RENDER_DEPLOY_HOOK_URL (backend) | |
| # VITE_API_BASE_URL (kan vara en repo-variable i stället) | |
| on: | |
| push: | |
| branches: [main] | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| concurrency: | |
| group: deploy-${{ github.ref }} | |
| cancel-in-progress: false | |
| jobs: | |
| frontend: | |
| name: Frontend → Cloudflare Pages | |
| runs-on: ubuntu-latest | |
| env: | |
| CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} | |
| CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} | |
| CF_PAGES_PROJECT: ${{ secrets.CLOUDFLARE_PAGES_PROJECT }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Saknas konfig? | |
| if: ${{ env.CLOUDFLARE_API_TOKEN == '' || hashFiles('frontend/package.json') == '' }} | |
| run: echo "::notice::Hoppar över frontend-deploy (saknar Cloudflare-secrets eller frontend/)." | |
| - name: Setup Node | |
| if: ${{ env.CLOUDFLARE_API_TOKEN != '' && hashFiles('frontend/package.json') != '' }} | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| cache: npm | |
| cache-dependency-path: frontend/package-lock.json | |
| - name: Build | |
| if: ${{ env.CLOUDFLARE_API_TOKEN != '' && hashFiles('frontend/package.json') != '' }} | |
| working-directory: frontend | |
| env: | |
| VITE_API_BASE_URL: ${{ secrets.VITE_API_BASE_URL }} | |
| run: | | |
| npm ci | |
| npm run build | |
| - name: Deploy till Cloudflare Pages | |
| if: ${{ env.CLOUDFLARE_API_TOKEN != '' && hashFiles('frontend/package.json') != '' }} | |
| uses: cloudflare/wrangler-action@v3 | |
| with: | |
| apiToken: ${{ env.CLOUDFLARE_API_TOKEN }} | |
| accountId: ${{ env.CLOUDFLARE_ACCOUNT_ID }} | |
| command: pages deploy frontend/dist --project-name=${{ env.CF_PAGES_PROJECT }} | |
| backend: | |
| name: Backend → Render | |
| runs-on: ubuntu-latest | |
| env: | |
| RENDER_DEPLOY_HOOK_URL: ${{ secrets.RENDER_DEPLOY_HOOK_URL }} | |
| steps: | |
| - name: Trigga Render-deploy | |
| if: ${{ env.RENDER_DEPLOY_HOOK_URL != '' }} | |
| run: curl -fsSL -X POST "$RENDER_DEPLOY_HOOK_URL" | |
| - name: Saknas hook? | |
| if: ${{ env.RENDER_DEPLOY_HOOK_URL == '' }} | |
| run: echo "::notice::Hoppar över backend-deploy (saknar RENDER_DEPLOY_HOOK_URL)." |