<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Devops on Gruion</title><link>https://www.gruion.com/blog/tags/devops/</link><description>Recent content in Devops on Gruion</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 20 May 2026 06:07:03 +0000</lastBuildDate><atom:link href="https://www.gruion.com/blog/tags/devops/index.xml" rel="self" type="application/rss+xml"/><item><title>What Gruion Delivers: DevOps and Platform Engineering Services That Ship</title><link>https://www.gruion.com/blog/post/2026-05-20-gruion-services/</link><pubDate>Wed, 20 May 2026 06:07:03 +0000</pubDate><dc:creator>Gruion</dc:creator><guid>https://www.gruion.com/blog/post/2026-05-20-gruion-services/</guid><description>Gruion delivers practical DevOps and platform engineering: Kubernetes, Terraform, CI/CD pipelines, observability, and IaC built for real teams.</description><content:encoded><![CDATA[<h2 id="key-takeaways">Key Takeaways</h2>
<ul>
<li>Gruion builds CI/CD pipelines using GitHub Actions and ArgoCD to reduce deployment friction from day one</li>
<li>Infrastructure as Code with Terraform or Pulumi gives teams repeatable, auditable environments across AWS, GCP, and Azure</li>
<li>Kubernetes cluster setup and hardening — from RBAC policies to Helm chart management — is a core Gruion deliverable</li>
<li>Observability stacks (Prometheus, Grafana, Datadog) are wired in from the start, not bolted on after incidents</li>
<li>Gruion works as an embedded team, not a consulting vendor dropping a report and leaving</li>
</ul>
<h2 id="tools--setup">Tools &amp; Setup</h2>
<p>Gruion&rsquo;s engagements typically start with an infrastructure audit: what&rsquo;s manual, what&rsquo;s undocumented, what breaks on Fridays. From there, the team moves fast — standing up Terraform workspaces, wiring GitHub Actions pipelines, and deploying ArgoCD for GitOps-driven Kubernetes releases.</p>
<p>A typical Gruion stack looks like this: Terraform for cloud provisioning (modules per environment, remote state in S3 or GCS), ArgoCD syncing from a dedicated ops repo, Prometheus and Grafana for metrics, and Loki for log aggregation. For teams on AWS, that often means EKS with Karpenter for node autoscaling. On GCP, GKE Autopilot. The setup is opinionated but portable — no lock-in by design.</p>
<h2 id="analysis">Analysis</h2>
<p>Most engineering teams hit the same wall: infrastructure that grew organically, no clear ownership of platform concerns, and a CI/CD pipeline that&rsquo;s half GitHub Actions and half shell scripts from 2019. The result is slow deploys, flaky tests, and on-call engineers debugging Terraform drift at 2am.</p>
<p>Gruion&rsquo;s model is to embed directly with the team — not to audit and advise, but to build alongside engineers and hand off something they can actually maintain. That means pairing on Helm chart structure, writing runbooks for incident response, and setting up alerting rules in Prometheus that actually fire when things break, not when they&rsquo;re already on fire.</p>
<p>The broader pattern is clear: platform engineering as a discipline is maturing, and teams that invest early in internal developer platforms — consistent tooling, self-service environments, automated compliance — ship faster and with fewer incidents. Gruion operationalizes that discipline for teams that don&rsquo;t have the bandwidth to build it from scratch.</p>
<h2 id="sources">Sources</h2>
<ul>
<li>No external source articles were provided for this topic.</li>
</ul>
<hr>
<p><strong>Need help setting this up?</strong> Gruion provides hands-on DevOps services, CI/CD automation, and platform engineering. <a href="https://www.gruion.com/#contact">Get a free consultation</a></p>
]]></content:encoded><enclosure url="https://www.gruion.com/blog/post/2026-05-20-gruion-services/cover.jpg" type="image/jpeg" length="0"/><media:content url="https://www.gruion.com/blog/post/2026-05-20-gruion-services/cover.jpg" medium="image" type="image/jpeg"/><media:thumbnail url="https://www.gruion.com/blog/post/2026-05-20-gruion-services/cover.jpg"/><category>Platform Engineering</category></item><item><title>AIgileCoach: The AI-Powered Jira Dashboard That Turns Your Backlog Into Actionable Intelligence</title><link>https://www.gruion.com/blog/post/2026-03-20-aigilecoach-ai-powered-jira-dashboard/</link><pubDate>Fri, 20 Mar 2026 10:00:00 +0100</pubDate><guid>https://www.gruion.com/blog/post/2026-03-20-aigilecoach-ai-powered-jira-dashboard/</guid><description>AIgile is an open-source Jira dashboard with 21 agile views and AI coaching. Turn your backlog into actionable intelligence.</description><content:encoded><![CDATA[<h2 id="key-takeaways">Key Takeaways</h2>
<ul>
<li><strong>AIgileCoach is an open-source Jira intelligence platform</strong> that combines real-time dashboarding with AI-powered coaching across 21 dedicated agile views — from sprint planning to retrospectives, dependency tracking to compliance checks.</li>
<li><strong>Automatic urgency detection</strong> flags overdue, stale, blocked, and unassigned tickets before they become fires, giving teams a single glance at what needs attention now.</li>
<li><strong>Pluggable AI providers</strong> let you choose between Claude, OpenAI, Ollama (local), or Claude Code CLI — no vendor lock-in, and a mock provider for demos and testing.</li>
<li><strong>Multi-server and multi-team support</strong> means one deployment can serve an entire organization, connecting to multiple Jira instances with per-team color coding and project mappings.</li>
<li><strong>The project is actively under development</strong> — new features and bug fixes land regularly. AI capabilities are improving fast, so star the repo and stay tuned.</li>
</ul>
<hr>
<h2 id="what-is-aigilecoach">What Is AIgileCoach?</h2>
<p>If you have ever stared at a Jira board and thought <em>&ldquo;I know the information is in here somewhere, but I have no idea what actually matters right now&rdquo;</em> — AIgileCoach was built for you.</p>
<p>At its core, AIgileCoach is a <strong>Next.js dashboard</strong> backed by an <strong>Express API</strong> that connects to your Jira instance and transforms raw issue data into structured, actionable views. But calling it a dashboard undersells it. It is closer to a <strong>full agile operating system</strong> — 21 purpose-built pages that cover every ceremony and metric an agile team needs, each with an embedded AI coaching panel that can analyze your data and surface insights on demand.</p>
<p>The tool groups issues by Epic, calculates real-time urgency flags (overdue, due soon, stale after 7 or 14 days, blocked, unassigned), and presents everything through a clean stats bar so you can jump straight to what needs your attention. No more hunting through filters. No more &ldquo;let me check&rdquo; during standup.</p>
<hr>
<h2 id="the-21-views-one-tool-every-ceremony">The 21 Views: One Tool, Every Ceremony</h2>
<p>AIgileCoach is not a single dashboard — it is a <strong>toolkit</strong>. Here is what you get:</p>
<p><strong>Day-to-day operations:</strong></p>
<ul>
<li><strong>Dashboard</strong> — Epic-based overview with urgency filtering (All / Critical / Overdue / Stale)</li>
<li><strong>Epic Board</strong> — Deep-dive into any epic with child issues, progress bars, and status breakdowns</li>
<li><strong>Hierarchy</strong> — Full issue tree from Epic down to Subtask</li>
<li><strong>Standup</strong> — Recent activity summary, ready to share on screen</li>
<li><strong>Backlog Refinement</strong> — Story estimation and grooming support</li>
</ul>
<p><strong>Planning and tracking:</strong></p>
<ul>
<li><strong>Sprint Goals</strong> — Define and track what the sprint is actually trying to achieve</li>
<li><strong>Planning</strong> — Sprint planning with capacity management</li>
<li><strong>PI Planning</strong> — Program Increment board for scaled agile teams</li>
<li><strong>PI Compliance</strong> — Track whether the PI is on course</li>
<li><strong>Gantt</strong> — Visual roadmap for longer-horizon planning</li>
</ul>
<p><strong>Analytics and flow:</strong></p>
<ul>
<li><strong>Analytics</strong> — Burndown charts, velocity trends, and custom metrics</li>
<li><strong>Flow</strong> — Cycle time distribution and cumulative flow diagrams</li>
<li><strong>Analyze</strong> — Deep-dive analysis with custom JQL queries</li>
</ul>
<p><strong>Team health and improvement:</strong></p>
<ul>
<li><strong>Sprint Review</strong> — Review completed work with the team</li>
<li><strong>Retro</strong> — Run retrospectives with voting, directly in the tool</li>
<li><strong>Health Check</strong> — Team health scoring through structured surveys</li>
</ul>
<p><strong>Governance and risk:</strong></p>
<ul>
<li><strong>Definition of Ready (DoR)</strong> — Checklist validation before stories enter a sprint</li>
<li><strong>ROAM Board</strong> — Risk management (Risks, Obstacles, Actions, Mitigations)</li>
<li><strong>Compliance</strong> — Project compliance and governance checks</li>
<li><strong>Dependencies</strong> — Cross-project dependency discovery and visualization</li>
<li><strong>Architecture</strong> — Technical dependency mapping</li>
</ul>
<p>Every single one of these pages includes the <strong>AI Coach Panel</strong> — a sidebar where you can ask questions about the data you are looking at, get recommendations, or generate summaries.</p>
<hr>
<h2 id="ai-coaching-your-agile-copilot">AI Coaching: Your Agile Copilot</h2>
<p>The AI integration in AIgileCoach works through a <strong>pluggable provider system</strong> built as a standalone library (<code>ai-lib/</code>). You pick your provider, configure an API key, and the coach is ready.</p>
<p><strong>Five providers ship out of the box:</strong></p>
<table>
	<thead>
			<tr>
					<th>Provider</th>
					<th>Best For</th>
					<th>Configuration</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>Claude Code</strong></td>
					<td>Teams already using the Claude CLI</td>
					<td>Set <code>AI_PROVIDER=claude-code</code></td>
			</tr>
			<tr>
					<td><strong>Anthropic API</strong></td>
					<td>Direct Claude API access</td>
					<td>Set <code>AI_PROVIDER=anthropic</code> + <code>ANTHROPIC_API_KEY</code></td>
			</tr>
			<tr>
					<td><strong>OpenAI</strong></td>
					<td>GPT-4o users</td>
					<td>Set <code>AI_PROVIDER=openai</code> + <code>OPENAI_API_KEY</code></td>
			</tr>
			<tr>
					<td><strong>Ollama</strong></td>
					<td>Privacy-first, local inference</td>
					<td>Set <code>AI_PROVIDER=ollama</code> + local Ollama running</td>
			</tr>
			<tr>
					<td><strong>Mock</strong></td>
					<td>Demos and testing</td>
					<td>Default — no API key needed</td>
			</tr>
	</tbody>
