CI/CD Config Builder
When to use this skill
-
User asks to set up CI/CD for a project
-
User wants to create GitHub Actions workflows
-
User mentions GitLab CI or CircleCI
-
User wants to automate linting, testing, or deployment
-
User asks to add a pipeline step or job
Workflow
-
Detect project type and framework
-
Identify target CI/CD platform
-
Determine required pipeline stages
-
Generate pipeline configuration
-
Validate config syntax locally
-
Present for user approval
Instructions
Step 1: Detect Project Type
Check for framework indicators:
Framework Indicators
Next.js next.config.* , "next" in package.json
Nuxt nuxt.config.* , "nuxt" in package.json
Vite vite.config.* , "vite" in package.json
Node.js package.json without frontend framework
Static index.html at root, no package.json
Python requirements.txt , pyproject.toml , setup.py
Detect package manager:
ls package-lock.json yarn.lock pnpm-lock.yaml bun.lockb 2>/dev/null | head -1
Check for existing scripts:
npm pkg get scripts 2>/dev/null
Step 2: Identify CI/CD Platform
Check for existing configs:
ls -la .github/workflows/ .gitlab-ci.yml .circleci/config.yml 2>/dev/null
Platform selection:
-
GitHub Actions: Default for GitHub repos, .github/workflows/*.yml
-
GitLab CI: For GitLab repos, .gitlab-ci.yml
-
CircleCI: If .circleci/ exists or user specifies
Step 3: Determine Pipeline Stages
Standard pipeline flow:
install → lint → test → build → deploy
Required stages based on project:
-
Has ESLint/Prettier → include lint
-
Has test framework → include test
-
Has build script → include build
-
Has deployment target → include deploy
Step 4: Generate Configuration
GitHub Actions (Node.js/Next.js):
name: CI
on: push: branches: [main] pull_request: branches: [main]
jobs: ci: runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
- name: Install dependencies
run: npm ci
- name: Lint
run: npm run lint
- name: Test
run: npm test
- name: Build
run: npm run build
GitHub Actions (with matrix):
jobs: ci: runs-on: ubuntu-latest strategy: matrix: node-version: [18, 20, 22]
steps:
- uses: actions/checkout@v4
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: "npm"
- run: npm ci
- run: npm run lint
- run: npm test
GitLab CI:
stages:
- install
- lint
- test
- build
variables: npm_config_cache: "$CI_PROJECT_DIR/.npm"
cache: paths: - .npm/ - node_modules/
install: stage: install image: node:20 script: - npm ci
lint: stage: lint image: node:20 script: - npm run lint
test: stage: test image: node:20 script: - npm test coverage: '/All files[^|]|[^|]\s+([\d.]+)/'
build: stage: build image: node:20 script: - npm run build artifacts: paths: - dist/
CircleCI:
version: 2.1
orbs: node: circleci/node@5
jobs: build-and-test: executor: name: node/default tag: "20" steps: - checkout - node/install-packages - run: name: Lint command: npm run lint - run: name: Test command: npm test - run: name: Build command: npm run build
workflows: ci: jobs: - build-and-test
Step 5: Add Deployment (Optional)
Vercel (GitHub Actions):
deploy: needs: ci runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - uses: actions/checkout@v4 - 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"
AWS S3 (GitHub Actions):
deploy: needs: ci runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - uses: actions/checkout@v4 - run: npm ci && npm run build - uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: us-east-1 - run: aws s3 sync ./dist s3://${{ secrets.S3_BUCKET }} --delete
Step 6: Validate Configuration
GitHub Actions:
Install actionlint
brew install actionlint actionlint .github/workflows/*.yml
GitLab CI:
Use GitLab's CI Lint API or local validation
gitlab-ci-lint .gitlab-ci.yml
CircleCI:
circleci config validate .circleci/config.yml
YAML syntax check:
npx yaml-lint .github/workflows/*.yml
Common Additions
Environment variables:
env: NODE_ENV: production CI: true
Caching (GitHub Actions):
- uses: actions/cache@v4 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
Conditional jobs:
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
Secrets reference:
${{ secrets.SECRET_NAME }}
Validation
Before completing:
-
Config syntax is valid
-
All referenced scripts exist in package.json
-
Secrets are documented (not values, just names needed)
-
Node version matches project requirements
-
Cache configuration is correct for package manager
Error Handling
-
Workflow not triggering: Check branch names and on: triggers match.
-
Action not found: Verify action version exists (e.g., @v4 not @v5 ).
-
Secrets missing: Document required secrets for user to add in repo settings.
-
Syntax error: Run actionlint or YAML linter locally.
-
Unsure about syntax: Check platform documentation or run --help on CLI tools.
Resources
-
GitHub Actions Documentation
-
GitLab CI Documentation
-
CircleCI Documentation
-
actionlint