guidly/.gitlab-ci.yml
laruevin d5ed7fdcf9 Initial commit: Guidly project with CI/CD pipeline
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>
2026-02-11 11:42:42 +07:00

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