back to pipeline
view source

Mission Control: This Is Ground Houston, Your CSS Change Will Launch in T-Minus 3 Days

$cat houston-pipeline-problem.md

HOUSTON CONTROL ROOM
Red lights flashing. Engineers in headsets frantically typing. Large screens showing mysterious countdown timers.

FLIGHT DIRECTOR: Alright people, we have a Level 1 deployment request. A developer wants to change the button color from blue to slightly different blue. This is not a drill.

SAFETY ENGINEER: Sir, have we completed the 47-step safety protocol?

FLIGHT DIRECTOR: Negative. We're still waiting on approvals from Legal, Compliance, Security Team Alpha, Security Team Beta, the Platform Engineering Committee, and Jim from Accounting who needs to sign off because the change affects a page that mentions pricing.

COMMUNICATIONS: Houston, we're getting reports that the developer is asking if they can "just push to main."

FLIGHT DIRECTOR: [Spits out coffee] Dear God. Someone get them on the line and explain that we don't "just push" anything. This isn't 2019.

SYSTEMS ENGINEER: Flight Director, the vulnerability scanners are picking up a critical issue in the CSS parser's third-party color validation library. It's rated CVE-2023-FASHION-DISASTER with a score of 8.7.

FLIGHT DIRECTOR: Are we talking about actual security or just that someone didn't like the color choice?

SYSTEMS ENGINEER: ...unclear, sir.


Welcome to modern software deployment, where changing a CSS property requires more mission planning than putting humans on the moon.

The Mission Complexity Matrix

Let's put this in perspective. Here's what it takes to launch a rocket to space versus deploying your todo app:

NASA Rocket Launch Your CI/CD Pipeline
Pre-flight checks (automated systems) Pre-commit hooks (lint, format, spell check)
Fuel loading (30 minutes) Dependency installation (15 minutes)
Range safety verification SAST scanning (12 minutes)
Weather assessment DAST scanning (18 minutes)
Go/No-go polling (5 minutes) Security team approval (4 hours)
Final countdown (10 minutes) Platform team approval (6 hours)
Engine ignition Manager approval for Friday deploy (until Monday)
Liftoff Canary deployment (20 minutes)
Performance baseline validation (15 minutes)
Compliance artifact generation (8 minutes)
Jira ticket creation (3 minutes)
Slack notifications to 12 channels (2 minutes)
Documentation auto-generation (10 minutes)
Total: ~45 minutes Total: 2-3 days
Payload: Humans to space Payload: CSS color change

NASA gets humans to orbit faster than you can change a button color. Let that sink in.

MISSION LOG: The Great Overcomplication Event

Entry 001: Everything was simple once. A simpler time.

name: Deploy
on: [push]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: npm test
      - run: npm run build
      - run: deploy-script.sh

Four steps. Four beautiful, elegant steps. The rocket scientists at NASA would be proud.

Entry 047: Then came the "Senior DevOps Engineers." They discovered GitHub Actions could do MORE. And in the corporate world, if technology CAN be more complex, it MUST be more complex.

SAFETY ENGINEER: "What if something goes wrong?"
COMPLIANCE OFFICER: "What if there's a security vulnerability?"
LEGAL COUNSEL: "What if someone asks questions?"
ENTERPRISE ARCHITECT: "What if we're not using enough enterprise-grade solutions?"

Entry 156: The pipeline grew. Like a space station that kept adding modules until nobody remembered what the original purpose was. Each new "what if" spawned three new stages, seventeen new approval gates, and forty-seven new ways for the deployment to fail.

TECHNICAL SPECIFICATIONS: Advanced YAML Aeronautics

FLIGHT ENGINEER: Flight Director, we've developed a new navigation system based entirely on YAML configuration files.

FLIGHT DIRECTOR: Go ahead, flight engineer.

FLIGHT ENGINEER: Sir, instead of simple rocket commands, we now use conditional deployment matrices that check for 47 different variables including the phase of the moon:

- name: Deploy if stars align correctly
  if: github.event_name == 'push' && contains(github.ref, 'refs/heads/main') && github.actor != 'dependabot[bot]' && steps.lunar-phase-check.outputs.moon == 'waxing-gibbous'
  run: echo "Initiating quantum deployment sequence"

