CI Workflows | Automated Testing & Quality Gates
Set up CI pipelines with GitScrum's GitHub, GitLab, and Bitbucket integrations. Automated testing, code quality checks, and deployment gates. Prevent broken builds.
13 min read
Continuous Integration (CI) transforms how teams validate code changes by automatically running tests, linting, and quality checks on every commit. When CI integrates with GitScrum through GitHub, GitLab, or Bitbucket connections, task statuses update automatically based on build results, giving the entire team visibility into code health. This creates a quality gate that prevents broken code from reaching main branches while keeping the board in sync with actual development state.
CI Fundamentals
Why CI Matters
WITHOUT CI:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MANUAL VERIFICATION PROBLEMS β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Developer pushes code: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β "Works on my machine" ββββββββββββββββββββββββββββββββββββ
β β β ββ
β β βΌ ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β β PROBLEMS DISCOVERED LATER: β ββ
β β β β ββ
β β β β’ Different Node version on CI server β ββ
β β β β’ Missing environment variable β ββ
β β β β’ Test passes locally, fails in isolation β ββ
β β β β’ Merge conflict not properly resolved β ββ
β β β β’ Dependency not in package.json β ββ
β β β β ββ
β β β Time to debug: Hours to days β ββ
β β β Context switching: Already on next task β ββ
β β β Blame game: "Who broke the build?" β ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
WITH CI:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AUTOMATED VERIFICATION FLOW β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββ βββββββββββββ βββββββββββββ β
β β Push βββββΆβ CI Runs βββββΆβ Result β β
β β Commit β β Checks β β in 5min β β
β βββββββββββββ βββββββββββββ βββββββββββββ β
β β β β
β βΌ βΌ β
β βββββββββββββββββββββββββββββββββββββββ β
β β CHECKS RUN: β β
β β β Install dependencies β β
β β β Lint code β β
β β β Type check β β
β β β Run unit tests β β
β β β Run integration tests β β
β β β Build production artifact β β
β β β β
β β All pass β β
Merge allowed β β
β β Any fail β β Merge blocked β β
β βββββββββββββββββββββββββββββββββββββββ β
β β
β Developer finds issue: 5 minutes, not days β
β Context: Still in the same task β
β Accountability: Clear which commit broke what β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CI Pipeline Stages
STANDARD PIPELINE STRUCTURE:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PIPELINE STAGES β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Stage 1: PREPARE (1-2 min) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β’ Checkout code ββ
β β β’ Cache dependencies ββ
β β β’ Install packages ββ
β β ββ
β β Fail conditions: Network issues, corrupted cache ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β Stage 2: VALIDATE (2-5 min) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Run in parallel: ββ
β β β’ Lint (ESLint, Prettier, etc.) ββ
β β β’ Type check (TypeScript) ββ
β β β’ Security audit (npm audit, Snyk) ββ
β β ββ
β β Fail conditions: Style violations, type errors, vulns ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β Stage 3: TEST (5-15 min) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Sequential: ββ
β β β’ Unit tests ββ
β β β’ Integration tests ββ
β β β’ E2E tests (optional per-PR) ββ
β β ββ
β β Fail conditions: Test failures, coverage drop ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β Stage 4: BUILD (2-5 min) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β’ Build production artifact ββ
β β β’ Verify bundle size ββ
β β β’ Upload artifacts ββ
β β ββ
β β Fail conditions: Build errors, size limits exceeded ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β Stage 5: DEPLOY (on merge to main) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β’ Deploy to staging ββ
β β β’ Run smoke tests ββ
β β β’ Notify team ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
GitScrum Integration
Connecting Git Providers
GITSCRUM + CI FLOW:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AUTOMATIC BOARD UPDATES β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Setup: GitScrum β Integrations β GitHub/GitLab/Bitbucket β
β β
β WORKFLOW: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β 1. Developer creates branch: ββ
β β git checkout -b feature/PROJ-123-user-auth ββ
β β ^^^^ ββ
β β Task ID ββ
β β ββ
β β 2. Developer opens PR referencing task: ββ
β β PR Title: "feat: implement user auth [PROJ-123]" ββ
β β ββ
β β 3. GitScrum automatically: ββ
β β β’ Links PR to task PROJ-123 ββ
β β β’ Shows PR status on task card ββ
β β β’ Updates task based on PR state ββ
β β ββ
β β 4. CI runs, results visible in GitScrum: ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β β Task: PROJ-123 β ββ
β β β β ββ
β β β π PR #45: feat: implement user auth β ββ
β β β β³ CI Running: 3 of 5 checks passed β ββ
β β β β β ββ
β β β ββ β
lint β ββ
β β β ββ β
typecheck β ββ
β β β ββ β
unit-tests β ββ
β β β ββ β³ integration-tests (running) β ββ
β β β ββ βΈοΈ deploy (waiting) β ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β CI status visible without leaving GitScrum board β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Task Status Automation
STATUS AUTOMATION RULES:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CONFIGURING AUTOMATIC TRANSITIONS β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β EVENT β TASK TRANSITION ββ
β ββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββ
β β Branch created with β β "In Progress" ββ
β β task ID β ββ
β β β ββ
β β PR opened (draft) β β "In Progress" ββ
β β β ββ
β β PR ready for review β β "Code Review" ββ
β β β ββ
β β CI failed β β Stay in current status ββ
β β β (add "CI Failed" label) ββ
β β β ββ
β β CI passed, approved β β "Ready to Merge" ββ
β β β ββ
β β PR merged β β "Done" ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β Why this matters: β
β β’ Board always reflects reality β
β β’ No manual status updates needed β
β β’ PM can see actual progress without interrupting devs β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Sample CI Configurations
GitHub Actions
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main, develop]
jobs:
validate:
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: Type check
run: npm run typecheck
test:
runs-on: ubuntu-latest
needs: validate
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: Run tests
run: npm test -- --coverage
- name: Upload coverage
uses: codecov/codecov-action@v3
build:
runs-on: ubuntu-latest
needs: test
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: Build
run: npm run build
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: build
path: dist/
GitLab CI
# .gitlab-ci.yml
stages:
- validate
- test
- build
variables:
npm_config_cache: "$CI_PROJECT_DIR/.npm"
cache:
paths:
- .npm/
- node_modules/
lint:
stage: validate
script:
- npm ci
- npm run lint
- npm run typecheck
unit-tests:
stage: test
script:
- npm ci
- npm test -- --coverage
coverage: '/Lines\s*:\s*(\d+\.?\d*)%/'
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage/cobertura-coverage.xml
build:
stage: build
script:
- npm ci
- npm run build
artifacts:
paths:
- dist/
Quality Gates
Required Checks
BLOCKING VS NON-BLOCKING CHECKS:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CONFIGURING QUALITY GATES β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β MUST PASS (block merge): β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β Lint No syntax errors, style consistent ββ
β β β Type check TypeScript compiles without errors ββ
β β β Unit tests All tests pass ββ
β β β Build Production build succeeds ββ
β β β Security No high/critical vulnerabilities ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β SHOULD PASS (warn but allow): β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β Coverage >80% coverage (warn if lower) ββ
β β β Bundle size <500KB (warn if larger) ββ
β β β Performance Lighthouse >90 (warn if lower) ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β INFORMATIONAL (never block): β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β βΉ Dependency updates Dependabot/Renovate suggestions ββ
β β βΉ Code complexity Maintainability metrics ββ
β β βΉ Documentation Missing JSDoc warnings ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Coverage Requirements
COVERAGE STRATEGY:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MEANINGFUL COVERAGE THRESHOLDS β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β OVERALL TARGETS: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Metric β Minimum β Target β Rationale ββ
β ββββββββββββββββββββΌββββββββββΌββββββββββΌββββββββββββββββββββ
β β Line coverage β 70% β 85% β Most code touchedββ
β β Branch coverage β 60% β 80% β Edge cases testedββ
β β Function coverageβ 80% β 95% β All funcs called ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β PER-PR RULES: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Rule: Coverage must not decrease ββ
β β ββ
β β Main branch: 82% coverage ββ
β β PR adds new code: Must maintain β₯82% ββ
β β ββ
β β Exception: Documented tech debt with follow-up task ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β WHAT TO COVER: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β High priority (test thoroughly): ββ
β β β’ Business logic ββ
β β β’ Data transformations ββ
β β β’ Error handling paths ββ
β β β’ API response handling ββ
β β ββ
β β Lower priority (basic tests okay): ββ
β β β’ UI components (visual testing better) ββ
β β β’ Generated code ββ
β β β’ Configuration files ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Pipeline Optimization
Speed Improvements
FAST CI BEST PRACTICES:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β REDUCING PIPELINE TIME β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. PARALLELIZATION: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Before (sequential): 15 minutes ββ
β β βββββββ βββββββ βββββββ βββββββ βββββββ ββ
β β βLint βββTypesβββUnit βββIntegβββBuildβ ββ
β β β 2m β β 2m β β 5m β β 4m β β 2m β ββ
β β βββββββ βββββββ βββββββ βββββββ βββββββ ββ
β β ββ
β β After (parallel): 7 minutes ββ
β β βββββββ ββ
β β βLint ββββββββββββββββββββββββ ββ
β β β 2m β β ββ
β β βββββββ βΌ ββ
β β βββββββ βββββββββββ βββββββ ββ
β β βTypesββββββββββββββββββΆβ Test βββββΆβBuildβ ββ
β β β 2m β β 5m β β 2m β ββ
β β βββββββ βββββββββββ βββββββ ββ
β β βββββββ β² ββ
β β βAuditββββββββββββββββββββββββ ββ
β β β 1m β ββ
β β βββββββ ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β 2. CACHING: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Cache: ββ
β β β’ node_modules (key: hash of package-lock.json) ββ
β β β’ Build artifacts (for unchanged files) ββ
β β β’ Test snapshots ββ
β β ββ
β β Cache hit: 2 min install β 10 sec restore ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β 3. SELECTIVE TESTING: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β’ Only run tests for changed files/dependencies ββ
β β β’ Full test suite on main branch only ββ
β β β’ Use test sharding for large test suites ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Failure Handling
DEALING WITH CI FAILURES:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FAILURE WORKFLOW β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β WHEN CI FAILS: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β 1. Developer gets notification (email, Slack, Teams) ββ
β β 2. GitScrum task shows CI status: ββ
β β π΄ Build Failed - PROJ-123 ββ
β β 3. Developer clicks through to see failure ββ
β β 4. Fix and push ββ
β β 5. CI reruns automatically ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β FLAKY TEST HANDLING: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β IF test fails intermittently: ββ
β β ββ
β β Option 1: Automatic retry ββ
β β retry: 2 # Retry failed jobs twice ββ
β β ββ
β β Option 2: Quarantine ββ
β β β’ Mark flaky test with tag ββ
β β β’ Run in separate job (doesn't block) ββ
β β β’ Create GitScrum task to fix ββ
β β ββ
β β Option 3: Fix immediately ββ
β β β’ Flaky tests erode trust in CI ββ
β β β’ Prioritize fixing over new features ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Team Practices
CI Discipline
TEAM CI AGREEMENTS:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CI TEAM NORMS β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β β
DO: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β’ Run tests locally before pushing ββ
β β β’ Fix broken builds immediately (priority over features)ββ
β β β’ Keep pipeline under 15 minutes ββ
β β β’ Review CI config changes carefully ββ
β β β’ Monitor for flaky tests weekly ββ
β β β’ Celebrate green builds ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β β DON'T: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β’ Push directly to main ββ
β β β’ Skip CI checks "just this once" ββ
β β β’ Leave red builds overnight ββ
β β β’ Ignore failing tests by skipping them ββ
β β β’ Add slow tests without optimization ββ
β β β’ Merge without PR review ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β BROKEN BUILD PROTOCOL: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β 1. All work stops when main branch is red ββ
β β 2. Person who broke it takes ownership ββ
β β 3. If not fixable in 10 min, revert and fix in branch ββ
β β 4. Post in Discussions: what happened, how prevented ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