</table>
<p>The AI coach builds context-aware prompts that include the current page data, the type of view you are on, and your question. It then returns structured insights: executive summaries, blocked ticket analysis, risk assessments, team workload distribution, and concrete recommendations.</p>
<p>For ticket-level analysis, the coach returns a <strong>tl;dr</strong>, status insight, required actions, risk level with reasoning, and staleness assessment. For board-level analysis, you get an <strong>executive summary</strong>, lists of blocked and stale tickets, workload distribution across the team, and prioritized recommendations.</p>
<hr>
<h2 id="getting-started-in-five-minutes">Getting Started in Five Minutes</h2>
<p>AIgileCoach runs with Docker Compose. Here is the setup:</p>
<p><strong>1. Clone and configure:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git clone https://github.com/gruion/AIgile.git
</span></span><span style="display:flex;"><span>cd AIgile
</span></span><span style="display:flex;"><span>cp .env.example .env
</span></span></code></pre></div><p><strong>2. Start everything:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker compose up -d --build
</span></span></code></pre></div><p>This spins up four containers: the Next.js frontend (port 3010), the Express API (port 3011), a Jira instance (port 9080), and PostgreSQL.</p>
<p><strong>3. Connect to Jira:</strong></p>
<p>Open <code>http://localhost:3010</code>, log in with your Jira credentials (base URL, username, and API token), and you are in.</p>
<p><strong>4. Seed sample data (optional):</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cd api <span style="color:#f92672">&amp;&amp;</span> npm install <span style="color:#f92672">&amp;&amp;</span> npm run seed
</span></span></code></pre></div><p>This creates 5 epics with 33 realistic tickets — mixed statuses, due dates, comments, and assignments — so you can explore every feature without touching your production Jira.</p>
<p><strong>5. Enable AI coaching:</strong></p>
<p>Add your preferred provider to <code>.env</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>AI_PROVIDER<span style="color:#f92672">=</span>anthropic
</span></span><span style="display:flex;"><span>ANTHROPIC_API_KEY<span style="color:#f92672">=</span>sk-ant-...
</span></span></code></pre></div><p>Restart the API container, and the AI Coach Panel lights up across all 21 views.</p>
<hr>
<h2 id="multi-server-multi-team-built-for-the-enterprise">Multi-Server, Multi-Team: Built for the Enterprise</h2>
<p>One of AIgileCoach&rsquo;s standout features is its <strong>multi-tenancy architecture</strong>. Through environment variables or the in-app configuration panel, you can:</p>
<ul>
<li><strong>Connect multiple Jira instances</strong> — useful for organizations running separate Jira servers per division or for consulting teams managing multiple clients.</li>
<li><strong>Define teams</strong> with custom colors, project mappings, and server associations — the dashboard visually distinguishes work across teams.</li>
<li><strong>Configure Program Increments</strong> with start/end dates, sprint counts, and duration — enabling SAFe-style PI tracking across multiple teams and projects.</li>
<li><strong>Save JQL bookmarks</strong> for frequently used queries, shared across the team.</li>
</ul>
<p>Configuration persists to a <code>config.json</code> file, but every setting can also be driven through environment variables — making it straightforward to manage through Kubernetes ConfigMaps or CI/CD pipelines.</p>
<hr>
<h2 id="current-status-actively-under-development">Current Status: Actively Under Development</h2>
<p>AIgileCoach is <strong>not production-ready yet</strong> — and that is worth being upfront about. The project is in active development with new features and bug fixes shipping regularly. Here is what to expect:</p>
<ul>
<li><strong>The core dashboard and agile views are functional</strong> and already useful for day-to-day team work.</li>
<li><strong>AI coaching features are still maturing</strong> — prompt quality, response parsing, and provider-specific tuning are all areas seeing rapid improvement.</li>
<li><strong>Bug fixes land frequently</strong> as the tool gets tested across different Jira configurations, project structures, and team sizes.</li>
<li><strong>Kubernetes deployment manifests</strong> (GKE and OpenShift) are included but should be treated as starting points, not battle-tested production configs.</li>
</ul>
<p>The architecture is stateless by design — session data lives in memory with 24-hour expiration, configuration in a mounted volume, and all Jira data is fetched in real-time. The foundation is solid, and the pace of progress is fast.</p>
<p><strong>Star the repo on GitHub to follow along:</strong> <a href="https://github.com/gruion/AIgile">github.com/gruion/AIgile</a></p>
<hr>
<h2 id="why-this-matters">Why This Matters</h2>
<p>Most Jira dashboards show you data. AIgileCoach <strong>interprets</strong> it. The combination of automatic urgency detection, structured agile views, and AI-powered coaching means teams spend less time navigating Jira and more time acting on what they find.</p>
<p>Whether you are a Scrum Master running daily standups, a Release Train Engineer tracking PI compliance, or a Tech Lead trying to spot blocked dependencies before they cascade — AIgileCoach gives you the view you need with the intelligence layer to make sense of it.</p>
<p>The pluggable AI architecture also means you are never locked into a single vendor. Start with the mock provider for evaluation, move to Ollama for air-gapped environments, or plug in Claude or GPT-4o for maximum capability. The interface stays the same.</p>
<p>This is a project worth watching. A lot of progress is underway, and the roadmap is ambitious. If you want to try it, contribute, or just keep an eye on where it is heading — now is a great time to get involved.</p>
<hr>
<h2 id="sources">Sources</h2>
<ul>
<li><a href="https://github.com/gruion/AIgile">AIgileCoach on GitHub</a></li>
</ul>
<hr>
<p><strong>Want help deploying AIgileCoach for your team, or need a fractional DevOps engineer to integrate AI-powered tooling into your agile workflow?</strong> <a href="https://www.gruion.com/#contact">Talk to Gruion.</a></p>
]]></content:encoded><category>AI</category></item><item><title>Why Your Startup Doesn't Need a Full DevOps Team (Yet)</title><link>https://www.gruion.com/blog/post/1/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><dc:creator>Gruion</dc:creator><guid>https://www.gruion.com/blog/post/1/</guid><description>A full-time DevOps engineer costs €80-120K/year. &lt;br />Here's why fractional DevOps might be the smarter choice for your Series A startup.</description><content:encoded><![CDATA[<h2 id="the-devops-hiring-dilemma">The DevOps Hiring Dilemma</h2>
<hr>
<p>You just raised your Series A. Your CTO is drowning in infrastructure issues. Deployments are manual, the CI/CD pipeline is held together with duct tape, and your AWS bill keeps growing.</p>
<p>The obvious solution? Hire a DevOps engineer.</p>
<p>But here&rsquo;s the reality: <strong>a senior DevOps engineer in Europe costs €80,000-120,000 per year</strong>. That&rsquo;s before equity, benefits, and the 3-6 months it takes to find and onboard someone good.</p>
<p>For most startups between Series A and C, there&rsquo;s a better option.</p>
<h2 id="what-fractional-devops-actually-means">What Fractional DevOps Actually Means</h2>
<hr>
<p>Fractional DevOps is exactly what it sounds like: you get senior DevOps expertise for a fraction of the cost and time commitment.</p>
<p>Instead of hiring a full-time employee, you work with an experienced consultant who:</p>
<ul>
<li><strong>Works 15-20 hours per month</strong> on your infrastructure</li>
<li><strong>Brings patterns from 50+ startups</strong> — not just theory</li>
<li><strong>Ships real code</strong> — Terraform, GitHub Actions, Kubernetes configs</li>
<li><strong>Transfers knowledge</strong> to your team as they work</li>
</ul>
<p>The key difference from traditional consulting? You&rsquo;re not paying for slide decks. You&rsquo;re paying for hands-on implementation.</p>
<h2 id="when-fractional-makes-sense">When Fractional Makes Sense</h2>
<hr>
<p>Fractional DevOps is ideal when:</p>
<ul>
<li>You need <strong>senior expertise</strong> but not full-time capacity</li>
<li>Your infrastructure needs are <strong>episodic</strong> — big pushes followed by maintenance</li>
<li>You want to <strong>build internal capability</strong> while getting external help</li>
<li>You&rsquo;re <strong>preparing for SOC2</strong> or a security audit</li>
<li>Your team is <strong>too small</strong> to justify a dedicated DevOps hire</li>
</ul>
<h2 id="when-you-should-hire-instead">When You Should Hire Instead</h2>
<hr>
<p>Fractional DevOps isn&rsquo;t right for everyone. Consider hiring full-time when:</p>
<ul>
<li>You have <strong>constant, high-volume</strong> infrastructure work</li>
<li>You need someone <strong>on-call 24/7</strong> for incident response</li>
<li>Your infrastructure is <strong>business-critical differentiator</strong></li>
<li>You&rsquo;ve grown past <strong>50+ engineers</strong> and need dedicated support</li>
</ul>
<h2 id="the-numbers">The Numbers</h2>
<hr>
<p>Let&rsquo;s compare the real costs:</p>
<table>
	<thead>
			<tr>
					<th>Option</th>
					<th>Annual Cost</th>
					<th>What You Get</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Senior DevOps Hire</td>
					<td>€80-120K + benefits</td>
					<td>Full-time, single perspective</td>
			</tr>
			<tr>
					<td>Junior DevOps Hire</td>
					<td>€45-60K + benefits</td>
					<td>Full-time, learning curve</td>
			</tr>
			<tr>
					<td>Fractional DevOps</td>
					<td>€48-72K</td>
					<td>Senior expertise, 15-20hrs/month</td>
			</tr>
			<tr>
					<td>DevOps Agency</td>
					<td>€100-200K</td>
					<td>Team, but often junior execution</td>
			</tr>
	</tbody>
</table>
<p>Fractional DevOps gives you <strong>senior expertise at junior prices</strong> — without the management overhead.</p>
<h2 id="how-to-start">How to Start</h2>
<hr>
<p>If you&rsquo;re not sure whether your infrastructure needs a full-time hire or fractional support, start with an assessment.</p>
<p>A good infrastructure audit will tell you:</p>
<ul>
<li>Where your biggest risks are</li>
<li>What needs immediate attention</li>
<li>What can wait</li>
<li>Whether you need ongoing support or a one-time sprint</li>
</ul>
<p><strong>We offer free infrastructure audits for startups.</strong> No commitment, no pitch deck — just a clear picture of where you stand.</p>
<p><a href="https://www.gruion.com/#contact">Book a free infrastructure audit</a> and we&rsquo;ll help you figure out the right approach for your stage.</p>
]]></content:encoded><enclosure url="https://www.gruion.com/blog/post/1/images/picture.png" type="image/jpeg" length="0"/><media:content url="https://www.gruion.com/blog/post/1/images/picture.png" medium="image" type="image/jpeg"/><media:thumbnail url="https://www.gruion.com/blog/post/1/images/picture.png"/></item><item><title>5 Signs Your CI/CD Pipeline Needs Professional Help</title><link>https://www.gruion.com/blog/post/2/</link><pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate><dc:creator>Gruion</dc:creator><guid>https://www.gruion.com/blog/post/2/</guid><description>Deployments shouldn't feel like defusing a bomb. &lt;br />Here are 5 warning signs that your CI/CD pipeline needs expert attention.</description><content:encoded><![CDATA[<h2 id="the-friday-deployment-fear">The Friday Deployment Fear</h2>
<hr>
<p>It&rsquo;s 4 PM on Friday. Your team just merged a critical bug fix. But nobody wants to deploy it.</p>
<p>Why? Because your CI/CD pipeline is unpredictable. Sometimes it works. Sometimes it doesn&rsquo;t. And nobody wants to spend their weekend debugging a failed deployment.</p>
<p>If this sounds familiar, your CI/CD pipeline needs help. Here are 5 signs it&rsquo;s time to bring in an expert.</p>
<h2 id="1-deployments-take-more-than-30-minutes">1. Deployments Take More Than 30 Minutes</h2>
<hr>
<p>A healthy CI/CD pipeline should deploy in <strong>under 15 minutes</strong>. If your deployments regularly take 30+ minutes, something is wrong.</p>
<p>Common culprits:</p>
<ul>
<li><strong>No caching</strong> — rebuilding dependencies from scratch every time</li>
<li><strong>Sequential steps</strong> that could run in parallel</li>
<li><strong>Oversized Docker images</strong> — downloading gigabytes on every deploy</li>
<li><strong>Flaky tests</strong> that need multiple retries</li>
</ul>
<p>Every minute of deployment time is a minute your team isn&rsquo;t shipping features.</p>
<h2 id="2-works-on-my-machine-is-still-a-thing">2. &ldquo;Works on My Machine&rdquo; Is Still a Thing</h2>
<hr>
<p>Your CI/CD pipeline should <strong>eliminate environment differences</strong>, not create them.</p>
<p>If developers regularly say &ldquo;but it works on my machine,&rdquo; your pipeline isn&rsquo;t doing its job. The build environment should be:</p>
<ul>
<li><strong>Identical</strong> across all developers</li>
<li><strong>Reproducible</strong> — same inputs, same outputs</li>
<li><strong>Isolated</strong> — no leftover state from previous builds</li>
</ul>
<p>Docker and dev containers solve this. If you&rsquo;re not using them, you&rsquo;re wasting hours on environment debugging.</p>
<h2 id="3-you-have-manual-steps-in-your-deployment">3. You Have Manual Steps in Your Deployment</h2>
<hr>
<p>Every manual step is a potential failure point. If your deployment process includes:</p>
<ul>
<li>SSH into a server and run a script</li>
<li>Manually update a config file</li>
<li>Click a button in the AWS console</li>
<li>&ldquo;Remember to also update the database&rdquo;</li>
</ul>
<p>&hellip;then you don&rsquo;t have CI/CD. You have <strong>CI with manual D</strong>.</p>
<p>True continuous deployment means <strong>code goes from merge to production without human intervention</strong>. Every manual step adds risk and slows you down.</p>
<h2 id="4-you-dont-have-a-rollback-strategy">4. You Don&rsquo;t Have a Rollback Strategy</h2>
<hr>
<p>Deployments will fail. The question is: how fast can you recover?</p>
<p>If your answer involves:</p>
<ul>
<li>&ldquo;We&rsquo;ll just revert the commit and redeploy&rdquo;</li>
<li>&ldquo;Someone will SSH in and fix it&rdquo;</li>
<li>&ldquo;We&rsquo;ll restore from last night&rsquo;s backup&rdquo;</li>
</ul>
<p>&hellip;you don&rsquo;t have a rollback strategy. You have a <strong>hope strategy</strong>.</p>
<p>A proper rollback should:</p>
<ul>
<li><strong>Take under 5 minutes</strong></li>
<li><strong>Be automated</strong> — one command or button</li>
<li><strong>Preserve data</strong> — no lost transactions</li>
<li><strong>Be tested regularly</strong> — not just in theory</li>
</ul>
<h2 id="5-nobody-understands-how-it-works">5. Nobody Understands How It Works</h2>
<hr>
<p>This is the most dangerous sign. If only one person understands your CI/CD pipeline, you have a <strong>bus factor of one</strong>.</p>
<p>Warning signs:</p>
<ul>
<li>The pipeline is a single 500-line YAML file</li>
<li>There&rsquo;s no documentation</li>
<li>Changes require &ldquo;the DevOps person&rdquo;</li>
<li>Nobody dares touch it</li>
</ul>
<p>A healthy CI/CD pipeline should be:</p>
<ul>
<li><strong>Documented</strong> — what each step does and why</li>
<li><strong>Modular</strong> — reusable components, not copy-paste</li>
<li><strong>Maintainable</strong> — anyone on the team can make changes</li>
<li><strong>Visible</strong> — clear logs and error messages</li>
</ul>
<h2 id="the-fix-a-devops-sprint">The Fix: A DevOps Sprint</h2>
<hr>
<p>If you recognize 2 or more of these signs, your CI/CD pipeline needs a focused intervention — not a band-aid.</p>
<p>A <strong>DevOps Sprint</strong> is a 2-4 week engagement where we:</p>
<ul>
<li>Audit your current pipeline</li>
<li>Design a new architecture</li>
<li>Implement the changes</li>
<li>Document everything</li>
<li>Train your team</li>
</ul>
<p>The result? A CI/CD pipeline that:</p>
<ul>
<li>Deploys in under 15 minutes</li>
<li>Works the same everywhere</li>
<li>Requires zero manual steps</li>
<li>Has automated rollback</li>
<li>Is documented and maintainable</li>
</ul>
<p><strong>Want to know how bad your pipeline really is?</strong> <a href="https://www.gruion.com/#contact">Book a free infrastructure audit</a> and we&rsquo;ll tell you exactly what needs fixing — and what it&rsquo;ll take to fix it.</p>
]]></content:encoded><enclosure url="https://www.gruion.com/blog/post/2/images/picture.png" type="image/jpeg" length="0"/><media:content url="https://www.gruion.com/blog/post/2/images/picture.png" medium="image" type="image/jpeg"/><media:thumbnail url="https://www.gruion.com/blog/post/2/images/picture.png"/></item><item><title>Developer Onboarding: From 3 Days to 3 Hours</title><link>https://www.gruion.com/blog/post/5/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate><dc:creator>Gruion</dc:creator><guid>https://www.gruion.com/blog/post/5/</guid><description>New hires shouldn't spend their first week fighting their dev environment. &lt;br />Here's how to fix developer onboarding once and for all.</description><content:encoded><![CDATA[<h2 id="the-onboarding-tax">The Onboarding Tax</h2>
<hr>
<p>It&rsquo;s Monday morning. Your new senior developer just started. They&rsquo;re excited, motivated, ready to contribute.</p>
<p>By Wednesday, they&rsquo;re frustrated. They still can&rsquo;t run the app locally.</p>
<p><strong>The onboarding doc is 47 pages long</strong>. Half of it is outdated. The database setup fails with a cryptic error. Someone mentions &ldquo;oh yeah, you also need to install this other thing&rdquo; that isn&rsquo;t documented.</p>
<p>Sound familiar? This is the <strong>onboarding tax</strong> — and it costs more than you think.</p>
<h2 id="the-real-cost-of-bad-onboarding">The Real Cost of Bad Onboarding</h2>
<hr>
<p>Let&rsquo;s do the math for a senior developer earning €80,000/year:</p>
<ul>
<li><strong>3 days</strong> of onboarding = €1,000 in salary</li>
<li><strong>Plus</strong> the senior developer helping them = another €500</li>
<li><strong>Plus</strong> the frustration and bad first impression = priceless</li>
</ul>
<p>Now multiply by every new hire. And every time someone switches teams. And every time someone returns from vacation and forgets how things work.</p>
<p><strong>A startup hiring 10 developers per year loses €15,000+ just on dev environment setup.</strong></p>
<p>But the real cost is harder to measure: <strong>the signal it sends about your engineering culture</strong>.</p>
<h2 id="why-onboarding-is-broken">Why Onboarding Is Broken</h2>
<hr>
<p>Most dev environment issues come from the same root causes:</p>
<h3 id="1-works-on-my-machine-dependencies">1. &ldquo;Works on My Machine&rdquo; Dependencies</h3>
<ul>
<li>Different Node versions</li>
<li>Different Python versions</li>
<li>Missing system libraries</li>
<li>Conflicting database versions</li>
<li>That one developer on Windows</li>
</ul>
<h3 id="2-tribal-knowledge">2. Tribal Knowledge</h3>
<ul>
<li>&ldquo;Oh, you need to run this script first&rdquo;</li>
<li>&ldquo;Ask John, he knows how to set up the VPN&rdquo;</li>
<li>&ldquo;The README is outdated, ignore step 3&rdquo;</li>
<li>&ldquo;You need access to this secret Notion page&rdquo;</li>
</ul>
<h3 id="3-accumulated-cruft">3. Accumulated Cruft</h3>
<ul>
<li>Services added but never documented</li>
<li>Environment variables that nobody remembers</li>
<li>That one script from 2019 that still needs to run</li>
</ul>
<h2 id="the-solution-containerized-dev-environments">The Solution: Containerized Dev Environments</h2>
<hr>
<p>The fix is simpler than you think: <strong>make the dev environment reproducible and automatic</strong>.</p>
<h3 id="docker-compose-for-local-development">Docker Compose for Local Development</h3>
<p>Instead of documenting how to install PostgreSQL, Redis, and Elasticsearch:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#75715e"># docker-compose.yml</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">services</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">postgres</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">image</span>: <span style="color:#ae81ff">postgres:15</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">environment</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">POSTGRES_DB</span>: <span style="color:#ae81ff">myapp</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">POSTGRES_PASSWORD</span>: <span style="color:#ae81ff">localdev</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;5432:5432&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">redis</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">image</span>: <span style="color:#ae81ff">redis:7</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;6379:6379&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">app</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">build</span>: <span style="color:#ae81ff">.</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">depends_on</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">postgres</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">redis</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;3000:3000&#34;</span>
</span></span></code></pre></div><p>Now setup is: <code>docker compose up</code>. That&rsquo;s it.</p>
<h3 id="dev-containers-for-full-isolation">Dev Containers for Full Isolation</h3>
<p>Dev Containers go further: <strong>the entire development environment runs in a container</strong>, including your editor extensions and tools.</p>
<p>VS Code and other IDEs support this natively. Your <code>.devcontainer/devcontainer.json</code> defines everything:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;MyApp Dev&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;dockerComposeFile&#34;</span>: <span style="color:#e6db74">&#34;docker-compose.yml&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;service&#34;</span>: <span style="color:#e6db74">&#34;app&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;workspaceFolder&#34;</span>: <span style="color:#e6db74">&#34;/app&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;customizations&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;vscode&#34;</span>: {
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;extensions&#34;</span>: [
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;dbaeumer.vscode-eslint&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;esbenp.prettier-vscode&#34;</span>
</span></span><span style="display:flex;"><span>      ]
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>New developer? They clone the repo, open in VS Code, click &ldquo;Reopen in Container&rdquo;, and <strong>everything just works</strong>.</p>
<h2 id="the-ideal-onboarding-flow">The Ideal Onboarding Flow</h2>
<hr>
<p>Here&rsquo;s what onboarding should look like:</p>
<table>
	<thead>
			<tr>
					<th>Step</th>
					<th>Time</th>
					<th>What Happens</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>5 min</td>
					<td>Clone the repo</td>
			</tr>
			<tr>
					<td>2</td>
					<td>10 min</td>
					<td>Open in VS Code, click &ldquo;Reopen in Container&rdquo;</td>
			</tr>
			<tr>
					<td>3</td>
					<td>15 min</td>
					<td>Wait for container to build (first time only)</td>
			</tr>
			<tr>
					<td>4</td>
					<td>5 min</td>
					<td>Run <code>npm start</code> or equivalent</td>
			</tr>
			<tr>
					<td>5</td>
					<td>Done</td>
					<td>App is running locally</td>
			</tr>
	</tbody>