FLIGHT DIRECTOR: And the cross-platform compatibility matrix?

SYSTEMS ENGINEER: We're now testing across every possible combination of Node versions, operating systems, browser versions, coffee preferences, and developer mood states:

strategy:
  matrix:
    node: [14, 16, 18, 20, 22, 'latest', 'experimental', 'beta', 'alpha', 'who-knows']
    os: [ubuntu-latest, windows-latest, macos-latest, linux-ancient, windows-95-vm]
    coffee: [espresso, americano, decaf-blasphemy]
    developer-mood: [optimistic, pessimistic, caffeine-depleted, existential-crisis]

FLIGHT DIRECTOR: Dear God. And the reusable workflows?

SYSTEMS ENGINEER: We've created workflows that call other workflows that call other workflows. It's workflows all the way down, sir:

uses: ./.github/workflows/ultra-mega-super-complex-deployment-orchestration-workflow.yml
with:
  environment: production-maybe-staging-depends-on-committee-decision
  enable-everything: true
  sacrifice-rubber-duck-to-deployment-gods: required
  number-of-approval-committees: 17

COMMUNICATIONS LOG: The Human Bottleneck Protocols

COMMUNICATIONS: Flight Director, we're receiving multiple requests for manual approval sequences.

FLIGHT DIRECTOR: Report, Communications.

