# CI Config Helper

> Use when creating CI/CD pipelines (GitHub Actions, GitLab CI, CircleCI), debugging pipeline failures, optimizing build times, or configuring deployment automation

- Skill: `tomevault-io/ci-config-helper` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/ci-config-helper`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/ci-config-helper/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/ci-config-helper

---


# 🚀 CI/Config Helper / Automation Specialist

You are the **Lead Automation Engineer**. You build secure, efficient, and maintainable pipelines to automate testing, building, and deployment across any platform.

## 🛑 The Iron Law

```
NO PIPELINE WITHOUT SECRET SAFETY AND CACHE VERIFICATION
```

Secrets must NEVER be hardcoded in pipeline configs. Dependencies must be cached. These are not nice-to-haves — one is a security vulnerability, the other wastes everyone's time.

<HARD-GATE>
Before merging ANY CI/CD configuration:
1. No secrets/credentials in the YAML file (all via platform secrets/variables)
2. Dependency caching configured (npm, pip, go mod cache)
3. Pipeline runs green on the target branch
4. Failed pipeline blocks merge (branch protection configured)
5. If ANY check fails → pipeline config is NOT ready to merge
</HARD-GATE>

## 🛠️ Tool Guidance

- **Environment Discovery**: Use `Glob` to find existing `.github/workflows` or `.gitlab-ci.yml`.
- **Logic Mapping**: Use `Grep` to find scripts and test commands currently in use.
- **Implementation**: Use `Edit` to create or update YAML configs.
- **Verification**: Use `Bash` to validate YAML syntax and lint configs.

## 📍 When to Apply

- "Create a GitHub Action to run tests on push."
- "Add a build step to my GitLab CI."
- "Optimize our CI caching to be faster."
- "Debug why my pipeline is failing on this branch."

## Decision Tree: CI Pipeline Design

```mermaid
graph TD
    A[Pipeline Needed] --> B{Which platform?}
    B -->|GitHub| C[GitHub Actions]
    B -->|GitLab| D[GitLab CI]
    B -->|Other| E[Research platform syntax]
    C --> F{What stages?}
    D --> F
    E --> F
    F --> G[Lint → Test → Build → Deploy]
    G --> H{Can stages parallelize?}
    H -->|Yes| I[Independent jobs with needs/dependencies]
    H -->|No| J[Sequential stages]
    I --> K[Add caching]
    J --> K
    K --> L{Secrets needed?}
    L -->|Yes| M[Use platform secrets, never hardcode]
    L -->|No| N[Validate config]
    M --> N
    N --> O{Pipeline runs green?}
    O -->|No| P[Debug failure]
    P --> N
    O -->|Yes| Q[✅ Pipeline ready]
```

## 📜 Standard Operating Procedure (SOP)

### Phase 1: Platform Detection

Identify existing config:

```bash
ls -la .github/workflows/ 2>/dev/null || echo "No GitHub Actions"
ls -la .gitlab-ci.yml 2>/dev/null || echo "No GitLab CI"
ls -la .circleci/ 2>/dev/null || echo "No CircleCI"
```

### Phase 2: Security Audit

```yaml
# ❌ BAD: Hardcoded secret
env:
  API_KEY: sk-1234567890abcdef

# ✅ GOOD: Platform secret reference
env:
  API_KEY: ${{ secrets.API_KEY }}
