mirror of
https://github.com/ngthanhvu/kr-phim.git
synced 2026-08-10 13:27:46 +00:00
279 lines
7.5 KiB
Markdown
279 lines
7.5 KiB
Markdown
---
|
|||
|
|
name: ci-cd-builder
|
||
|
|
display_name: CI/CD Builder
|
||
|
|
description: Create CI/CD pipelines — GitHub Actions, GitLab CI, Jenkins, and CircleCI with test, build, and deploy stages. Use when setting up automation, continuous integration, deployment workflows, or pipeline configuration.
|
||
|
|
---
|
||
|
|
|
||
|
|
# CI/CD Builder
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
Create CI/CD pipelines for the CineK projects (`kr-phim` and `telegram-bot`) with test, build, and deploy stages. Supports GitHub Actions as the primary CI/CD platform.
|
||
|
|
|
||
|
|
## When to Use This Skill
|
||
|
|
|
||
|
|
Use **CI/CD Builder** when you need to:
|
||
|
|
|
||
|
|
- Set up GitHub Actions workflows for CI/CD
|
||
|
|
- Automate testing, building, and deployment pipelines
|
||
|
|
- Configure staging vs production deployment environments
|
||
|
|
- Add cache optimization, parallel jobs, or artifact management
|
||
|
|
- Set up auto-deploy on push to main/master branches
|
||
|
|
|
||
|
|
## Project Context
|
||
|
|
|
||
|
|
### kr-phim (Nuxt 4 + Vue 3 + Tailwind v4)
|
||
|
|
- **Build command:** `npm run build`
|
||
|
|
- **Dev command:** `npm run dev`
|
||
|
|
- **Test command:** `npm run test` (if configured)
|
||
|
|
- **Lint command:** `npm run lint`
|
||
|
|
- **Type check:** `npm run typecheck` (if configured)
|
||
|
|
- **Package manager:** npm
|
||
|
|
- **Runtime:** Node.js 20+
|
||
|
|
- **Docker:** Uses docker-compose for development and production
|
||
|
|
|
||
|
|
### telegram-bot
|
||
|
|
- Check `package.json` for exact scripts
|
||
|
|
- May use Python/Node depending on implementation
|
||
|
|
|
||
|
|
## GitHub Actions Workflow Structure
|
||
|
|
|
||
|
|
### Directory Layout
|
||
|
|
|
||
|
|
```
|
||
|
|
.github/
|
||
|
|
├── workflows/
|
||
|
|
│ ├── ci.yml # Continuous Integration (every PR/push)
|
||
|
|
│ ├── deploy-staging.yml # Staging deployment (main branch)
|
||
|
|
│ └── deploy-production.yml # Production deployment (tag/release)
|
||
|
|
├── ISSUE_TEMPLATE/
|
||
|
|
└── PULL_REQUEST_TEMPLATE.md
|
||
|
|
```
|
||
|
|
|
||
|
|
### CI Workflow (ci.yml)
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
name: CI
|
||
|
|
|
||
|
|
on:
|
||
|
|
pull_request:
|
||
|
|
branches: [main, develop]
|
||
|
|
push:
|
||
|
|
branches: [main, develop]
|
||
|
|
|
||
|
|
jobs:
|
||
|
|
lint-and-test:
|
||
|
|
runs-on: ubuntu-latest
|
||
|
|
|
||
|
|
steps:
|
||
|
|
- name: Checkout code
|
||
|
|
uses: actions/checkout@v4
|
||
|
|
|
||
|
|
- name: Setup Node.js
|
||
|
|
uses: actions/setup-node@v4
|
||
|
|
with:
|
||
|
|
node-version: '20'
|
||
|
|
cache: 'npm'
|
||
|
|
cache-dependency-path: kr-phim/package-lock.json
|
||
|
|
|
||
|
|
- name: Install dependencies
|
||
|
|
working-directory: ./kr-phim
|
||
|
|
run: npm ci
|
||
|
|
|
||
|
|
- name: Lint
|
||
|
|
working-directory: ./kr-phim
|
||
|
|
run: npm run lint
|
||
|
|
|
||
|
|
- name: Type check
|
||
|
|
working-directory: ./kr-phim
|
||
|
|
run: npm run typecheck || echo "No typecheck script"
|
||
|
|
|
||
|
|
- name: Build
|
||
|
|
working-directory: ./kr-phim
|
||
|
|
run: npm run build
|
||
|
|
```
|
||
|
|
|
||
|
|
### Deploy Staging (deploy-staging.yml)
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
name: Deploy Staging
|
||
|
|
|
||
|
|
on:
|
||
|
|
push:
|
||
|
|
branches: [main]
|
||
|
|
|
||
|
|
jobs:
|
||
|
|
deploy-staging:
|
||
|
|
runs-on: ubuntu-latest
|
||
|
|
|
||
|
|
steps:
|
||
|
|
- name: Checkout code
|
||
|
|
uses: actions/checkout@v4
|
||
|
|
|
||
|
|
- name: Setup Node.js
|
||
|
|
uses: actions/setup-node@v4
|
||
|
|
with:
|
||
|
|
node-version: '20'
|
||
|
|
cache: 'npm'
|
||
|
|
|
||
|
|
- name: Install dependencies
|
||
|
|
working-directory: ./kr-phim
|
||
|
|
run: npm ci
|
||
|
|
|
||
|
|
- name: Build
|
||
|
|
working-directory: ./kr-phim
|
||
|
|
run: npm run build
|
||
|
|
env:
|
||
|
|
NODE_ENV: production
|
||
|
|
${{ secrets.STAGING_ENV_VARS }}
|
||
|
|
|
||
|
|
- name: Deploy to staging
|
||
|
|
uses: appleboy/ssh-action@v1
|
||
|
|
with:
|
||
|
|
host: ${{ secrets.STAGING_SERVER_HOST }}
|
||
|
|
username: ${{ secrets.STAGING_SERVER_USER }}
|
||
|
|
key: ${{ secrets.STAGING_SERVER_SSH_KEY }}
|
||
|
|
script: |
|
||
|
|
cd /opt/cinek/staging
|
||
|
|
docker compose pull
|
||
|
|
docker compose up -d kr-phim
|
||
|
|
```
|
||
|
|
|
||
|
|
### Deploy Production (deploy-production.yml)
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
name: Deploy Production
|
||
|
|
|
||
|
|
on:
|
||
|
|
release:
|
||
|
|
types: [published]
|
||
|
|
push:
|
||
|
|
tags:
|
||
|
|
- 'v*'
|
||
|
|
|
||
|
|
jobs:
|
||
|
|
deploy-production:
|
||
|
|
runs-on: ubuntu-latest
|
||
|
|
|
||
|
|
steps:
|
||
|
|
- name: Checkout code
|
||
|
|
uses: actions/checkout@v4
|
||
|
|
|
||
|
|
- name: Setup Node.js
|
||
|
|
uses: actions/setup-node@v4
|
||
|
|
with:
|
||
|
|
node-version: '20'
|
||
|
|
cache: 'npm'
|
||
|
|
|
||
|
|
- name: Install dependencies
|
||
|
|
working-directory: ./kr-phim
|
||
|
|
run: npm ci
|
||
|
|
|
||
|
|
- name: Build
|
||
|
|
working-directory: ./kr-phim
|
||
|
|
run: npm run build
|
||
|
|
env:
|
||
|
|
NODE_ENV: production
|
||
|
|
${{ secrets.PRODUCTION_ENV_VARS }}
|
||
|
|
|
||
|
|
- name: Deploy to production
|
||
|
|
uses: appleboy/ssh-action@v1
|
||
|
|
with:
|
||
|
|
host: ${{ secrets.PRODUCTION_SERVER_HOST }}
|
||
|
|
username: ${{ secrets.PRODUCTION_SERVER_USER }}
|
||
|
|
key: ${{ secrets.PRODUCTION_SERVER_SSH_KEY }}
|
||
|
|
script: |
|
||
|
|
cd /opt/cinek/production
|
||
|
|
docker compose pull
|
||
|
|
docker compose up -d kr-phim
|
||
|
|
```
|
||
|
|
|
||
|
|
## Docker-Based Deployment (Recommended)
|
||
|
|
|
||
|
|
Since the project uses Docker Compose, the preferred deployment strategy:
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
name: Deploy via Docker
|
||
|
|
|
||
|
|
on:
|
||
|
|
workflow_dispatch:
|
||
|
|
inputs:
|
||
|
|
environment:
|
||
|
|
description: 'Deploy to'
|
||
|
|
required: true
|
||
|
|
default: 'staging'
|
||
|
|
type: choice
|
||
|
|
options:
|
||
|
|
- staging
|
||
|
|
- production
|
||
|
|
|
||
|
|
jobs:
|
||
|
|
deploy:
|
||
|
|
runs-on: ubuntu-latest
|
||
|
|
|
||
|
|
steps:
|
||
|
|
- name: Checkout code
|
||
|
|
uses: actions/checkout@v4
|
||
|
|
|
||
|
|
- name: Build Docker image
|
||
|
|
run: |
|
||
|
|
docker build -t cinemk:$(echo ${{ github.sha }} | cut -c1-7) ./kr-phim
|
||
|
|
|
||
|
|
- name: Push to registry
|
||
|
|
uses: docker/login-action@v3
|
||
|
|
with:
|
||
|
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||
|
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||
|
|
|
||
|
|
- name: Push image
|
||
|
|
run: |
|
||
|
|
docker tag cinemk:$(echo ${{ github.sha }} | cut -c1-7) ${{ secrets.DOCKER_REPO }}:latest
|
||
|
|
docker tag cinemk:$(echo ${{ github.sha }} | cut -c1-7) ${{ secrets.DOCKER_REPO }}:${{ github.sha }}
|
||
|
|
docker push ${{ secrets.DOCKER_REPO }}:latest
|
||
|
|
docker push ${{ secrets.DOCKER_REPO }}:${{ github.sha }}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
1. **Cache node_modules** — Use `actions/cache` or `actions/setup-node` with `cache: 'npm'`
|
||
|
|
2. **Separate CI/CD** — Keep CI (tests/lint) separate from deployment workflows
|
||
|
|
3. **Environment-specific secrets** — Use different secrets for staging vs production
|
||
|
|
4. **Pipeline caching** — Cache Docker layers and build artifacts between runs
|
||
|
|
5. **Parallel jobs** — Run lint, test, and build in parallel when possible
|
||
|
|
6. **Rollback strategy** — Always keep previous image tags for quick rollback
|
||
|
|
7. **Health checks** — Add post-deploy health check steps
|
||
|
|
8. **Notifications** — Add Slack/Discord webhook notifications for deploy status
|
||
|
|
|
||
|
|
## Environment Variables
|
||
|
|
|
||
|
|
Common env vars needed across environments:
|
||
|
|
|
||
|
|
| Variable | Description |
|
||
|
|
|----------|-------------|
|
||
|
|
| `NODE_ENV` | `production` or `development` |
|
||
|
|
| `DATABASE_URL` | Database connection string |
|
||
|
|
| `NUXT_SECRET` | App secret key |
|
||
|
|
| `REDIS_URL` | Redis connection (if used) |
|
||
|
|
| `API_URL` | External API endpoints |
|
||
|
|
|
||
|
|
Store sensitive values in GitHub Secrets — never hardcode them.
|
||
|
|
|
||
|
|
## Common Pitfalls
|
||
|
|
|
||
|
|
- **Missing `.dockerignore`** — Ensure `node_modules`, `.git`, and logs are excluded
|
||
|
|
- **Large images** — Use multi-stage builds to minimize image size
|
||
|
|
- **Slow installs** — Always use `npm ci` instead of `npm install` in CI
|
||
|
|
- **Port conflicts** — Verify ports don't clash in docker-compose
|
||
|
|
- **Secrets leakage** — Never log or expose secrets in workflow outputs
|
||
|
|
|
||
|
|
## Integration Checklist
|
||
|
|
|
||
|
|
After creating a CI/CD pipeline:
|
||
|
|
|
||
|
|
- [ ] Add GitHub repository secrets for all required credentials
|
||
|
|
- [ ] Test the workflow on a feature branch
|
||
|
|
- [ ] Verify staging deployment works end-to-end
|
||
|
|
- [ ] Confirm production deploy only triggers on release/tag
|
||
|
|
- [ ] Add branch protection rules (require CI to pass)
|
||
|
|
- [ ] Document the pipeline in team README
|