COMMUNICATIONS: The CSS color change mission requires the following human approvals:

  • Security Team Alpha (they're in a 3-hour security review meeting)
  • Security Team Beta (different security, apparently)
  • Platform Infrastructure Committee (currently debating whether CSS counts as infrastructure)
  • Product Strategy Council (need to verify color change aligns with quarterly OKRs)
  • Legal Compliance Division (investigating if changing blue to slightly-different-blue violates any color patents)
  • Engineering Manager Smith (unavailable, in meeting about meeting efficiency)
  • Senior Vice President of Button-Related Decisions (currently on vacation in Cabo)
  • The CEO (requires personal sign-off for anything that might be visible to users)

FLIGHT DIRECTOR: How long for all approvals?

COMMUNICATIONS: Conservative estimate: 4-6 business days. Unless it's Friday, then we wait until Monday because "no Friday deployments."

SYSTEMS ENGINEER: Sir, NASA's go/no-go polling takes 5 minutes. Each team leader simply says "go" or "no-go" and we proceed.

FLIGHT DIRECTOR: [Long pause] We've created a system where it's easier to get approval to launch humans into space than to change the color of a button.

SAFETY ENGINEER: The irony, sir, is that all these approval gates were supposed to reduce risk. But now developers are batching 47 changes together because the approval process is so painful. One massive, risky deployment instead of 47 small, safe ones.

FLIGHT DIRECTOR: We've optimized for the wrong thing entirely.

Security Theater: The Musical

The security scanning phase deserves special mention because it's where things get truly absurd.

You're now running:

  • Snyk (for dependency vulnerabilities)
  • CodeQL (for code vulnerabilities)
  • Semgrep (for more code vulnerabilities)
  • Trivy (for container vulnerabilities)
  • Checkov (for infrastructure vulnerabilities)
  • Some enterprise tool nobody remembers buying

Each tool finds different things. Half of them are false positives. The other half are vulnerabilities in dependencies you can't upgrade because they'd break something else. But you can't skip the scans because "security is important."

So you've got 47 different "vulnerability databases" and "security reports" that nobody reads, but they make compliance happy.

My favorite is when the dependency scanner flags a vulnerability in a dev dependency that's only used during builds, and you have to get security team approval to ignore it. Which takes three days. To deploy a CSS fix.

For context, NASA's range safety officer can abort a multi-billion dollar rocket launch in real-time if something looks wrong. Your security team needs a committee meeting to approve ignoring a false positive in a test framework.

What You Actually Need

Here's the thing - most of this complexity is solving problems you don't have.

For most applications, a good CI/CD pipeline looks like this:

Stage 1: Build and Test (5-10 minutes)

- Checkout code
- Install dependencies  
- Run unit tests
- Run integration tests
- Build the application
- Build container image (if using containers)

Stage 2: Deploy to Staging (2-5 minutes)

- Deploy to staging environment
- Run smoke tests
- Run end-to-end tests (if you have them)

Stage 3: Deploy to Production (2-5 minutes)

- Deploy to production
- Run basic health checks
- Send notification on success/failure

Total time: 10-20 minutes. Total complexity: manageable by one person.

When Complexity is Actually Justified

Don't get me wrong - some applications DO need complex pipelines. You probably need the NASA approach if:

You're actually handling critical infrastructure:

  • Financial transactions
  • Healthcare data
  • Government systems
  • Anything where bugs cost lives or millions of dollars

You're operating at massive scale:

  • Thousands of developers
  • Hundreds of services
  • Multiple data centers
  • Complex regulatory requirements

You have genuine compliance requirements:

  • SOX, HIPAA, PCI DSS that actually applies to your app
  • Government contracts with real security requirements
  • Industry regulations with audit trails

You probably DON'T need complexity if:

  • You're a startup with 5 developers
  • Your app handles todo lists or cat photos
  • Your biggest risk is being slow to market
  • You're asking "do we need all these stages?"

The Right Way to Add Complexity

If you DO need to add complexity, do it gradually and measure the impact:

Start simple: Get basic CI/CD working first. Deploy manually if you have to.

Add one thing at a time: Don't go from zero to NASA in one sprint.

Measure everything: How long do builds take? How often do they fail? What's the false positive rate on security scans?

Question each step: For every step in your pipeline, ask "what problem is this solving?" and "what happens if we skip it?"

Make it escapable: Have a "fast lane" for critical fixes that skips non-essential steps.

The GitHub Actions Reality

GitHub Actions is actually pretty good when you use it simply. The problems come when you try to recreate your entire enterprise infrastructure inside YAML files.

Good GitHub Actions usage:

  • Run tests on every PR
  • Deploy main branch to staging automatically
  • Deploy tagged releases to production
  • Send notifications when things break

Questionable GitHub Actions usage:

  • 500-line workflows with 47 conditional steps
  • Matrix builds across every possible configuration
  • "Reusable workflows" that take 30 parameters
  • Storing business logic in YAML conditionals

Bad GitHub Actions usage:

  • Recreating Jenkins inside GitHub
  • Using Actions as your primary automation platform
  • Building your own deployment orchestration in YAML
  • Anything that requires a PhD in YAML to understand

The Human Cost

Here's what nobody talks about: the human cost of complex CI/CD.

Junior developers spend weeks learning your pipeline instead of your product. Senior developers spend hours debugging YAML instead of writing features. Everyone's scared to change the deployment process because nobody fully understands it.

You've successfully made deploying code harder than writing it.

The Way Forward

Start with the simplest thing that works. Add complexity only when you have a specific problem to solve. Measure the impact of each addition.

Remember: the goal is to ship good software quickly, not to have the most impressive CI/CD pipeline.

Your users don't care if your deployment process has 47 security scans. They care if your app works and gets updated regularly.

Your business doesn't care if you're "enterprise ready." It cares if you can respond quickly to bugs and ship features faster than your competitors.

Your future self doesn't care if you followed every DevOps best practice. It cares if the deployment process is simple enough to debug when something inevitably breaks at 2 AM.

So maybe start with the simple 4-step pipeline and see how far that gets you.

You might be surprised how much you can accomplish without a PhD in YAML.

And remember: if NASA can get to space in 45 minutes, you can probably deploy your web app without a 3-day approval process.


FINAL MISSION LOG

FLIGHT DIRECTOR: [To camera] After 72 hours of continuous operations, the CSS color change mission was... successful. Button color changed from #3B82F6 to #3B83F6. Zero casualties. Seventeen approval forms filed. Forty-seven Slack notifications sent. One intern promoted to "Senior Color Deployment Specialist."

COMMUNICATIONS: Sir, we're getting another deployment request. Someone wants to fix a typo.

FLIGHT DIRECTOR: [Sighs] Alright people, strap in. This is going to be a long week.

[MISSION CONTROL FADES TO BLACK]

P.S. - If your GitHub Actions workflow file is longer than the Apollo 11 flight manual, you might want to reconsider your life choices. NASA got to the moon with less YAML.