--- name: ci-cd-pipeline description: "GitHub Actions CI/CD patterns for automated testing, building, and deployment. Covers workflow syntax, secrets management, matrix builds, and deployment strategies." version: 1.0.0 triggers: - github actions - ci/cd - continuous integration - deployment pipeline - automated testing --- # CI/CD Pipeline Skill Build robust CI/CD pipelines with GitHub Actions for automated testing, building, and deployment. ## Core Workflow Structure ```yaml # .github/workflows/ci.yml name: CI/CD Pipeline on: push: branches: [main, develop] pull_request: branches: [main] env: NODE_VERSION: '20' jobs: # Job 1: Lint and Type Check quality: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' - name: Install dependencies run: npm ci - name: Lint run: npm run lint - name: Type check run: npm run type-check # Job 2: Test test: runs-on: ubuntu-latest needs: quality steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' - name: Install dependencies run: npm ci - name: Run tests run: npm test -- --coverage - name: Upload coverage uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} # Job 3: Build build: runs-on: ubuntu-latest needs: test steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' - name: Install dependencies run: npm ci - name: Build run: npm run build - name: Upload build artifacts uses: actions/upload-artifact@v4 with: name: build path: dist/ # Job 4: Deploy (only on main) deploy: runs-on: ubuntu-latest needs: build if: github.ref == 'refs/heads/main' environment: production steps: - uses: actions/checkout@v4 - name: Download build artifacts uses: actions/download-artifact@v4 with: name: build path: dist/ - name: Deploy to Vercel uses: amondnet/vercel-action@v25 with: vercel-token: ${{ secrets.VERCEL_TOKEN }} vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} vercel-args: '--prod' ``` ## Matrix Builds Test across multiple versions/platforms: ```yaml jobs: test: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] node: [18, 20, 22] fail-fast: false steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - run: npm ci - run: npm test ``` ## Secrets Management ```yaml # Using secrets env: DATABASE_URL: ${{ secrets.DATABASE_URL }} API_KEY: ${{ secrets.API_KEY }} # GitHub environment secrets (for staging/production) deploy: environment: production # Uses production environment secrets ``` ## Caching Strategies ```yaml # NPM cache - uses: actions/setup-node@v4 with: cache: 'npm' # Custom cache - uses: actions/cache@v4 with: path: | ~/.npm node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- ``` ## Deployment Patterns ### Preview Deployments (PRs) ```yaml preview: if: github.event_name == 'pull_request' steps: - name: Deploy Preview run: vercel --token=${{ secrets.VERCEL_TOKEN }} - name: Comment PR uses: actions/github-script@v7 with: script: | github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: '🚀 Preview: https://preview-url.vercel.app' }) ``` ### Conditional Deploys ```yaml deploy: if: | github.ref == 'refs/heads/main' && github.event_name == 'push' ``` ## FrankX Standard Pipeline For FrankX projects, use this template: ```yaml name: FrankX CI/CD on: push: branches: [main] pull_request: branches: [main] jobs: validate: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - run: npm ci - run: npm run lint - run: npm run type-check - run: npm test deploy: needs: validate if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Deploy to Vercel uses: amondnet/vercel-action@v25 with: vercel-token: ${{ secrets.VERCEL_TOKEN }} vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} vercel-args: '--prod' ``` ## Anti-Patterns ❌ Storing secrets in code ❌ No caching (slow builds) ❌ Running all jobs sequentially when they can be parallel ❌ No artifact upload for debugging failed builds ❌ Hardcoded versions instead of matrix ✅ Use environment secrets ✅ Cache dependencies aggressively ✅ Parallelize independent jobs ✅ Upload artifacts for debugging ✅ Use matrix for cross-platform testing