Files
kr-phim/.agents/ci-cd-builder.md
T

279 lines
7.5 KiB
Markdown
Raw Normal View History

---
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