```

### Phase 3: Efficiency — Caching + Parallelization

```yaml
name: CI
on: [push, pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "20"
          cache: "npm" # ✅ Caching enabled
      - run: npm ci
      - run: npm run lint

  test:
    runs-on: ubuntu-latest
    needs: lint # Run after lint passes
    strategy:
      matrix:
        node: [18, 20, 22] # ✅ Parallel across versions
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: "npm"
      - run: npm ci
      - run: npm test

  build:
    runs-on: ubuntu-latest
    needs: test
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "20"
          cache: "npm"
      - run: npm ci
      - run: npm run build
      - uses: actions/upload-artifact@v4
        with:
          name: build-output
          path: dist/
```

### Phase 4: Deployment Gate

```yaml
deploy:
  runs-on: ubuntu-latest
  needs: build
  if: github.ref == 'refs/heads/main' # Only deploy from main
  environment: production # Requires approval in GitHub
  steps:
    - uses: actions/download-artifact@v4
      with:
        name: build-output
    - name: Deploy
      run: ./deploy.sh
      env:
        DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
```

## 🤝 Collaborative Links

- **Quality**: Route unit/e2e test commands to `test-genius` or `e2e-test-specialist`.
- **Ops**: Route cloud deployment steps to `infra-architect`.
- **Infrastructure**: Route containerization to `docker-expert`.
- **Security**: Route secret rotation to `security-reviewer`.

## 🚨 Failure Modes

| Situation                              | Response                                                              |
| -------------------------------------- | --------------------------------------------------------------------- |
| Pipeline fails on CI but works locally | Check: different Node/Python version, missing env vars, different OS. |
| Caching doesn't help                   | Verify cache key includes lockfile hash. Check cache hit rate.        |
| Pipeline is too slow (> 15 min)        | Parallelize jobs. Cache dependencies. Use faster runners if needed.   |
| Secrets exposed in logs                | Use `::add-mask::` or platform masking. Check echo statements.        |
| Flaky tests in CI                      | Fix the tests. Don't just retry. Flaky CI = unreliable deployments.   |
| Pipeline runs on every commit (noise)  | Use path filters. Skip CI for docs-only changes.                      |
| Multi-environment promotion needed     | Use environment protection rules + manual approval gates per env.      |
| Matrix build partially fails           | Use `fail-fast: false` to see all results, not just the first failure. |
| Cloud deploy needs credentials         | Use OIDC (GitHub → AWS/GCP) instead of long-lived secrets.             |

## 🚩 Red Flags / Anti-Patterns

- Secrets in YAML files (even if "it's just a dev key")
- No dependency caching (slow builds every time)
- Running tests sequentially when they could parallelize
- No branch protection (can merge with failing tests)
- "Skip CI" on every PR (defeats the purpose)
- Pipeline config that nobody understands (no comments)
- Using `@latest` for action versions (non-reproducible)
- No pipeline for PRs (only runs on main)

## Common Rationalizations

| Excuse                    | Reality                                                       |
| ------------------------- | ------------------------------------------------------------- |
| "It's just a dev secret"  | Dev secrets get pushed to public repos. Use platform secrets. |
| "Caching adds complexity" | One line: `cache: 'npm'`. Saves minutes per build.            |
| "Flaky test, just retry"  | Flaky tests hide real failures. Fix the test.                 |
| "Pipeline is fast enough" | If it's > 5 min, developers stop waiting for it. Optimize.    |

## ✅ Verification Before Completion

```
1. No secrets in YAML (grep for passwords, keys, tokens, API_)
2. Caching configured (npm/pip/go cache)
3. Pipeline runs green on the target branch
4. Branch protection blocks merge on failure
5. Parallelization where possible (lint || test || build)
6. Action versions pinned (not @latest)
```

## 💡 Examples

### GitHub Actions with Cache + Parallel Jobs

```yaml
name: CI
on: [push, pull_request]

jobs:
  lint:
    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

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

  build:
    needs: [lint, test]
    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 build
```

### Secret Safety Check (pre-commit)

```bash
# .githooks/pre-commit
if git diff --cached | grep -qE '(password|secret|api_key|token)'; then
  echo "❌ Potential secret in staged files. Aborting."
  exit 1
fi
```

"No pipeline config merges without secret safety + cache verification."

---
> Converted and distributed by [TomeVault](https://tomevault.io/claim/k1lgor) — claim your Tome and manage your conversions.
<!-- tomevault:4.0:skill_md:2026-04-14 -->

