chore: convert to Turborepo + npm workspaces monorepo
- Move React/Vite frontend to apps/web/ (@budgetwise/web)
- Add apps/appwrite/ (@budgetwise/appwrite) to source-control the
Appwrite backend: declarative schema in appwrite.json (5 collections),
CLI-based deploy.sh for containerized use, functions/ dir for future
Appwrite Functions
- Add turbo.json for task orchestration (build, deploy, dev)
- Replace .gitlab-ci.yml with Woodpecker CI pipelines in .woodpecker/:
web-production.yml — push to main → build + rsync to prod
web-staging.yml — push to staging → build + rsync to staging
web-preview.yml — PR open → deploy to {pr}.{domain}; PR close → cleanup
appwrite.yml — schema changes in apps/appwrite/ → CLI deploy
- All secrets injected via Woodpecker CI (no committed .env files)
This commit is contained in:
78
.woodpecker/web-preview.yml
Normal file
78
.woodpecker/web-preview.yml
Normal file
@@ -0,0 +1,78 @@
|
||||
# ── Web: Preview (Pull Requests) ──────────────────────────────────────────────
|
||||
# Triggered on pull_request open/sync → deploys to https://{pr-number}.{base_domain}
|
||||
# Triggered on pull_request_closed → cleans up the preview directory
|
||||
#
|
||||
# Preview environments share staging Appwrite credentials.
|
||||
# PR number is available as $CI_COMMIT_PULL_REQUEST.
|
||||
#
|
||||
# Required Woodpecker secrets:
|
||||
# base_domain e.g. budget.kushalgaywala.com
|
||||
# staging_appwrite_endpoint
|
||||
# staging_appwrite_project_id
|
||||
# ssh_private_key
|
||||
# deploy_host
|
||||
# deploy_user
|
||||
# deploy_path
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
when:
|
||||
- event: [pull_request, pull_request_closed]
|
||||
|
||||
steps:
|
||||
- name: build
|
||||
image: node:20-alpine
|
||||
environment:
|
||||
BASE_DOMAIN:
|
||||
from_secret: base_domain
|
||||
VITE_APPWRITE_ENDPOINT:
|
||||
from_secret: staging_appwrite_endpoint
|
||||
VITE_APPWRITE_PROJECT_ID:
|
||||
from_secret: staging_appwrite_project_id
|
||||
commands:
|
||||
- export MR_URL="https://$CI_COMMIT_PULL_REQUEST.$BASE_DOMAIN"
|
||||
- npm ci
|
||||
- VITE_APP_URL=$MR_URL npm run build:preview -w @budgetwise/web
|
||||
when:
|
||||
- event: pull_request
|
||||
|
||||
- name: deploy
|
||||
image: alpine
|
||||
environment:
|
||||
SSH_PRIVATE_KEY:
|
||||
from_secret: ssh_private_key
|
||||
DEPLOY_HOST:
|
||||
from_secret: deploy_host
|
||||
DEPLOY_USER:
|
||||
from_secret: deploy_user
|
||||
DEPLOY_PATH:
|
||||
from_secret: deploy_path
|
||||
commands:
|
||||
- apk add --no-cache rsync openssh-client
|
||||
- eval $(ssh-agent -s)
|
||||
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
|
||||
- mkdir -p ~/.ssh && chmod 700 ~/.ssh
|
||||
- ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts
|
||||
- rsync -avz --delete apps/web/dist/ "$DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/mr-$CI_COMMIT_PULL_REQUEST/"
|
||||
when:
|
||||
- event: pull_request
|
||||
|
||||
- name: cleanup
|
||||
image: alpine
|
||||
environment:
|
||||
SSH_PRIVATE_KEY:
|
||||
from_secret: ssh_private_key
|
||||
DEPLOY_HOST:
|
||||
from_secret: deploy_host
|
||||
DEPLOY_USER:
|
||||
from_secret: deploy_user
|
||||
DEPLOY_PATH:
|
||||
from_secret: deploy_path
|
||||
commands:
|
||||
- apk add --no-cache openssh-client
|
||||
- eval $(ssh-agent -s)
|
||||
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
|
||||
- mkdir -p ~/.ssh && chmod 700 ~/.ssh
|
||||
- ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts
|
||||
- ssh "$DEPLOY_USER@$DEPLOY_HOST" "rm -rf $DEPLOY_PATH/mr-$CI_COMMIT_PULL_REQUEST"
|
||||
when:
|
||||
- event: pull_request_closed
|
||||
Reference in New Issue
Block a user