Telegram Bot + Mini App for city walking quests. - React 19 + TypeScript + Vite 6 frontend - Express 5 + PostgreSQL backend - grammY Telegram bot with DeepSeek AI - GitLab CI/CD: lint, build, deploy to production Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
71 lines
1.6 KiB
YAML
71 lines
1.6 KiB
YAML
stages:
|
|
- lint
|
|
- build
|
|
- deploy
|
|
|
|
# Шаблон: Node.js 22 + кэш node_modules
|
|
.node_setup:
|
|
image: node:22-alpine
|
|
before_script:
|
|
- npm ci --prefer-offline
|
|
cache:
|
|
key:
|
|
files:
|
|
- package-lock.json
|
|
paths:
|
|
- node_modules/
|
|
|
|
# Lint — на каждый push и MR
|
|
lint:
|
|
extends: .node_setup
|
|
stage: lint
|
|
script:
|
|
- npm run lint
|
|
|
|
# Build — компиляция TS + Vite сборка
|
|
build:
|
|
extends: .node_setup
|
|
stage: build
|
|
script:
|
|
- npm run build
|
|
artifacts:
|
|
paths:
|
|
- dist/
|
|
- dist-server/
|
|
- dist-bot/
|
|
expire_in: 1 hour
|
|
|
|
# Deploy — только при push в main
|
|
deploy_production:
|
|
stage: deploy
|
|
image: node:22-alpine
|
|
dependencies:
|
|
- build
|
|
before_script:
|
|
- apk add --no-cache openssh-client
|
|
- eval $(ssh-agent -s)
|
|
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
|
|
- mkdir -p ~/.ssh
|
|
- echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
|
|
- chmod 644 ~/.ssh/known_hosts
|
|
script:
|
|
- tar -czf deploy.tar.gz dist/ dist-server/ dist-bot/ package.json package-lock.json ecosystem.config.cjs deploy/nginx-guidly.conf
|
|
- scp deploy.tar.gz "${DEPLOY_USER}@${DEPLOY_HOST}:/tmp/"
|
|
- |
|
|
ssh "${DEPLOY_USER}@${DEPLOY_HOST}" << 'ENDSSH'
|
|
set -e
|
|
cd /root/guidly
|
|
tar -xzf /tmp/deploy.tar.gz
|
|
rm /tmp/deploy.tar.gz
|
|
npm install --omit=dev
|
|
pm2 delete guidly-server 2>/dev/null || true
|
|
pm2 start ecosystem.config.cjs
|
|
pm2 save
|
|
echo "=== Deploy complete ==="
|
|
ENDSSH
|
|
rules:
|
|
- if: $CI_COMMIT_BRANCH == "main"
|
|
environment:
|
|
name: production
|
|
url: https://gidli.ru
|