</table>
<p><strong>Total time: under 1 hour.</strong> No documentation reading. No &ldquo;ask John&rdquo;. No mystery errors.</p>
<h2 id="what-you-need-to-build-this">What You Need to Build This</h2>
<hr>
<p>To get from 3-day onboarding to 3-hour onboarding, you need:</p>
<h3 id="1-containerized-services">1. Containerized Services</h3>
<p>All dependencies (databases, caches, queues) run in Docker. No local installation required.</p>
<h3 id="2-seed-data-automation">2. Seed Data Automation</h3>
<p>One command to populate the database with realistic test data:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>make seed
</span></span><span style="display:flex;"><span><span style="color:#75715e"># or</span>
</span></span><span style="display:flex;"><span>npm run db:seed
</span></span></code></pre></div><h3 id="3-environment-variable-management">3. Environment Variable Management</h3>
<p>A <code>.env.example</code> file with sensible defaults. Or better: <strong>secrets automatically injected</strong> for development.</p>
<h3 id="4-documentation-that-cant-rot">4. Documentation That Can&rsquo;t Rot</h3>
<p>The best documentation is code. If setup requires running commands, put them in a Makefile or script:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>make setup   <span style="color:#75715e"># Does everything</span>
</span></span><span style="display:flex;"><span>make test    <span style="color:#75715e"># Runs tests</span>
</span></span><span style="display:flex;"><span>make start   <span style="color:#75715e"># Starts the app</span>
</span></span></code></pre></div><h3 id="5-ci-that-validates-setup">5. CI That Validates Setup</h3>
<p>Your CI pipeline should <strong>test that the dev environment works</strong>. If someone breaks the setup, the build fails.</p>
<h2 id="the-investment">The Investment</h2>
<hr>
<p>Building this takes time upfront:</p>
<ul>
<li><strong>2-3 days</strong> to create Docker Compose setup</li>
<li><strong>1-2 days</strong> to add dev container support</li>
<li><strong>1 day</strong> to automate seed data</li>
<li><strong>1 day</strong> to clean up documentation</li>
</ul>
<p><strong>Total: about 1 week of work.</strong></p>
<p>For a team that will hire 10+ developers over the next year, this pays for itself almost immediately.</p>
<h2 id="get-help-setting-it-up">Get Help Setting It Up</h2>
<hr>
<p>Don&rsquo;t have time to build this yourself? Don&rsquo;t want to learn Docker Compose intricacies?</p>
<p>We offer a dedicated <strong>Developer Environment Setup</strong> service:</p>
<ul>
<li>Docker Compose configuration for all services</li>
<li>Dev container setup for VS Code</li>
<li>Seed data automation</li>
<li>Documentation cleanup</li>
<li>CI validation</li>
</ul>
<p><strong>Result: new developers productive in hours, not days.</strong></p>
<p><a href="https://www.gruion.com/#contact">Book a free infrastructure audit</a> and we&rsquo;ll assess your current onboarding process — and show you exactly how to fix it.</p>
]]></content:encoded><enclosure url="https://www.gruion.com/blog/post/5/images/picture.png" type="image/jpeg" length="0"/><media:content url="https://www.gruion.com/blog/post/5/images/picture.png" medium="image" type="image/jpeg"/><media:thumbnail url="https://www.gruion.com/blog/post/5/images/picture.png"/></item></channel></rss>